2017-02-23 10 views
1

なぜこれが動作していないのかわかりません...ここにコードがあります。Prolog - なぜメンバー/ 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

[OK]を、おかげで、ので、どのようになる cameToThePartyThatDay(人、日付(15、 9,2011))。 は、SWI-prologのリストのようなものを返しますか? '>?cameToThePartyThatDay(人、日付(15,9,2011))。 > People = [flor、pablo、leo、fer]。 – newbie

+1

@newbie返信を統一と混同していますか? '>?cameToThePartyThatDay(人、日付(15,9,2011))。 > People = [flor、pablo、leo、fer] .'は、 'cameToThePartyThatDay(People、date(15,9,2011)) 'は' People = [flor、pablo、leo、fer]のときに真です。 - それから、人々はリスト[flor、pablo、leo、fer]で統一されます。プロローグ述部は決して戻ってこない、成功するか失敗するかだけです。 –

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

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

がリストではありませんので、member/2を使用するために間違った方法です。

正しい方法はプロローグ、次式の太字の部分について

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

次のようになります。

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

ないコールです。実際には述語は関数ではない:彼らはを返しません何か。 Prologによると、太字の部分はファンクタです。

それを動作させるために、あなたの最初の呼び出しcameToThePartyThatDayし、その後、使用Peoplemember/2述語では、のような:

cameToThePartyThatDay(People,date(15,9,2011)), 
member(X,People).
関連する問題