Coq eapply在证明存在功能的同时生成带有问号的目标

时间:2017-01-08 22:48:33

标签: coq

我想证明,对于每个组都存在一个减去函数,该函数接受组的一个元素并返回其负数。

我的Coq代码如下:

ul

最后一个策略产生以下输出:

Record Group:Type := {
G:Set;
plus: G->G->G;
O:G;
assoc: forall x y z:G, plus x (plus y z)=plus (plus x y) z;
neut: forall x:G, plus x O=x /\ plus O x=x;
neg: forall x:G, exists y:G, plus x y=O
}.

Lemma minus_exists(H:Group):exists minus_func:G H->G H, (forall x:G H, plus H x (minus_func(x))=O H).
eapply ex_intro.

我的第一个问题是 H : Group ============================ forall x : G H, plus H x (?12 x) = O H ,我认为这可能是一个糟糕的角色。这是什么意思,是否有办法使其可读。

我的第二个问题是如何完成证明,在第一个问题得到解答后可能会更清楚。

2 个答案:

答案 0 :(得分:5)

在我的Coq版本中,我得到了:

forall x : G H, plus H x (?minus_func x) = O H

略胜一筹。在Coq中,显示?T形式的术语是我们所说的“meta”“存在变量”(evar)。

术语来自逻辑编程和自动定理证明领域,它可以粗略地解释为代表“未知术语”。通常,evars在统一过程中扮演变量的角色。整个Coq证明引擎围绕着这个未知或者evar的概念而建立。

在您的情况下,eapply ex_intro(或eexists)遗漏了证人。 Coq将创建一个新的“evar”来代表缺失的功能,并允许您继续您的证明。但请注意,为了完成证明,您需要稍后提供证人。

如何将evars变为实际条款?用实际术语替换evar的行为称为“instantiation”。在许多情况下,实例化将由统一算法执行。例如,如果我们有一个引理:

Lemma f_plus x : plus H x (f x) = O H

我们可以apply f_plus?minus_func将被f取代。另一种方法是使用instantiate策略,但这些天已经过时了。在我们之前的案例中,您可以编写instantiate (1 := f),然后将?minus_func替换为f。由于技术原因,这种方法不再受到很好的支持,因此在实践中,你必须通过统一来实例化evars或者提供实际的证人战术。

我建议您阅读更多有关统一和逻辑编程的内容。

答案 1 :(得分:2)

?12不是一个糟糕的字符,它是一个eapply策略是一种"应用此引理/假设,但我还没有掌握所有输入,所以请插入孔,我将在稍后填写"

输入eapply ex_intro(或eexists),您只是说"有一个我还不知道的功能,所以请用一个洞替换它,我会稍后提供"。然而,由于你的引理的整个目的是建立这个功能,我不确定你是在正确的道路上。尝试在没有任何efoo策略的情况下证明你的引理,你不需要它们。