【发布时间】:2017-10-30 18:43:28
【问题描述】:
我需要一些帮助来计算可以到达目标节点的组合数量。
我找到了寻找不同路径的程序。但最后我需要一些查询
%Edge List (Knowledge Base)
edge(1,2).
edge(1,4).
edge(2,4).
edge(3,6).
edge(3,7).
edge(4,3).
edge(4,5).
edge(5,6).
edge(5,7).
edge(6,5).
edge(7,5).
edge(8,6).
edge(8,7).
%Program
path(X,Y,[X,Y]):- edge(X,Y).
path(X,Y,[X|Xs]):- edge(X,W), path(W,Y,Xs).
-------------------------------------------------
%Query
path(1, 7, P).
%Results
Z = [1, 2, 4, 3, 6, 5, 7];
Z = [1, 2, 4, 3, 6, 5, 6, 5, 7];
.........................
但是如果我想运行一个查询来提供这些路径的数量。
?-path(1, 7, count).
should return 2
【问题讨论】:
-
嗯,你试过什么?
-
我尝试计算递归的步骤。但结果并不如预期 move2(X,Y,N):- N 是 N+1, edge(X,Y)。 move2(X,Y,N):- N 为 N+1, edge(X,Z), move2(Z,Y,N)。
-
N is N+1?这没有任何意义。 -
但在 Prolog 中,您不能将变量接地两次(使用不同的值)。在这种情况下,您需要一个新变量。例如,您可以写
N1 is N+1。 -
您需要编辑您的问题并添加您尝试过的代码,格式正确。注释不是您放置代码的地方。但这就是说,从您的评论来看,您似乎正在尝试计算节点遍历,而不是总路径数。简单的答案是
findall(P, path(1,7,P), Paths), length(Paths, N)。N将是您的答案。
标签: algorithm prolog graph-theory graph-traversal