我想在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)
}.
目前我对使用图形形式化的包不感兴趣。我的主要兴趣是了解如何定义结构并证明它们的相关信息。因此除了正确的条件外,我想精确地定义图形。
答案 0 :(得分:1)
您的定义存在的问题是,您在wellColored
上施加的某些条件不需要在Coq的形式主义中表达,或者根本无法表达:
我认为In V v1
表示v1
应该是V
的成员。 Coq(以及大多数类型理论)在这方面与通常的集合理论非常不同,因为断言对象具有某种类型作为命题是不合理的 - 类型在Coq中(包括Set
类型的内容,如定义中的V
)不就像集合论中的集合一样。相反,理论中的每个对象都有其自己的类型,而且这种类型不能改变。当您撰写forall (v1 : V), ...
时,已假定v1
是V
的成员。
如果你想说某些T
类型的对象有一些特殊属性,并非所有类型的对象都有(例如,某些数字n
是素数),你可以用该类型的谓词(即类型T -> Prop
),不作为&#34;子集&#34; T
,如你在集理论中所做的那样。
您将s
,t
和l
定义为一个参数的函数,但将它们用作双参数函数,如s e v1
中所示。我想你想说v1 = s e
之类的内容,即v1
是边e
的来源。但是,没有必要这样说:s e
是类似V
的表达式,可以直接使用,无需声明其他变量(见下文)。同样,您不需要说存在与b
不同的颜色a
:您可以直接引用该节点的颜色。
这是您的类型的一个版本,可以避免这些问题:
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)
}.