在问题Is there a minimal complete set of tactics in Coq?中,答案提到exact
足以证明所有目标。有人可以解释一下吗?例如,A,B作为Prop的目标A \/ B -> B \/ A
如何仅通过一堆exact
来证明?如果您有其他更好的例子,请不要犹豫回答。关键是要对这个问题给出一些解释并给出一个非常重要的例子。
答案 0 :(得分:6)
回想一下,Coq中的证明只是感应结构的(lambda)微积分中的术语。因此,你的引理被证明为:
Lemma test A B : A \/ B -> B \/ A.
Proof.
exact (fun x => match x with
| or_introl p => or_intror p
| or_intror p => or_introl p
end).
Qed.
几乎与:
相同Definition test' A B : A \/ B -> B \/ A :=
fun x => match x with
| or_introl p => or_intror p
| or_intror p => or_introl p
end.
[他们在“不透明度”方面有所不同,请不要担心,但是Coq 8.8可能会支持Lemma foo := term
语法,更接近exact term
。]
构建校样的更方便的策略是refine
,它允许您指定部分术语:
Lemma test'' A B : A \/ B -> B \/ A.
Proof.
refine (fun x => _).
refine (match x with | or_introl _ => _ | or_intror _ => _ end).
+ refine (or_intror a).
+ refine (or_introl b).
Qed.
事实上,refine
是Coq证明引擎的基本策略; exact T
基本上执行refine T
并检查没有目标仍未打开。
答案 1 :(得分:2)
由于其理论基础,Coq的逻辑并不依赖于策略作为构建证明的原始方式。事实上,你可以使用Coq并构建那些被认为是合法的证据而不使用任何策略来使用这个成语。
Lemma test3 A B : A \/ B -> B \/ A.
Proof
fun x => match x with
or_introl p => or_intror p
| or_introl p => or_introl p
end.
所以问题是"完整的策略"并非完全有意义。
另一方面,已经引入了策略以使工作更容易。因此,了解合理完整的战术非常有用,这样可以在不完全了解Coq理论基础的情况下执行校对。我最喜欢的一套策略是:
intros
,apply
(处理普遍量化和暗示); destruct
(处理逻辑连接词and
(也写成/\
和or
(也写成/
和存在量化,在假设中); split
在目标的结论中处理and
; left
,right
在目标的结论中处理or
。exists
在结论中处理存在量化,assert
建立中间事实(完整性不需要,但它确实有助于你编写更易读的证据),exact
和assumption
当您要证明的内容在上下文中非常明显时。在推理自然数时,无疑会通过模式匹配和递归来定义函数并推理其行为,因此了解策略change
,simpl
,{{1 }},case
,case_eq
和injection
最后,当您开始制作足够先进的校样时,您需要自动校样工具,例如discriminate
和ring