Prolog加权无向图

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

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,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这应该是问题,而不是这里