prolog中的增量和回溯

时间:2018-04-19 07:54:21

标签: prolog increment backtracking

我的目的是计算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).

1 个答案:

答案 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