我在此序言问题上遇到了一些困难,如果有人提出任何建议,将不胜感激。我在下面提供了知识库的精简版-简而言之,这是一个问题,涉及通过航班连接的城市(节点)列表。
我正在尝试定义一个谓词,该谓词将给出一个航班列表(由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得以正确更新,并且在最后一次迭代之前,它具有正确的答案,但结果无法访问该答案。
任何建议将不胜感激。