【发布时间】:2013-11-08 00:24:09
【问题描述】:
我很难理解我的谓词 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).
【问题讨论】:
-
为什么
isLater的第二个参数是一个列表? -
有一次我认为 S 是一个列表,但我没有意识到 prolog 在执行时会回溯。
-
如果传递的不是列表,则会出现不匹配、失败和回溯。在这种情况下,您只有一个
isLater子句,因此它只是失败了(没有什么可回溯的)。您可以通过为每个案例添加子句来允许列表和非列表案例。
标签: prolog