我是Coq的新手,可能完全做错了。在我看来,我需要在编写人类可读的公理/定理和作为提示有用的公理/定理之间做出选择,因为在人类可读的形式中,他们“隐藏”语法太多而且自动策略失败使用它们。我想知道是否有某种方式可以享受两全其美。
我将举一个例子,这个例子有点精心,否则我担心我无法传达我的意思。
作为一项学习练习,我正在努力做小组理论。以下是我的定义:
Variable G: Set.
Variable op: G -> G -> G.
Variable inv: G -> G.
Variable e:G.
Infix "+" := op.
Notation "- x" := (inv x).
Definition identity x := forall a:G, a + x = a /\ x + a = a.
Definition associative_law := forall a b c:G, a + (b + c) = (a + b) + c.
Definition identity_law := identity e.
Definition inverse_law := forall a:G, a + (-a ) = e /\ -a + a = e.
Definition group_laws:= associative_law /\ identity_law /\ inverse_law.
Axiom group_laws_hold: group_laws.
我试图让一切都是人类可读的(至少对我而言)。所以说e是身份的公理被“隐藏”在两层抽象背后:“group_laws”和“identity”。
我也可以直接写出这个公理(好吧,我需要的一半):
Axiom identity_law_holds: forall a:G, a + e = a.
现在,让我们把我们的群体公理作为提示:
Hint Resolve group_laws_hold.
现在我尝试在群体上证明一个简单的陈述 - 身份是唯一的:
Theorem identity_is_unique: forall x:G, identity x -> x = e.
Proof.
intros.
transitivity (op x e).
symmetry.
到目前为止,这么好。现在我目前的目标是“x + e = x”。如果我现在这样做
apply group_laws_hold.
这个目标将会解决。然而,做“自动”什么都不做,可能是因为Coq无法识别“group_laws_hold”与“x + e = x”相关,因为“group_laws_hold”与“x + e”的语法不同= x“。
但是,如果我添加提示
Hint Resolve identity_law_holds.
然后“自动”将起作用。但是,如果我稍微将“identity_law_holds”更改为更普遍(更正确)的内容
Axiom identity_law_holds: forall a:G, a + e = a /\ e + a = a.
然后“自动”将再次失败。
所以我的问题是:有没有办法修改我的代码,以便“auto”可以工作,但提示比我的更通用“Axiom identity_law_holds:forall a:G,a + e = a”?
答案 0 :(得分:2)
eauto
能够进行一些规范化。 eauto
不能做的是归纳,
因为像and_ind
这样的归纳原则的结论是如此普遍
会慢下来eauto
几乎停下来。无论如何,eauto
使用intros
在使用eapply
之前,通常需要先进行归纳
介绍任何东西。
您必须定义自己不那么普遍的预测。
Lemma l1 : group_laws -> identity_law.
Proof. intros [? [? ?]]. eauto. Qed.
Lemma l2 : identity_law -> identity e.
Proof. eauto. Qed.
Lemma l3 : forall x, identity x -> forall a, a + x = a.
Proof. intros. einduction H. eauto. Qed.
Lemma l4 : forall x, identity x -> forall a, x + a = a.
Proof. intros. einduction H. eauto. Qed.
Hint Resolve eq_sym eq_trans group_laws_hold l1 l2 l3 l4.
Theorem identity_is_unique: forall x, identity x -> x = e.
Proof. info_eauto 7. Qed.
但您可以强制eauto
使用and_ind
。
Hint Extern 1 => eapply and_ind.