Prolog加权无向图
Ik一直在努力在Prolog中创建加权无向图 该图由x个谓词表示,如:Prolog加权无向图,prolog,Prolog,Ik一直在努力在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
% 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点的路线,而不必担心重量。您需要更仔细地定义您的问题。如果你有一个有向无环图,你可以说:
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).
而你的道路你已经有了。你可以把支票重新写为
\+ memberchk(X, Visited)
但这是一个细节。另外,在[head | tail]
中,不要在头部、管道符号和尾部之间留空格。在某些实现中,管道可以是析取的同义词,代码>
但是:你的图表现在看起来是定向的。如果要使其成为无向图,最简单(似乎)的方法是将每条边添加两次,每个方向添加一次,例如:
edge(a, b).
edge(b, a).
或者,也许:
edge(A, B) :- connection(A, B).
edge(A, B) :- connection(B, A).
然后,您肯定需要访问的上下文参数,就像您现在所做的那样
到目前为止,这个答案完全忽略了权重。我的问题得到了更好的解释:我需要一个谓词路由(+From,+To,-Path),它为我提供了一个节点序列。因此:route(a,g)给出了答案:route=[a,b,e,g]@Marino1993如果可以的话,可以得到Richard O'Keefe的“Prolog的工艺”。它有一个关于搜索的非常详尽的章节,可能会给你所有你需要的答案。这确实是我的意思:)边缘(1,2)。边缘(1,3)。边缘(2,4)。边缘(3,4)。边缘(4,6)。边缘(4,5)。边缘(2,6)。边缘(5,7)。@Marino1993这应该是问题,而不是这里