循环图中作为二维数组的路径列表

时间:2019-11-11 17:35:23

标签: graph prolog

我在此序言问题上遇到了一些困难,如果有人提出任何建议,将不胜感激。我在下面提供了知识库的精简版-简而言之,这是一个问题,涉及通过航班连接的城市(节点)列表。

我正在尝试定义一个谓词,该谓词将给出一个航班列表(由1个中间城市连接),并且已经成功定义了一个谓词,该谓词给出了一个单行旅程

我遇到的问题是从查询中获得成功的输出-我正在使用 trip 谓词,并与 visited 数组和不是谓词,我能够获得独特的飞行并避免无限循环。

但是,由于某种原因,我似乎无法找到一种方法来获取所有可能飞行的二维数组的输出(避免循环)。

下面的知识库概述了城市之间的航班(不考虑最后4个参数-与航班提供商,距离和价格有关)。

light(london,dublin,aerlingus,500,45,150).
flight(rome,london,ba,1500,150,400).
flight(rome,paris,airfrance,1200,120,500). 
flight(paris,dublin,airfrance,600,60,200).
flight(paris,amsterdam,airfrance,400,30,100).
flight(dublin,newyork,aerlingus,4500,360,800).
flight(dublin,cork,ryanair,300,50,50).
flight(dublin,rome,ryanair,2000,150,70).
flight(dublin,amsterdam,ryanair,1000,90,60).
flight(moscow,hongkong,aerflot,5500,420,500).
flight(newyork,chicago,aa,3000,240,430).
flight(paris,rome,airfrance,1200,120,500). 
flight(dublin,paris,airfrance,600,60,200).
flight(amsterdam,paris,airfrance,400,30,100).
flight(amsterdam,dublin,ryanair,1000,90,60).

我定义了以下谓词:

is_between 将输出位于图表上其他两个城市之间的城市。

行程输出与a-> b中的飞行路径相对应的数组 例如:

trip(dublin,paris,R).

R= [dublin,rome,paris],
R= [dublin,amsterdam,paris]
is_between(A, B, C):-
    flight(A,B,_,_,_,_),
    flight(B,C,_,_,_,_).

trip(A, B,[A, X, B]):-
    is_between(A, X, B).

我遇到的问题是我的all_trip谓词不起作用:

% all_trip(rome,dublin,T). --> [ [rome,london,dublin], [rome,paris,dublin] ]

all_trip(A,B,R):-
    no_cycle_trip(A,B,[],R).


no_cycle_trip(A,B,Visited,[H|T]):-
    trip(A,B,H), % eg H=[dublin, rome, paris]
    not(member(H,Visited)),
    % Add H to NewVisited
    append([H], Visited, NewVisited), 
    no_cycle_trip(A,B,NewVisited,T).

all_trip输出false,但是当我检查调试器时,我可以看到Visited得以正确更新,并且在最后一次迭代之前,它具有正确的答案,但结果无法访问该答案。

任何建议将不胜感激。

0 个答案:

没有答案