2017-02-23 5 views
1

Je ne sais pas pourquoi cela ne fonctionne pas ... voici le code.Prolog - Pourquoi le membre/2 ne travaille pas ici?

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

Lorsque je tente

?- cameToThePartyThatDay(People,Day). 

il dit

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

Mais, quand j'essayez ce qui suit avec un champ de la date variable ou une date réelle, comme. ..

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

il dit seulement

faux.

Répondre

3

Le problème est que le membre essaie de trouver un élément de la liste cameToThePartyThatDay(People,date(15,9,2011)), qui n'est pas, en fait, une liste.

Qu'est-ce que vous voulez faire est:

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

... afin que les gens est unifié avec la liste des personnes qui sont venues à la fête ce jour-là, et membre peut tirer des éléments de la liste des personnes .

+0

Ok, Merci, alors comment est-ce cameToThePartyThatDay (Les gens, la date (15, 9,2011)). renvoie quelque chose qui ressemble à une liste dans SWI-prolog? '>? - cameToThePartyThatDay (People, date (15,9,2011)). > People = [flor, pablo, leo, fer] .' – newbie

+1

@newbie Vous confondez un retour avec une unification - ce que '>? - cameToThePartyThatDay (People, date (15,9,2011)). > People = [flor, pablo, leo, fer]. »Dit que' cameToThePartyThatDay (People, date (15,9,2011)). 'Est vrai quand' People = [flor, pablo, leo, fer].'- à partir de là, les gens seront unifiés avec la liste' [flor, pablo, leo, fer] '. Les prédicats Prolog ne reviennent jamais, ils réussissent ou échouent. –

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

est une mauvaise façon d'utiliser member/2 parce

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

n'est pas une liste.

Une bonne façon pourrait être

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

Pour Prolog, la partie dans l'expression gras suivante:

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

est-pas un appel. En fait les prédicats sont pas les fonctions: ils font ne renvoient pas n'importe quoi. Selon Prolog, la partie en gras est un foncteur.

Afin de le laisser travailler, vous devez d'abord appel cameToThePartyThatDay puis comme vous utilisez People dans le prédicat member/2,:

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