我的目的是计算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).
答案 0 :(得分:1)
所以,解决方案非常简单:
nb_nodes_between(N1,N2,R,R) :-
link(N1,N2).
nb_nodes_between(N1,N2,T,O) :-
link(N1,A),
R is T+1,% TODO
nb_nodes_between(A,N2,R,O).
?- nb_nodes_between(node1,node3,0,O).
O = 1
false
我想指出一件事:假设你有这个知识库来代表图表:
link(node1,node2).
link(node2,node3).
link(node3,node4).
link(node4,node2).
尝试查询:
?- b_nodes_between(node1,node2,0,O).
O = 0
O = 3
O = 6
O = 9
O = 12
O = 15
and so on...
使用此解决方案,如果图中有循环,程序也将循环。为了避免循环并只获得一个路径,您必须在代码中添加一个剪切!
,如下所示:
nb_nodes_between(N1,N2,R,R) :-
link(N1,N2),!. %<-- note the cut !
?- nb_nodes_between(node1,node2,0,O).
O = 0