Coq:如何在目标中更深入地应用公理?

Coq:如何在目标中更深入地应用公理?,coq,Coq,试图用MT1(或MT1bis)证明MT1A,但Coq未能统一: Require Export Classical_Prop. Require Export Classical_Pred_Type. Variable MT : Type. Parameter NIL : MT. Variables a b e : MT -> MT. Variable c : MT * MT -> MT. Axiom MT1 : forall x y z: MT, z = c(x,y) ->

试图用MT1(或MT1bis)证明MT1A,但Coq未能统一:

Require Export Classical_Prop.
Require Export Classical_Pred_Type.

Variable MT : Type.
Parameter NIL : MT.
Variables a b e : MT -> MT.
Variable c : MT * MT -> MT.

Axiom MT1 :
  forall x y z: MT, z = c(x,y) -> a(z) = x /\ b(z) = y.

Axiom MT1bis :
  forall x y z: MT, z = c(x,y) <-> a(z) = x /\ b(z) = y.

Axiom MT3 :
  forall x y z : MT, z = c(a(z),b(z)) <-> a(z) <> z /\ b(z) <> z.

Definition example := c(NIL, e NIL).

Lemma MT1A :
  forall x: MT, x = a (c(example, b example)) -> x = example /\ a x <> x /\ b x <> x.
Proof.
(*  unfold example. *)
  intros.
  apply MT1. (* ??? *)

Qed.
需要导出经典道具。
需要导出经典\u Pred\u类型。
变量MT:Type。
参数NIL:MT。
变量a b e:MT->MT。
变量c:MT*MT->MT。
Axiom MT1:
对于所有x-y-z:MT,z=c(x,y)->a(z)=x/\b(z)=y。
Axiom MT1bis:
对于所有x y z:MT,z=c(x,y)a(z)=x/\b(z)=y。
Axiom MT3:
对于所有x y z:MT,z=c(a(z),b(z))a(z)z/\b(z)z。
定义示例:=c(NIL,e NIL)。
引理MT1A:
对于所有x:MT,x=a(c(示例,b示例))->x=example/\ax/\bxx。
证明。
(*展开示例。*)
介绍。
应用MT1。(* ??? *)
Qed。
这里可以使用哪些策略来提示Coq如何从
a()
中获取
c()
?(还有一种可能性是,这些公理还不足以证明,尽管乍一看是这样。如果MT1还不够,也许MT1bis不够?)

试图找到合适的策略,比如重写,但没有成功(可能需要更复杂的提示)。找不到更多的战术,这会有所帮助


(这不是家庭作业,只是一个爱好项目)

我从
MT3
中删除了未使用的变量:

Axiom MT3 :
  forall z : MT, z = c(a(z),b(z)) <-> a(z) <> z /\ b(z) <> z.

好的,谢谢!。我有三个新的战术。。。正确使用重写(我添加了
Require-Import-Coq.Setoids.Setoid.
以获得通过)我没有添加任何导入,除了
Require-classic_-Prop.
之外,它对我有效(我使用的是Coq 8.7.1)。我有一个古老的版本:8.4pl4。现在人们可以使用OPAM包管理器来处理现代Coq版本。在准备步骤之后,您可以在终端中键入
opam install coq
,并获得一个工作的coq系统。它们分别代表
x
y
z
MT1
的类型为
对于所有x y z:MT,z=c(x,y)->a(z)=x/\b(z)=y
x
y
z
可以从类型的下一个参数
z=c(x,y)
中推断出
z
,因此三个
。或者,您可以将前三个参数声明为隐式:
arguments MT1[x y z]
(将其放在
MT1
之后),然后您就可以
将证明(mt1f)设置为[F1 F2]。
。另一个选项是在导入后设置隐式参数。
(这是文件的全局设置)。
Lemma MT1A x :
  x = a (c (example, b example)) ->
  x = example /\ a x <> x /\ b x <> x.
Proof.
  unfold example; intros H.
  rewrite <-MT3.
  remember (c (NIL, e NIL)) as f eqn:F.
  pose proof (MT1 _ _ _ F) as [F1 F2].
  remember (c (f, b f)) as g eqn:G.
  pose proof (MT1 _ _ _ G) as [G1 G2].
  split; congruence.
Qed.