Prolog 序言从句的诱拐

Prolog 序言从句的诱拐,prolog,graph-theory,constraint-programming,Prolog,Graph Theory,Constraint Programming,我有一个有向有根图的规范,有标记的节点和边。该规范描述了哪些节点可以连接到哪些其他节点,以及根据顶点的属性描述了图形结构的各个方面 例如: 每个A节点都必须连接到具有边类型B的B节点,该边类型B通过任何边类型连接到D节点,并且根节点必须具有到至少2个其他节点的路径 followsSpec(Root) :- edge(Root, _, A), edge(Root, _, B), A != B, edge(A, edgeTypeB, C), node

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

例如:

每个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)
并删除使
符合规范
的图形中的其他可能元素:

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
(其中两个变量对应于节点标识符和节点标签)。
我从一个事实
节点(根,根标签)开始
。
我的观察:followspec(root),在哪里

followspec(X):-“X通过边缘以特定方式连接到其他节点”


我想观察的是:其他节点和边是什么,所以followspec(root)是真的。

你可以使用假设推理来找到诱因解。假设你有一个理论T,并且想为一些观察O找到解释E:

 T, E |- O
假设推理有一个特殊的运算符,称为嵌入蕴涵(assumez)。您可以使用以下含义验证诱因解决方案,将诱因转化为演绎:

 T |- assumez(E, O).
assumez/2的一个简单实现是:

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

但是上述内容将无法通过剪切,因此您需要一个跟踪assertz/1和retract/1的Prolog系统。如果您不想使用go或ASP,可以使用Jekejeke Prolog提供的更简单的库(minimal/hypo)。

注释不用于扩展讨论;这段对话已经结束。