返回值函数 - Prolog

时间:2013-11-23 15:44:47

标签: prolog

我已经完成了这两个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?

1 个答案:

答案 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,
   !.

请注意,在单独的一行中编写每个“通话”是一种很好的风格......