绑架序言条款

时间:2018-12-05 21:43:18

标签: graph prolog constraint-programming

我有一个带有标签的节点和边的有向图。该规范描述了哪些节点可以连接到哪些其他节点,以及根据顶点的属性来描述图形结构的各个方面。

例如:

每个A节点都必须连接到具有边线类型B的B节点,该边沿类型B可以通过任何边线类型连接到D节点,并且根节点必须具有到至少2个其他节点的路径。

followsSpec(Root) :- 
    edge(Root, _, A), 
    edge(Root, _, B), 
    A != B, 
    edge(A, edgeTypeB, C), 
    node(C, nodeTypeC), 
    edge(C, _, D),
    node(D, nodeTypeD).

我想说

node(root, typeA)
followsSpec(root)

并推论使followsSpec为真的图的其他可能元素:

node(b, typeB)
node(c, typeC)
edge(root, some_arbitrary_edge_type, b)
edge(root, some_other_arbitrary_edge_type, c)
edge(b, edge_type_b, c)

在Prolog中有没有办法做到这一点?

我特别担心效率,因为实际上规范比较复杂,并且至少会有100个节点。

编辑:尝试形式化: 可谓词为edge/3(其中三个变量对应于转换的源,目标和类型)和node/2(其中两个变量对应于节点标识符和节点标签)。
我从一个单一的事实node(root, rootLabel))开始。 我的观察:followSpec(root),其中

followsSpec(X) :- "x is connected in a particular way to other nodes through edges"

我想观察的是:其他那些节点和边是什么,以便followSpec(root)为真。

1 个答案:

答案 0 :(得分:2)

您可以使用假设推理来找到归纳解。假设您有一个理论T,并且想为某些观察O寻找解释E:

 T, E |- O

假设的推理有一个特殊的运算符,称为嵌入式蕴涵(assumez)。您可以使用这种含义来验证绑架方案,将绑架转化为推论:

 T |- assumez(E, O).

假设z / 2的简单实现是:

assumez(E,O) :-
   assertz(E),
   O,
   retract(E).

但是,以上内容无法幸免于难,因此您需要一个Prolog系统,该系统的尾数为assertz / 1,后退为/ 1。如果您不想使用CHR或ASP,则可以使用Jekejeke Prolog中更简单的库(最小/ hypo)。