我想证明,对于每个组都存在一个减去函数,该函数接受组的一个元素并返回其负数。
我的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
,我认为这可能是一个糟糕的角色。这是什么意思,是否有办法使其可读。
我的第二个问题是如何完成证明,在第一个问题得到解答后可能会更清楚。
答案 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
策略的情况下证明你的引理,你不需要它们。