Search 带约束的prolog递归搜索

Search 带约束的prolog递归搜索,search,prolog,transitive-closure,Search,Prolog,Transitive Closure,我有一所房子,里面的房间都有连接,你可以从一个房间到另一个房间 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 '),

我有一所房子,里面的房间都有连接,你可以从一个房间到另一个房间

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到y为假


谢谢大家!

我发现你的代码有一些问题。首先,使用两个参数调用
canbein
(from
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==swill
。这个谓词应该是OK的。假设
连接
谓词正常,prolog尝试查找
canbein(Y,Item)
canbein(厨房,剑)
,结果成功

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

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

item(gloves).
item(sword).
item(helm).
item(cheese).
然而,我认为这个谓词根本没有必要。为了清楚起见,尝试调用
项(X)
并获得所有结果(声明的四个)。用前面的定义试试——你甚至应该要求什么


我希望它能有所帮助:)

非常感谢,伙计,谢谢你。我想我现在对它有点了解了:)我在编程上太差劲了@JJ1请考虑标记答案如果它帮助你:)这是一个很好的共同在堆栈溢出,因为其他用户将知道它解决了这个问题。如果你喜欢它的风格,你可以投票赞成。