gpt4 book ai didi

prolog - 路由进入无限循环序言

转载 作者:行者123 更新时间:2023-12-05 04:16:11 26 4
gpt4 key购买 nike

刚开始做prolog,练习一下route question

train(a,b).
train(b,a).
train(b,c).
train(c,b).

route(X,Y,[]) :-
train(X,Y)
; train(Y,X).
route(X,Y,[H|T]) :-
route(X,H,[]),
route(H,Y,T).

通过这条路线/3 第一条规则给两个直接相连的地方一个空集说明有一条路线。第二条规则规定了从一个地方到另一个地方有中间地点的情况。但是当我查询这个时,我得到了一条循环路线。

有人说有一个辅助谓词 visited_route/4 来跟踪已经访问过的地方,但不知道这种方式是如何工作的。提示或示例会有所帮助。

最佳答案

您当前解决方案的问题是 Prolog 求解器会生成无限轨迹,例如 [a,b,a,b,a,b,a...],永远不会到达终点。

您可能想要做的是排除 X、Y 或 H 是 T 成员的情况(这可能是 visited_route/4 谓词)。这样,您将永远不会两次通过同一个节点。

编辑

我坐下来稍微更新了我的 Prolog 知识,创建了这样的代码,它似乎有效:

train(a,b).
%train(b,a). Your predicate is symmetric, you don't need to specify both directions
train(b,c).
%train(c,b).
train(c,d).
train(c,e).
train(d,f).
train(e,f).

visited_route(X, Y, [], V) :-
( train(X,Y) ; train(Y,X) ),
not(member(Y, V)).

visited_route(X, Y, [H | T], V) :-
visited_route(X, H, [], [X | V]),
visited_route(H, Y, T, [X | V]).

route(X,Y,R) :-
visited_route(X, Y, R, []).

Visited route 有一个附加列表,其中包含从 X 到 Y(不包括 Y)的路径上访问的所有节点。当求解器在第一个 visited_route 谓词中找到从 X 到 Y 的路径时,它会检查该路径是否没有经过已经访问过的节点,如果是,则丢弃候选路径。

关于prolog - 路由进入无限循环序言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28679420/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com