2013-11-23 20 views
1

Я сделал это две прологов функции:Возвращаемое значение функции - Пролог

move-pacman([[Xpacman,Ypacman]],[[Xghost,Yghost]|_], Listpellets, Movepacman):- Xpacman+1=:=Xghost, Ypacman=Yghost, haspellet(Listpellets, Xpacman-1, Ypacman), Movepacman=0,!. 
    move-pacman([[Xpacman,Ypacman]],[[Xghost,Yghost]|_], Listpellets, Movepacman):- Xpacman-1=:=Xghost, Ypacman=Yghost, haspellet(Listpellets, Xpacman+1, Ypacman), Movepacman=1,!. 
    move-pacman([[Xpacman,Ypacman]],[[Xghost,Yghost]|_], Listpellets, Movepacman):- Ypacman+1=:=Yghost, Xpacman=Xghost, haspellet(Listpellets, Xpacman-1, Ypacman), Movepacman=2,!. 
    move-pacman([[Xpacman,Ypacman]],[[Xghost,Yghost]|_], Listpellets, Movepacman):- Ypacman-1=:=Yghost, Xpacman=Xghost, haspellet(Listpellets, Xpacman+1, Ypacman), Movepacman=3,!. 
    move-pacman([[Xpacman,Ypacman]],[_|Restghosts], Listpellets, Movepacman):- move-pacman([[Xpacman,Ypacman]],Restghosts, Listpellets, Movepacman). 

    haspellet([[Xpellet,Ypellet]|_], Xpacman, Ypacman):- Xpacman = Xpellet, Ypacman = Ypellet, !. 
    haspellet([_|Restpellets], Xpacman, Ypacman):- haspellet(Restpellets,Xpacman,Ypacman). 

Мой вопрос, почему, когда я бегу мой программка с этим:

move-pacman([[5,6]],[[6,6]],[[4,6]],R). 

Возвращаемое значение представляет собой логическое вместо int?

ответ

1

Я думаю, что у вас есть более чем проблема в вашем коде.

Для начала, функтор («имя» процедуры или набор правил), может содержать, но затем вы должны его процитировать. Другими словами, функтор должен быть атомом, а не выражение соединения:

'move-pacman'([[5,6]],[[6,6]],[[4,6]],R). 

будет измененный синтаксис, я предполагаю, что вы имели в виду

move_pacman([[5,6]],[[6,6]],[[4,6]],R). 

это обычный способ, чтобы написать его.

Тогда о правилах: арифметика должна быть явно оценена, или Prolog будет продолжать «синтаксическое дерево выражений» и не будет соответствовать вашим предполагаемым правилам. Затем ввести переменные, как X1 ниже

move_pacman([[Xpacman,Ypacman]],[[Xghost,Yghost]|_], Listpellets, Movepacman):- 
    Xpacman+1 =:= Xghost, 
    Ypacman = Yghost, 
    X1 is Xpacman-1, 
    haspellet(Listpellets, X1, Ypacman), 
    Movepacman = 0, 
    !. 

сведению это хороший стиль, чтобы писать каждый вызов «» на отдельной строке ...

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