Prolog找到航班

时间:2015-12-06 15:31:09

标签: prolog

我在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的连接(逐个)。 XY是两个输入(城市),T是输出。每个解决方案T都是连接XY(包括XY)的所有城市的列表。

示例:

| ?- 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]).

非常感谢任何想法。

干杯,

1 个答案:

答案 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,请问;)