在结论中存在存在量词的Coq中,简单证明的一个好例子是什么?

时间:2018-12-22 18:17:42

标签: coq

我想看看以下形式的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目标中操纵存在量词。


有用的评论:

  

?目标由Coq引入,作为占位符N的占位符,稍后将在证明中推论得出。

1 个答案:

答案 0 :(得分: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强大的自动证明机制来自动推断出哪个变量满足y的需求,而不是明确指定R x t是我们要寻找的元素:

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为前缀的常用策略。