gpt4 book ai didi

duplicates - 如何防止序言中的重复

转载 作者:行者123 更新时间:2023-12-02 05:06:22 24 4
gpt4 key购买 nike

我的多解问题是由于 Prolog 的回溯遍历目标而产生的。虽然我知道,从技术上讲,提供的每个解决方案都是正确的,但对我来说没有用。是否有删除重复项的方法?

到目前为止,这是我的代码:

flight(london, paris).
flight(paris, amsterdam).
flight(amsterdam, rome).
flight(rome, paris).
flight(rome, rio_de_janeiro).
route_from(A,B) :-
flight(A,B).
route_from(A,B) :-
flight(A,R),
route_from(R,B).

示例查询是:

?- route_from(A, paris).
A = london ;
A = rome ;
A = london ;
A = london ;
A = london ;
A = london ;
A = london ;
A = london ;
A = london ;
etc.

问候。

最佳答案

除了返回重复的解决方案之外,您还有一个更大的问题。你的程序将无限循环,因为你的图中有循环。

为避免循环,您可以维护一个访问过的城市列表:

route_from(A,B) :-
route_from(A,B, []).

route_from(A,B, _) :-
flight(A,B).
route_from(A,B, Visited) :-
flight(A,R),
\+ member(A, Visited),
route_from(R,B, [A|Visited]).

现在,如果去一个城市的方式不止一种,这不会阻止返回重复项。您可以使用 setof/3在回溯时得到每一个没有重复的解:

route_from_without_duplicates(A,B):-
setof(t, route_from(A,B), _).

关于duplicates - 如何防止序言中的重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16243081/

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