Coq:如何添加有意义的提示?

时间:2013-12-23 14:08:42

标签: coq

我是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”?

1 个答案:

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