【发布时间】:2015-12-12 06:31:42
【问题描述】:
我正在尝试使用 Prolog 解决以下逻辑难题:
确定比赛中每位车手的姓名、每辆赛车的赞助商以及每位车手结束比赛的位置。
- Flash Automotive 赞助的车手以第三名完赛。没有获得 Crank Motor Oil 赞助的霍华德没有以第五名完赛。
- 瑞恩的姓氏不对,不是由 NAPA Auto Parts 赞助的。 Barry Straight 并非由 Fleet Bodyworks 赞助。
- Crank Motor Oil 赞助的车手比姓氏不是 Element 的 Sydney 高一位。
- 先生战车,名字不是亚当,获得了第一名。霍华德的位置比右先生低一位。
- NAPA Auto Parts 赞助了获得第四名的车手,而不是 Barry。
- 五位车手,排名不分先后,分别是第二名车手 Adam、Tredco Tires 赞助的车手、Mr. Right 和 Mr. Rafe。
使用与此处找到的方法类似的方法:http://www.anselm.edu/internet/compsci/faculty_staff/mmalita/HOMEPAGE/logic/aa6.txt
我想出了以下答案:
race(Drivers) :- Drivers = [[howard,_,_,_],[barry,_,_,_],[ryan,_,_,_],
[sydney,_,_,_],[adam,_,_,_],[_,straight,_,_],[_,chariot,_,_],
[_,right,_,_],[_,element,_,_],[_,rafe,_,_],[_,_,flashautomotive,_],
[_,_,crankmotoroil,_],[_,_,napaautoparts,_],[_,_,fleetbodyworks,_],
[_,_,tredcotires,_],[_,_,_,1],[_,_,_,2],[_,_,_,3],[_,_,_,4],[_,_,_,5]],
member([barry,straight,C,D], Drivers), C \= fleetbodyworks,
C \= napaautoparts, D \= 4,
member([howard,_,G,H], Drivers), G \= crankmotoroil, H \= 5, H =:= X - 1,
member([ryan,J,K,_], Drivers), J \= right, K \= napaautoparts,
member([sydney,N,_,P], Drivers), N \= element,
member([Q,chariot,_,T], Drivers), Q \= adam, T = 1,
member([_,right,_,X], Drivers),
member([_, _, _, crankmotoroil, DD], Drivers), DD =:= P + 1,
member([EE,_,napaautoparts,HH], Drivers), HH = 4, EE \= barry,
member([_,_,flashautomotive,LL], Drivers), LL = 3.
将其加载到 Windows SWI-Prolog IDE 中时,它不会出错,但在调试时会产生以下结果:
[debug] [1] 12 ?- race(X)
| .
T Call: (13) race(_G4168)
T Fail: (13) race(_G4168)
false.
我显然对 Prolog 很陌生,但我想知道是什么可能导致它失败以及如何修复它(因为据我了解如何使用它的调试器在这种情况下不是很有帮助)。另外,有没有更简洁的方法来解决类似的逻辑问题?
【问题讨论】:
-
使用prolog-dif 而不是
(\=)/2!