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

时间:2018-01-01 09:00:09

标签: 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) -> 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是?)

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

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

1 个答案:

答案 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.