尝试用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.
这里可以使用哪些策略来暗示Coq如何从c()
中获取a()
? (一种可能性是,那些公理对于证明是不够的,虽然乍一看它们是。如果MT1不够,可能MT1bis是?)
试图找到合适的策略,比如重写,但它没有用(可能需要更复杂的提示)。找不到更多可以帮助的战术。
(这不是家庭作业,只是一个爱好项目)
答案 0 :(得分:2)
我从MT3
中删除了未使用的变量:
Axiom MT3 :
forall z : MT, z = c(a(z),b(z)) <-> a(z) <> z /\ b(z) <> z.
我们可以使用remember
策略来提取&#34;提取&#34;一个术语来自一个更大的术语(并记住这个连接在一个等式中):
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.