2017-02-23 76 views
1

我不知道为什么这不起作用...这是代码。序言 - 为什么会员/ 2不在这里工作?

cameToTheParty(date(15,9,2011), flor). 
cameToTheParty(date(22,9,2011), marina). 
cameToTheParty(date(15,9,2011), pablo). 
cameToTheParty(date(22,9,2011), pablo). 
cameToTheParty(date(15,9,2011), leo). 
cameToTheParty(date(22,9,2011), flor). 
cameToTheParty(date(15,9,2011), fer). 
cameToTheParty(date(22,9,2011), mati). 

cameToThePartyThatDay(Peoples, Date):- 
    bagof(X,cameToTheParty(Date,X),Peoples). 

当我尝试

?- cameToThePartyThatDay(People,Day). 

它说

People = [flor, pablo, leo, fer], 
Day = date(15, 9, 2011) ; 
People = [marina, pablo, flor, mati], 
Day = date(22, 9, 2011). 

但是,当我尝试用一​​个变量日期的领域,或实际日期下面,等等。 ..

member(X,cameToThePartyThatDay(People,date(15,9,2011))). 

它只是说

假。

回答

3

问题是该成员试图从列表cameToThePartyThatDay(People,date(15,9,2011))中找到一个元素,事实上这不是一个列表。

你想要做的是:

cameToThePartyThatDay(People,date(15,9,2011)), 
member(X,People). 

......使人们是统一的谁来到了晚会的那一天的人的名单,然后成员可以从人的名单拉元素。

+0

好了,谢谢你,所以如何是 cameToThePartyThatDay(人民,日(15, 9,2011))。 返回的东西看起来像SWI-prolog中的列表? '>? - cameToThePartyThatDay(People,date(15,9,2011))。 >人们= [flor,pablo,leo,fer] .' – newbie

+1

@newbie你在混淆一个统一的回报 - 什么 '>? - cameToThePartyThatDay(People,date(15,9,2011))。 >人们= [flor,pablo,leo,fer] .'说的是'cameToThePartyThatDay(人们,日期(15,9,2011))'当人们= [flor,pablo,leo,fer]时是真实的。' - 从这里开始,人们将与'[弗洛,巴勃罗,利奥,弗尔]'的名单统一起来。 Prolog谓词永远不会返回,它们只会成功或失败。 –

3
member(X,cameToThePartyThatDay(People,date(15,9,2011))) 

是使用member/2因为

cameToThePartyThatDay(People,date(15,9,2011)) 

不是列表中的错误的方式。

正确的方式可能是

cameToThePartyThatDay(People, date(15, 9, 2011)), 
member(X, People) 
3

对于Prolog的,在下面的表达式中的粗体部分:

member(X,cameToThePartyThatDay(People,date(15,9,2011))).

通话。事实上谓词是不是函数:他们做不返回什么。根据Prolog的粗体部分是函子

为了让它工作,你第一个电话cameToThePartyThatDay然后使用Peoplemember/2谓语,如:

cameToThePartyThatDay(People,date(15,9,2011)), 
member(X,People).