为什么这个策略会确切地说'完整的Coq样张?

时间:2017-09-24 03:17:44

标签: coq coq-tactic

在问题Is there a minimal complete set of tactics in Coq?中,答案提到exact足以证明所有目标。有人可以解释一下吗?例如,A,B作为Prop的目标A \/ B -> B \/ A如何仅通过一堆exact来证明?如果您有其他更好的例子,请不要犹豫回答。关键是要对这个问题给出一些解释并给出一个非常重要的例子。

2 个答案:

答案 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理论基础的情况下执行校对。我最喜欢的一套策略是:

  • introsapply(处理普遍量化和暗示);
  • destruct(处理逻辑连接词and(也写成/\or(也写成/和存在量化,在假设中);
  • split在目标的结论中处理and;
  • leftright在目标的结论中处理or
  • exists在结论中处理存在量化,
  • assert建立中间事实(完整性不需要,但它确实有助于你编写更易读的证据),
  • exactassumption当您要证明的内容在上下文中非常明显时。

在推理自然数时,无疑会通过模式匹配和递归来定义函数并推理其行为,因此了解策略changesimpl,{{1 }},casecase_eqinjection最后,当您开始制作足够先进的校样时,您需要自动校样工具,例如discriminatering