1

我很难理解我的谓词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]),被调用了两次,这是为什么呢?

另外,为什么我在控制台中获得单个值AB不是在调用谓词时在我的谓词中?

逐字代码:

% 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).
4

1 回答 1

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).在控制台中输入也会返回多个值 - 在它显示第一个解决方案后,只需按“;” (而不是回车键)来询问下一个。

于 2013-11-08T03:17:12.020 回答