在coq中声明一个颜色很好的有向图

时间:2014-11-12 17:57:23

标签: coq

我想在coq中声明一个结构,它代表一个颜色很好的有向图。如果我没有条件,我宣布了一个被coq接受的注册。但是我尝试了很多方法在coq中编写条件wellColored而没有退出。每次我收到新的错误消息:

The condition wellColored is the following: 

for every pair of vertices $v1$, $v2$ and every edge $e$, if the source of $e$ is $v1$,
the target of $e$ is $v2$ and the color of $v1$ is $a$ then there is a color $b$ such that $b$ is different from $a$ and the color of $v2$ is $b$. 

我的尝试写在下面。条件wellColored中的错误是什么,正确的定义是什么?

Record dirgraph:={  
V:Set;  
E:Set;  
s:E->V; (* source function *)  
t:E->V; (* target function *)  
l:V->nat;  
wellColored: forall (v1:V) (v2:V) (e:E) (a:nat),   
In V v1 /\ In V v2 /\ In E e /\ s e v1 /\ t e v2 /\ l v1 a-> (exists b, b<>a /\ l v2 b)  
}.

目前我对使用图形形式化的包不感兴趣。我的主要兴趣是了解如何定义结构并证明它们的相关信息。因此除了正确的条件外,我想精确地定义图形。

1 个答案:

答案 0 :(得分:1)

您的定义存在的问题是,您在wellColored上施加的某些条件不需要在Coq的形式主义中表达,或者根本无法表达:

  1. 我认为In V v1表示v1应该是V的成员。 Coq(以及大多数类型理论)在这方面与通常的集合理论非常不同,因为断言对象具有某种类型作为命题是不合理的 - 类型在Coq中(包括Set类型的内容,如定义中的V就像集合论中的集合一样。相反,理论中的每个对象都有其自己的类型,而且这种类型不能改变。当您撰写forall (v1 : V), ...时,已假定v1V的成员。

    如果你想说某些T类型的对象有一些特殊属性,并非所有类型的对象都有(例如,某些数字n是素数),你可以用该类型的谓词(即类型T -> Prop),作为&#34;子集&#34; T,如你在集理论中所做的那样。

  2. 您将stl定义为一个参数的函数,但将它们用作双参数函数,如s e v1中所示。我想你想说v1 = s e之类的内容,即v1是边e的来源。但是,没有必要这样说:s e是类似V的表达式,可以直接使用,无需声明其他变量(见下文)。同样,您不需要说存在与b不同的颜色a:您可以直接引用该节点的颜色。

  3. 这是您的类型的一个版本,可以避免这些问题:

    Record dirgraph:={
      V:Set;
      E:Set;
      s:E->V; (* source function *)
      t:E->V; (* target function *)
      color: V->nat;
      wellColored:
        forall e : E, color (s e) <> color (t e)
    }.