我一直在努力在Prolog中制作加权无向图。
图表由x个谓词表示,如:
% connection(+Source, +Destination, +Weight).
connection(A,B,2).
connection(A,C,3).
我想要实现的是创建一个谓词,它给出了两个给定点之间的路径(如A点和G点之间的路径)
图表将是这样的:
edge(A,B).
edge(A,C).
edge(B,D).
edge(C,D).
edge(D,F).
edge(D,E).
edge(B,F).
edge(E,G).
谓词必须是这样的:route(+From, +To, -Path)
非常感谢任何帮助!
*编辑
当我使用此代码时:
path(Node, Node, _, [Node]).
path(Start, Finish, Visited, [Start | Path]) :-
verbinding(Start, X,_),
not(member(X, Visited)),
path(X, Finish, [X | Visited], Path).
它给了我想要的结果,但它没有跟随谓词route(+From, +To, -Path)
。我想得到从X点到Y点的路线,而不必担心重量。
答案 0 :(得分:1)
您需要更仔细地定义问题。如果您有定向,非循环图表,您可以说:
path(To, To, [To]).
path(This, To, [This|Rest]) :-
edge(This, Next),
path(Next, To, Rest).
如果您的图表不是非循环,您肯定需要额外的参数。
path(From, To, Path) :-
path_1(From, To, [], Path).
和你的路径_1已经有了。您可以将支票重新编写为
\+ memberchk(X, Visited)
但这是一个细节。另外,请勿在{{1}}中的头部,管道符号和尾部之间留出空格。某些实现中的管道可以是析取的同义词[Head|Tail]
。
但是:您的图表目前正在定向。如果你想让它成为一个无向图,那么最简单的(似乎)就是将每个边加两次,每个方向一次,比如说:
;
或者,也许:
edge(a, b).
edge(b, a).
然后,你当然需要edge(A, B) :- connection(A, B).
edge(A, B) :- connection(B, A).
上下文参数,就像你现在所做的那样。
到目前为止,这个答案完全忽略了权重。