【问题标题】:What is a good example of a simple proof in Coq where the conclusion has a existential quantifier?什么是 Coq 中一个简单证明的好例子,其中结论有一个存在量词?
【发布时间】:2019-05-22 17:14:54
【问题描述】:

我想看一些关于 Coq 形式证明的例子:

\exists A(x1,...,xn)

本质上,目标有一个存在量词。我在以有意义的方式操纵目标以在我的证明中取得进展时遇到问题,并希望看到一些常见操纵策略的示例。

Coq 中有哪些好的存在量词示例可以证明?


我的具体例子:

Theorem Big_Small_ForwardImpl   :
  forall (P : Program) (S' : State),
    (BigStepR (B_PgmConf P) (B_StateConf S')) -> (ConfigEquivR (S_PgmConf P) (S_BlkConf EmptyBlk S')).
Proof.
  intros.
  induction P.
  unfold ConfigEquivR.
  refine (ex_intro _ _ _) .

我的背景和目标是:

1 subgoal
l : list string
s : Statement
S' : State
H : BigStepR (B_PgmConf (Pgm l s)) (B_StateConf S')
______________________________________(1/1)
exists N : nat, NSmallSteps N (S_PgmConf (Pgm l s)) (S_BlkConf EmptyBlk S')

但后来改为:

1 subgoal
l : list string
s : Statement
S' : State
H : BigStepR (B_PgmConf (Pgm l s)) (B_StateConf S')
______________________________________(1/1)
NSmallSteps ?Goal (S_PgmConf (Pgm l s)) (S_BlkConf EmptyBlk S')

在使用refine (ex_intro _ _ _) 策略之后。由于我不确定发生了什么,我希望一些更简单的示例可以向我展示如何在我的 Coq 目标中操纵存在量词。


有用的评论:

?Goal 是 Coq 引入的,作为一些 N 的占位符,稍后必须在证明中推导。

【问题讨论】:

  • ?Goal 是 Coq 引入的,作为一些 N 的占位符,稍后将在证明中推导出。使用eexists 策略时,您可以看到相同的行为。
  • @JM.Gorius 老实说,我不知道一个人是怎么想出这样一个N 的,我认为首先寻找一个更简单的例子会比我实际的例子更容易工作中...
  • @J-M.Gorius 谢谢!我不知道那是什么意思。
  • 随着证明的进行,Coq 通常可以自动推断出?Goal 的值。您可以继续证明,好像 ?Goal 是一个定义明确的值,让 Coq 在幕后做“脏活”。
  • @J-M.Gorius 也许这就是为什么我需要一个更简单的具体例子来解决这个问题。我现在无法想象我什至可以为目标做些什么......不确定是因为它是一个量词示例还是让我陷入困境......

标签: coq


【解决方案1】:

以下示例基于this answer中提供的代码。

假设我们有一个类型 T 和一个二元关系 R 在类型为 T 的元素上。出于本示例的目的,我们可以将其定义如下。

Variable T : Type.
Variable R : T -> T -> Prop.

让我们证明以下简单的定理。

Theorem test : forall x y, R x y -> exists t, R x t.

这是一个可能的解决方案。

Proof.
  intros. exists y. apply H.
Qed.

我们可以依靠 Coq 强大的自动证明机制来自动推断出哪个变量满足 R x t,而不是明确指定 y 是我们正在寻找的元素:

Proof.
  intros.
  eexists. (* Introduce a temporary placeholder of the form ?t *)
  apply H. (* Coq can deduce from the hypothesis H that ?t must be y *)
Qed.

存在许多使用相同自动推理机制的策略,例如eexistseapplyeauto 等。

请注意,它们的名称通常对应于以e 为前缀的常用策略。

【讨论】:

  • 你怎么知道使用eexists而不是其他eTACTIC
  • 使用eexists的原因可能如下:“我知道我必须证明存在存在一些t满足R x t,但它可能指定它很麻烦。我会让 Coq 引入一个临时存在变量并让它完成工作。本质上,我知道这样的t 必须存在,但我不费心明确指定它。我专门使用eexists,因为我想做的是证明t存在
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-30
  • 1970-01-01
  • 2013-10-03
  • 2016-11-11
  • 1970-01-01
  • 2020-08-29
  • 1970-01-01
相关资源
最近更新 更多