2015-12-12 2 views
1

Я пытаюсь решить следующую логическую головоломку с помощью Пролога:решения и отладка логики головоломки в Прологе

Определить имя и фамилию каждого водителя в гонке, спонсор для каждого гоночного автомобиля, и в какая позиция каждого гонщика закончила гонку.

  1. Водитель, авторизованный компанией Flash Automotive, завершил гонку на третьем месте. Говард, который не спонсировался Crank Motor Oil, не завершил гонку на пятом месте.
  2. Райан, чья фамилия не права, не спонсировалась автозапчастями NAPA. «Барри Стрит» не спонсировался Fleet Bodyworks.
  3. Водитель, спонсируемый компанией Crank Motor Oil, разместил одну позицию выше Сиднея, фамилия которой не была Element.
  4. Г-н Чариот, чье имя не было Адамом, занял первое место. Говард поставил одну позицию ниже мистера Правого.
  5. NAPA Auto Parts спонсировал водителя, который занял четвертое место, которое не было Барри.
  6. Пять водителей, в определенном порядке, - это Адам, водитель второго места, водитель, спонсируемый 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, но мне интересно, что может привести к сбою и исправлению (поскольку отладчик, как я понимаю, как его использовать, не очень полезен в этом случае). Кроме того, есть ли более чистый способ решения подобных логических задач?

+1

Используйте [tag: prolog-dif] вместо '(\ =)/2'! – repeat

ответ

2

Неправильное представление «пространства поиска»: в примере, который вы связали, обратите внимание, что только один из слотов значений привязан к константе. Такая константа будет эффективно использоваться в . Определите другие переменные элементы после получения их правильного места с учетом ограничений.

Кроме того, пусть Prolog применяет «игру с перестановкой», выполняемую различными членами/2, и только после проверяет идентификационные данные, отличия и т. Д. После того, как вы получите решение, вы можете попытаться оптимизировать процесс поиска двигаясь вверх чек, но всегда после уместных слотов были присвоены ...

Хорошего выбора будет использовать числовое поле, так что вы можете применить арифметику очевидным образом для обеспечения соблюдения ограничений. Таким образом, я попытался изменить код:

race(Drivers) :- 
    Drivers = [ 
     [_,_,_,1], 
     [_,_,_,2], 
     [_,_,_,3], 
     [_,_,_,4], 
     [_,_,_,5] 
    ], 
     member([barry,straight,C,D], Drivers), 
     member([howard,_,G,H], Drivers), 
     member([ryan,J,K,_], Drivers), 
     member([sydney,N,_,P], Drivers), 
     member([Q,chariot,_,T], Drivers), 
     member([_,right,_,X], Drivers), 
     member([_,_,crankmotoroil,DD], Drivers), 
     member([EE,_,napaautoparts,HH], Drivers), 
     member([_,_,flashautomotive,LL], Drivers), 

    C \= fleetbodyworks, C \= napaautoparts, D \= 4, 
    G \= crankmotoroil, H \= 5, H =:= X - 1, 
    J \= right, K \= napaautoparts, 
    N \= element, 
    Q \= adam, T = 1, 
% DD =:= P + 1, 
    HH = 4, EE \= barry, 
    LL = 3. 

Примечания комментарий: если вы раскоментировать, ни одно решение не доступно ... Комментирование ограничения является простым инструментом отладки для этой простой настроенной схемы.

+0

Удивительный! Это было очень полезно. Спасибо огромное! – tdon

0

Это рабочее решение, основанное на ответе CapelliC.С помощью я изначально неправильно понял часть проблемы и забыл некоторые правила, поэтому ошибки исправлены и добавлены дополнительные правила в этом решении.

race(Drivers) :- 
     Drivers = [ 
      [_,_,_,1], 
      [_,_,_,2], 
      [_,_,_,3], 
      [_,_,_,4], 
      [_,_,_,5] 
     ], 
      member([barry,straight,Barrysponsor,Barryplace], Drivers), 
      member([howard,_,Howardsponsor,Howardplace], Drivers), 
      member([ryan,Ryanlastname,Ryansponsor,_], Drivers), 
      member([sydney,Sydneylastname,_,Sydneyplace], Drivers), 
      member([adam,Adamlastname,Adamsponsor,Adamplace], Drivers), 
      member([Chariotfirstname,chariot,_,1], Drivers), 
      member([Rightfirstname,right,Rightsponsor,Rightplace], Drivers), 
      member([_,element,_,_], Drivers), 
      member([_,rafe,_,_], Drivers), 
      member([_,_,crankmotoroil,Crankmotoroilplace], Drivers), 
      member([Napaautopartsfirstname,_,napaautoparts,4], Drivers), 
      member([_,_,flashautomotive,3], Drivers), 
      member([Tredcotiresfirstname,Tredcotireslastname,tredcotires,Tredcotiresplace], Drivers), 
      member([_,_,fleetbodyworks,_], Drivers), 

    Barrysponsor \= fleetbodyworks, Barrysponsor \= napaautoparts, Barryplace \= 4, 
    Howardsponsor \= crankmotoroil, Howardplace \= 5, Howardplace =:= Rightplace + 1, 
    Ryanlastname \= right, Ryansponsor \= napaautoparts, 
    Adamplace \= 2, Adamsponsor \= tredcotires, 
    Adamlastname \= right, Adamlastname \= rafe, 
    Sydneylastname \= element, 
    Chariotfirstname \= adam, 
    Rightfirstname \= adam, Rightplace \= 2, Rightsponsor \= tredcotires, 
    Crankmotoroilplace =:= Sydneyplace - 1, 
    Napaautopartsfirstname \= barry, 
    Tredcotiresfirstname \= adam, Tredcotiresplace \= 2, 
    Tredcotireslastname \= rafe, Tredcotireslastname \= right. 
Смежные вопросы