gpt4 book ai didi

coq - 如何在 coq 中明确使用归纳原理?

转载 作者:行者123 更新时间:2023-12-04 10:08:52 25 4
gpt4 key购买 nike

我试图用 Coq 中明确的归纳原理证明命题同一性的对称性,但不能像我在 agda 中那样用归纳原理来做到这一点。我不知道如何在 Coq 中本地声明变量,也不知道如何展开定义,如下所示。我怎样才能得到一个类似于下面的 agda 的证明?

Inductive Id (A : Type) (x : A) : A -> Type :=
| refl : Id A x x.

(* trivial with induction *)
Theorem symId {A} {x y} : Id A x y -> Id A y x.
Proof.
intros.
induction H.
apply refl.
Qed.

Check Id_ind.
(* Id_ind *)
(* : forall (A : Type) (x : A) (P : forall a : A, Id A x a -> Prop), *)
(* P x (refl A x) -> forall (y : A) (i : Id A x y), P y i *)

Theorem D {A} (x y : A) : Id A x y -> Prop.
Proof.
intros.
apply (Id A y x).
Qed.

Theorem d {A} (x : A) : D x x (refl A x).
Proof.
apply refl.
Admitted.

这失败了,我如何展开 D 以便我可以断言反身性?
Theorem symId' {A} {x y} : Id A x y -> Id A y x.
Proof.
intros.

我如何适用于正确的论点?我如何通过策略在本地断言 D 和 d(是否有 a where or (let a = b in) tactic ?)
apply (Id_ind A x (forall a : A, Id A x a -> Prop))。

这是我试图模仿的 agda 代码
data I (A : Set) (a : A) : A → Set where
r : I A a a

J2 : {A : Set} → (D : (x y : A) → (I A x y) → Set)
→ (d : (a : A) → (D a a r )) → (x y : A) → (p : I A x y) → D x y p
J2 D d x .x r = d x

refl-I : {A : Set} → (x : A) → I A x x
refl-I x = r

symm-I : {A : Set} → (x y : A) → I A x y → I A y x
symm-I {A} x y p = J2 D d x y p
where
D : (x y : A) → I A x y → Set
D x y p = I A y x
d : (a : A) → D a a r
d a = r

尽管 coq 和 agda J 不相等,但它们可能是可以相互推导的。

最佳答案

Qed. 结束证明使证明不透明。有时这就是你想要的,但如果你想要证明的计算内容,你应该以 Defined. 结束它。反而。

这应该从现在开始工作 D可以展开。

Inductive Id (A : Type) (x : A) : A -> Type :=
| refl : Id A x x.

(* trivial with induction *)
Theorem symId {A} {x y} : Id A x y -> Id A y x.
Proof.
intros.
induction H.
apply refl.
Qed.

Check Id_ind.
(* Id_ind *)
(* : forall (A : Type) (x : A) (P : forall a : A, Id A x a -> Prop), *)
(* P x (refl A x) -> forall (y : A) (i : Id A x y), P y i *)

Theorem D {A} (x y : A) : Id A x y -> Prop.
Proof.
intros.
apply (Id A y x).
Defined.

Theorem d {A} (x : A) : D x x (refl A x).
Proof.
apply refl.
Qed.

至于你的其他问题。您可以通过两种方式明确使用归纳法。一是用 Id_rect , Id_recId_ind (这些是在您定义 Id 时自动声明的)。例如,
Definition Id_sym {A: Type} {x y: A}: Id A x y -> Id A y x :=
Id_ind A x (fun y' _ => Id A y' x) (refl A x) y.

(使用一些隐式参数可能会使这更容易阅读)。

最终,这将转换为匹配语句,因此您也可以使用它。
Definition Id_sym' {A: Type} {x y: A} (p: Id A x y): Id A y x :=
match p with
| refl _ _ => refl _ _
end.

要在定义中声明局部变量,可以使用 let var := term in term形式。例如, Id_sym上面可以改写为
Definition Id_sym'' {A: Type} {x y: A}: Id A x y -> Id A y x :=
let P := (fun y' _ => Id A y' x) in
Id_ind A x P (refl A x) y.

关于coq - 如何在 coq 中明确使用归纳原理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61434474/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com