【发布时间】:2018-04-20 01:39:51
【问题描述】:
我的目的是统计 Prolog 中两个节点之间的节点数。例如,在本例中,node1 和 node3 之间有一个节点(node2):
link(node1,node2).
link(node2,node3).
因为我们无法更改已经在 Prolog 中实例化的变量的状态,所以我的第一个直觉是尝试使用类似这样的递归来计数:
nb_nodes_netween(N1,N2,R) :-
link(N1,N2).
nb_nodes_netween(N1,N2,R) :-
link(N1,A),
T is R+1,
nb_nodes_netween(A,N2,T).
我的问题与柜台有关.. 谢谢你
编辑 新版本以 R 变量作为 OUT 值(最终结果)和 T 变量作为 IN 值(一种累加器)。
R = R + 1 但我不知道如何在 Prolog 中翻译它。也许我可以将节点存储在列表中,T 是列表的长度。
nb_nodes_between(N1,N2,R) :-
link(N1,N2).
nb_nodes_between(N1,N2,R) :-
link(N1,A),
R is T+1,% TODO
nb_nodes_netween(A,N2,R).
【问题讨论】:
-
您需要一个“输入”值和一个“输出”值。
-
我觉得应该是nb_nodes_netween(N1,N2,0):-link(N1,N2)。
-
嗯,我真的不明白为什么。我认为我的问题更多是翻译这一步:Result = Result +1
-
R = R + 1在您想为R插入一个具体原子时永远不会为真,R is R + 1也是如此(2 永远不会与 3 相同,等等)。您需要一个新变量S = R +1并将S作为附加参数传递给您的谓词。 -
解决这种情况的一种可能方法是通过
setof/3枚举从 A 到 B 的所有可能路径并计算结果的长度。这仅在路径数量有限的情况下才有效,因此您需要处理图中的循环。 (并且您需要先描述 A 和 B 之间的路径)。
标签: prolog increment backtracking