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).

我试图弄清楚如何做到这一点,以便玩家只有在拥有特定物品时才能从一个房间到另一个房间,例如当物品 = 手套时你只能在厨房里。

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?

谢谢!

4

1 回答 1

0

好吧,我发现您的代码存在一些问题。首先,您canbein使用两个参数(来自canget谓词)调用。但是,canbein被定义为单参数谓词。因此,调用总是失败,因为不 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谓词没问题,prolog 试图找到canbein(Y, Item)iecanbein(kitchen, sword)并且它成功了。

相反,如果 Item 不同,则统一失败,因此它按预期工作。

第二个问题是item谓词。根据您的定义,它需要 4 个参数。这当然是胡说八道。你应该像这样声明它

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

但是,我认为这个谓词根本没有必要。为了清楚起见,尝试调用item(X)并获取所有结果(声明的四个)。尝试使用先前的定义 - 你甚至应该要求什么?

我希望它有帮助:)

于 2015-05-17T18:09:26.077 回答