2015-05-17 5 views
0

У меня есть дом с комнатами, которые определяются соединениями, когда вы можете переходить из одной комнаты в другую, например.пролог рекурсивный поиск с ограничениями

connection(garage,sidehall). 
connection(sidehall,kitchen). 
connection(kitchen,diningroom). 

canget(X,Y):-connection(X,Y). 
canget(X,Y):-connection(X,_), 
      write('player goes from '),write(X),write(' to  '),write(Y),nl, 
      canget(_,Y). 

Im пытаясь выяснить, как сделать это так, игрок может получить только из одной комнаты в другую, когда у них есть определенный элемент, например, вы можете быть только в кухне, когда элементы = перчатки.

canget(X,Y,Item):-connection(X,Y,Item),canbein(Y,Item). 
canget(X,Y,Item):-connection(X,Somewhere,Item),canbein(Somewhere,Item),canget(Somewhere,Y,Item). 

попытался определения canbein с:

canbein(kitchen):- item(sword). 
canbein(sidehall):- item(hat).  

но не работает!

Определили мои детали, как, например, не уверен, если это право либо:

item(gloves,sword,helm,cheese). 

В принципе, я возвещаю мои ценности запись правильно? Как я могу использовать определенное значение элемента, чтобы сделать canget x to y false?

Спасибо!

ответ

0

Ну, я вижу несколько проблем с вашим кодом. Во-первых, вы вызываете с двумя аргументами (от canget предикат). Однако определяется как предикат с одним аргументом. Следовательно, вызов всегда терпит неудачу, поскольку существует предикат canbein/2.

Я предлагаю следующую модификацию:

canbein(kitchen, sword). 
canbein(sidehall, hat). 

Чем, определение элемента не требуется. Давайте подумаем о том, что происходит во время объединения

canget(X,Y,Item) :- connection(X,Y,Item), canbein(Y,Item). 

Давайте предположим, что следующий параметр X=sidehall, Y=kitchen, Item==sword. Этот предикат должен быть в порядке. Предполагая, что предикат conection в порядке, пролог пытается найти canbein(Y, Item), т. Е. canbein(kitchen, sword), и он преуспевает.

Наоборот, если элемент отличается от унификации, значит, он работает так, как ожидалось.

Вторая проблема - предикат item. По вашему определению, он ожидает 4 аргумента. Это вздор, конечно. Вы должны объявить это как

item(gloves). 
item(sword). 
item(helm). 
item(cheese). 

Однако, я не думаю, что этот предикат необходим вообще. Чтобы быть ясным, попробуйте позвонить item(X) и получить все результаты (четыре объявленные). Попробуйте это с предыдущим определением - что вы даже попросите?

Надеюсь, это поможет :)

+0

спасибо большое, признайтесь. думаю, я понимаю это немного лучше сейчас :) Я сосать его программирование! – JJ1

+0

@ JJ1 Пожалуйста, обратите внимание на ответ, если это вам помогло :) Это хорошо распространено в stackoverflow, так как другие пользователи будут знать, что он решает проблему. Вы можете проголосовать, если вам нравится стиль и т. Д. – petrbel

Смежные вопросы