使用Coq Equality Definition

时间:2015-04-24 00:12:09

标签: syntax coq

我有一个相等的定义:

Definition reglang_eq :=
  forall (A : Set)
  (r1 r2 : RegularLanguage A),
  (forall xs : List A,
    EvalInRegLang A r1 xs <-> EvalInRegLang A r2 xs)
  -> r1 = r2
.

和一个子目标:

Concat A (EmptyStr A) r = Concat A r (EmptyStr A)
(* note: Concat is a RegularLanguage constructor *)

当我尝试应用或重写reglang_eq时,我收到错误消息。如果我理解正确,这应该只是因为我不知道正确的语法,但我越来越感到沮丧,因为我无法找到我能理解的文档。 (尽管经过了多长时间我一直在寻找有关RegularLanguages的证据。)

感谢任何帮助,谢谢。

1 个答案:

答案 0 :(得分:2)

如果Concat确实是常规语言构造函数,那么您将无法证明自己的目标。这里有两个问题:

  1. 当你写下reglang_eq时,你定义了一个命题,但没有给出任何证据。你想要做的是用冒号(:)代替:=,这样你就可以进入证明模式并证明你的主张是正确的。完成此操作并完成校对后,您就可以应用它。但如果你试图这样做,你会遇到第二个问题......

  2. 在Coq中,构造函数总是不相交的。这意味着你的等式唯一的方法是当r = EmptyStr A(假设后者也是构造函数)。你可能想要的是为常规语言定义一个不同的表示,以便连接和空语言成为定义的操作(即在逻辑中定义的函数)。