我想看看以下形式的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的占位符,稍后将在证明中推论得出。
答案 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.
存在许多采用相同的自动演绎机制的策略,例如eexists
,eapply
,eauto
等。
请注意,它们的名称通常对应以e
为前缀的常用策略。