Syntax 使用Coq等式定义

Syntax 使用Coq等式定义,syntax,coq,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 . 当我尝试应用或重写reglang\u eq时,我得到一个错误。如果我理解正确,这应该只是因为我不知道正确的语法,但我越来越沮丧

我有一个平等的定义:

Definition reglang_eq :=
  forall (A : Set)
  (r1 r2 : RegularLanguage A),
  (forall xs : List A,
    EvalInRegLang A r1 xs <-> EvalInRegLang A r2 xs)
  -> r1 = r2
.
当我尝试应用或重写
reglang\u eq
时,我得到一个错误。如果我理解正确,这应该只是因为我不知道正确的语法,但我越来越沮丧,因为我无法找到我能理解的文档。(尽管有多少个月我一直在跌跌撞撞地证明关于正规语言的东西。)


感谢您的帮助。

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

  • 当你写下reglang_eq时,你定义了一个命题,但没有给出任何证明。您要做的是将:=替换为冒号(:),这样就可以进入证明模式并证明您的声明。一旦你这样做并完成你的证明,你就可以应用它了。但是如果你尝试这样做,你会碰到第二个问题

  • 在Coq中,构造函数总是不相交的。这意味着,只有当r=EmptyStr A(假设后者也是一个构造函数)时,您的方程才能为真。这里您可能希望为常规语言定义一种不同的表示形式,以便连接和空语言成为定义的操作(即逻辑中定义的函数)


  • 谢谢,很抱歉回复晚了。因此,如果我理解正确,我不能说
    EvalInRegLang A r1 xs EvalInRegLang A r2 xs
    意味着
    r1=r2
    ,因为Coq不会接受它<代码>=只能用于构造性相等。在这种情况下,我想我的问题是,是否有某种方法可以证明集合相等?因为集合不需要构造成相同的,所以它们必须是相同的。(我猜?)这应该是一个新问题吗?@user2063685这取决于你所说的“Set”是什么意思。我认为这很有趣,值得提出自己的问题,我很乐意回答:)
    Concat A (EmptyStr A) r = Concat A r (EmptyStr A)
    (* note: Concat is a RegularLanguage constructor *)