[英]Coq: How to apply axioms deeper in the goal?
試圖用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()
獲得c()
a()
? (還有一種可能是,盡管乍一看,這些公理還不足以作為證明。如果MT1還不夠,也許MT1bis是?)
試圖找到合適的策略,例如重寫,但是它沒有用(也許需要更復雜的提示)。 找不到其他可以提供幫助的戰術。
(這不是家庭作業,只是一個業余項目)
我從MT3
刪除了未使用的變量:
Axiom MT3 :
forall z : MT, z = c(a(z),b(z)) <-> a(z) <> z /\ b(z) <> z.
我們可以使用remember
策略從更大的術語內部“提取”一個術語(並在方程式中記住此連接):
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.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.