Я пытаюсь решить следующую логическую головоломку с помощью Пролога:решения и отладка логики головоломки в Прологе
Определить имя и фамилию каждого водителя в гонке, спонсор для каждого гоночного автомобиля, и в какая позиция каждого гонщика закончила гонку.
- Водитель, авторизованный компанией Flash Automotive, завершил гонку на третьем месте. Говард, который не спонсировался Crank Motor Oil, не завершил гонку на пятом месте.
- Райан, чья фамилия не права, не спонсировалась автозапчастями NAPA. «Барри Стрит» не спонсировался Fleet Bodyworks.
- Водитель, спонсируемый компанией Crank Motor Oil, разместил одну позицию выше Сиднея, фамилия которой не была Element.
- Г-н Чариот, чье имя не было Адамом, занял первое место. Говард поставил одну позицию ниже мистера Правого.
- NAPA Auto Parts спонсировал водителя, который занял четвертое место, которое не было Барри.
- Пять водителей, в определенном порядке, - это Адам, водитель второго места, водитель, спонсируемый 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.
Я, очевидно, совершенно новичок в Pro log, но мне интересно, что может привести к сбою и исправлению (поскольку отладчик, как я понимаю, как его использовать, не очень полезен в этом случае). Кроме того, есть ли более чистый способ решения подобных логических задач?
Используйте [tag: prolog-dif] вместо '(\ =)/2'! – repeat