我很难理解我的谓词fly(....)
正在输出的内容。当我查阅此文件并询问控制台(SWI-Prolog)flight(city1, city2, A, B)
时,它打印出A=9 B=10
。我正在计算的是A和B的单一值。所以我想用输出来完成我想要完成的任务;飞行计划。但似乎当我在谓词中使用相同的问题(flight(city1, city2, A, B)
)时,它会返回一个列表。在我尝试编写S
和/或E
之前,我没有意识到这一点。我在下面的代码中打印[1,2,3]
因为我很困惑为什么当我只写S
时,而不是之后的任何内容,输出只是列表中的每个值而不是逗号或空格分隔。所以我决定看看如何编写明确定义的列表[1,2,3]
并打印出来。
我收到的输出
8 ?- fly(city1, city4, 0, 24).
14[1,2,3]9[1,2,3]
false.
似乎行write(S), write([1,2,3]),
被调用了两次,为什么会这样?
另外,为什么我在控制台中为A
和B
获取单个值,但在调用时却不在我的谓词中?
逐字典:
% I have no idea what I'm doing.
% Author: Skeeter
% Total of 5 cities
city(city1).
city(city2).
city(city3).
city(city4).
city(city5).
% List of flights
% flight( StartCity, EndCity, DepartureTime, ArrivalTime)
% city1 departures
flight( city1, city2, 09, 10).
flight( city1, city2, 10, 11).
flight( city1, city3, 12, 13).
flight( city1, city4, 14, 15).
flight( city1, city5, 16, 17).
% city2 departures
flight( city2, city1, 09, 10).
flight( city2, city1, 10, 11).
flight( city2, city3, 12, 13).
flight( city2, city4, 14, 15).
flight( city2, city5, 16, 17).
% city3 departures
flight( city3, city1, 09, 10).
flight( city3, city2, 10, 11).
flight( city3, city2, 12, 13).
flight( city3, city4, 14, 15).
flight( city3, city5, 16, 17).
% city4 departures
flight( city4, city1, 09, 10).
flight( city4, city2, 10, 11).
flight( city4, city3, 12, 13).
flight( city4, city3, 14, 15).
flight( city4, city5, 16, 17).
% city5 departures
flight( city5, city1, 09, 10).
flight( city5, city2, 10, 11).
flight( city5, city3, 12, 13).
flight( city5, city4, 14, 15).
flight( city5, city4, 16, 17).
% city1 arrivals
flight( city2, city1, 09, 10).
flight( city2, city1, 10, 11).
flight( city3, city1, 12, 13).
flight( city4, city1, 14, 15).
flight( city5, city1, 16, 17).
% city2 arrivals
flight( city1, city2, 09, 10).
flight( city1, city2, 10, 11).
flight( city3, city2, 12, 13).
flight( city4, city2, 14, 15).
flight( city5, city2, 16, 17).
% city3 arrivals
flight( city1, city3, 09, 10).
flight( city2, city3, 10, 11).
flight( city2, city3, 12, 13).
flight( city4, city3, 14, 15).
flight( city5, city3, 16, 17).
% city4 arrivals
flight( city1, city4, 09, 10).
flight( city2, city4, 10, 11).
flight( city3, city4, 12, 13).
flight( city3, city4, 14, 15).
flight( city5, city4, 16, 17).
% city5 arrivals
flight( city1, city5, 09, 10).
flight( city2, city5, 10, 11).
flight( city3, city5, 12, 13).
flight( city4, city5, 14, 15).
flight( city4, city5, 16, 17).
% is H1 later than X?
isLater(H1, [X|Y]) :-
H1 > X.
fly(CityFrom, CityTo, StartTime, EndTime) :-
flight(CityFrom, CityTo, S, E),
write(S), write([1,2,3]),
isLater(StartTime, S),
isLater(EndTime, E).
答案 0 :(得分:1)
fly(city1, city2, A, B)
内的程序流程如下:
flight(city1, city2, S, E)
。这会以S=9
,E=10
。write(9)
。isLater(A, 9)
。此操作失败,因为9
无法与[X|Y]
统一,并触发回溯。flight(city1, city2, S, E)
。这次它返回S=10
,E=11
。write(10)
。isLater(A, 10)
失败。它不能再回溯,因为它已尝试flight(city1, city2, _, _)
的每个替代方案,所以此时fly
失败。基本上,问题在于您在确定它是一个有效的解决方案之前编写S
,因此您最终也会打印出一堆非解决方案。您可能希望在isLater
检查后移动它。 (这里更大的问题是isLater
期待一个列表,但是你给它一个整数......)
请注意,在控制台中输入flight(city1, city2, A, B).
也会返回多个值 - 在显示第一个解决方案后,只需按“;” (而不是输入键)要求下一个。