Coq中的证明模式定义?

时间:2020-08-27 18:01:09

标签: coq coq-tactic

任何人都可以给我一些有关如何阅读证明模式定义的好资料(给出一个例子:)

Definition A (ss: FSS) (n:nat)
             (s: {s:S | state_is_wf s
                            /\ RESS.get_element n (proj1_sig ss) = Some s})
    : FS.
    destruct s. destruct a.
    refine (exist _ x _).
    apply H.
  Defined.

其中“ FSS”,“ FS”和“ S”是先前定义的信号类型。我知道独特的策略“破坏”,“完善”和“应用”是做什么的,但在证明意义上 一个定义,我可能无法编译就无法阅读该证明(我无法编译这些文件,只能读取其源代码。)有人可以帮助我阅读此类定义,还是可以指向某些源代码?

1 个答案:

答案 0 :(得分:2)

如果不编译定义(并且不查看FSFSS的定义),这是不可能的,但是我们仍然可以猜测。 destruct策略在match with上创建s类型的sig构造,该构造具有唯一的构造函数exist。函数的参数中没有a,因此a是全局符号,或者是由第一个destruct创建的变量。让我们假设是后者。 x也是如此。

策略refine创建了一个可能带有漏洞的术语。术语exist _ x _包含两个孔。第一个_由Coq填充,但最后一个{大概必须由用户填充,因此apply H就是这个目的。对于H,让我们假设它来自先前的destruct之一。

请注意,apply可能首先仅使用一个构造函数分解归纳值。因此,如果H的类型恰好是A /\ B(如果它来自第一个destruct,则实际上是apply Happly (proj1 H)apply (proj2 H)。无论如何,由于证明现已完成,因此此apply可能是exact

因此,有很多可能性。这是一个示例:

Definition A ss n s :=
  match s with
  | exist _ a H =>
    match a with
    | ... x ... =>         (* H could come from there too *)
      exist _ x (proj1 H)  (* or (proj2 H), or plain H *)
    end
  end.