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

如何在coq中明确使用归纳原则?,coq,equality,agda,coq-tactic,homotopy-type-theory,Coq,Equality,Agda,Coq Tactic,Homotopy Type Theory,我试图用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

我试图用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(是否存在where或(让a=b加入)策略?) 应用(Id_inda x(对于所有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结束证明。
使证明不透明。有时这是您想要的,但是如果您想要证明的计算内容,您应该以定义的
结束。

这应该是可行的,因为现在可以展开
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\u rect
Id\u rec
Id\u 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\u 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.