【问题标题】:Coq eapply generates a goal with a question mark while proving existence of a functionCoq eapply 生成带有问号的目标,同时证明函数的存在
【发布时间】:2017-01-08 22:48:32
【问题描述】:

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

我的 Coq 代码如下:

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

我的第一个问题是?12,我认为它可能是一个显示不佳的角色。这是什么意思,有没有办法让它可读。

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

【问题讨论】:

  • 技术信息:我在 Ubuntu 16.04 的终端下运行 coqtop,在华硕 X556-XJ 笔记本电脑上运行。使用 coqide 不会改变所描述的现象。
  • 如果您可以发布单独的问题而不是将您的问题合并为一个问题,则最好。这样,它可以帮助人们回答您的问题,也可以帮助其他人至少寻找您的一个问题。谢谢!
  • 这里我们通常需要的唯一技术信息是 Coq 的版本。但我确实理解,因为您认为?12 是打印错误,所以您提供了有关系统类型的一些详细信息。
  • 您的第二个问题值得单独提出。简短回答:您无法完成证明,您需要将neg : G -> G 及其属性neg_prop: forall x:G, exists y:G, plus x (neg x) = O /\ plus (neg x) x = O; 添加到记录的定义中。
  • @AntonTrunov 或者使用公理。

标签: coq


【解决方案1】:

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

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

稍微好一点。在 Coq 中,以 ?T 形式显示的术语就是我们所说的 “元”“存在变量” (evar)。

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

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

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

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

我们可以将apply f_plus?minus_func 替换为f。另一种方法是使用instantiate 策略,但现在它已经过时了。在我们之前的例子中,你可以写instantiate (1 := f),这将用f替换?minus_func。由于技术原因,这种方法不再得到很好的支持,因此在实践中,您必须通过统一实例化 evas 或提供策略的实际见证。

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

【讨论】:

  • 谢谢,现在说得通了。我怎样才能得到你的输出? (如何获得 ?minus_func 而不是 ?12。)我使用 coqtop -v The Coq Proof Assistant, version 8.4pl4 (November 2015) compiled on Nov 04 2015 12:56:53 with OCaml 4.02.3 检查了我的 coq 版本
  • 我使用的是 Coq 8.6,建议你升级,改进很大。
【解决方案2】:

?12 不是一个显示不好的字符,它是一个漏洞eapply 策略是一种“应用这个引理/假设,但我手头还没有所有的输入,所以请插入空洞,我会稍后补上”。

通过输入eapply ex_intro(或eexists),您只是在说“存在一个我还不知道的功能,所以请用一个孔替换它,我稍后会提供它”。但是,由于您的引理的全部目的是构建此功能,我不确定您是否走在正确的道路上。尝试在没有任何efoo 策略的情况下证明你的引理,你不需要它们。

【讨论】:

  • 作为评论,我不确定您能否使用此组定义做任何事情,您可能需要一个可判定的比较运算符才能测试 G 的任何元素中性元素。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 2022-04-27
  • 2021-09-29
  • 1970-01-01
相关资源
最近更新 更多