我已经完成了这两个prolog功能:
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?
答案 0 :(得分: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,
!.
请注意,在单独的一行中编写每个“通话”是一种很好的风格......