我有一个相等的定义:
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的证据。)
感谢任何帮助,谢谢。
答案 0 :(得分:2)
如果Concat确实是常规语言构造函数,那么您将无法证明自己的目标。这里有两个问题:
当你写下reglang_eq时,你定义了一个命题,但没有给出任何证据。你想要做的是用冒号(:)代替:=,这样你就可以进入证明模式并证明你的主张是正确的。完成此操作并完成校对后,您就可以应用它。但如果你试图这样做,你会遇到第二个问题......
在Coq中,构造函数总是不相交的。这意味着你的等式唯一的方法是当r = EmptyStr A(假设后者也是构造函数)。你可能想要的是为常规语言定义一个不同的表示,以便连接和空语言成为定义的操作(即在逻辑中定义的函数)。