我在Prolog中遇到findall/3
的问题。
事实:
%
country(dublin,ireland).
country(cork,ireland).
country(london,uk).
country(rome,italy).
country(moscow,russia).
country(hongkong,china).
country(amsterdam,holland).
country(berlin,germany).
country(paris,france).
country(newyork,usa).
country(chicago,usa).
country(sao_paulo,brazil).
country(rio,brazil).
我需要编写谓词来显示从城市X
到城市Y
的连接(逐个)。 X
和Y
是两个输入(城市),T
是输出。每个解决方案T都是连接X
到Y
(包括X
和Y
)的所有城市的列表。
示例:
| ?- trip(rome,dublin,T).
T=[rome,london,dublin] ;
//first solution T=[rome,paris,dublin];
//second solution
我的尝试是
path(X,Y,[X|Y]):- edge(X,Y).
path(X,Y,[]):- edge(X,Z),not(member(Z,V)),path(Z,Y,[Z|V]).
非常感谢任何想法。
干杯,
答案 0 :(得分:0)
我认为你的问题是:“我怎样才能显示两个国家之间所有可能的旅行?”。如果是这样,我建议你做那样的事情:
trip(X,Y,T) :- X \= Y,
path(X, Y, [X], T).
path(Departure, Arrival, Visited, go(Departure, Arrival)) :- direct(Departure, Arrival) , !.
path(Departure, Arrival, Visited, go(Departure, Intermediate, GO)) :-
direct(Departure, Intermediate),
Intermediate \= Departure,
\+ member(Intermediate,Visited),
path(Intermediate, Arrival, [Intermediate|Visited], GO).
So I also advice you to modify the facts in your knowledge base like:
direct(rome, moskow).
direct(moskow, paris).
direct(paris, chicago).
direct(sau_paolo, rio).
direct(rio, honkong).
and so on.
你所做的事情在逻辑上是不正确的。你怎么知道你是否可以从一个城市到另一个城市旅行,只知道他们在哪里?应该有一些事实说明可能从一个城市到另一个城市旅行,例如:直接(罗马,米兰)(或旅行(罗马,米兰),你选择的算符)。 我希望能帮助你。 如果你有一些dubt,请问;)