2017-07-11 25 views
0

bagof,setofを使用して、Prologで3つ以上の属性を持つデータベースファクトをクエリする方法を教えてください。一例として、定義されたデータベースstudents(name, grade,sport,gender)があります。私は特定のスポーツをする学生のリスト、クリケットを見つけたいと思います。そして、あなたはそれらのものとしてatheletic学生を記述する述語を定義することができProlog bagof、setof、findall述語

student(lepo,6,none,male). 
student(ayanda,3,none,female). 

:私の現在のクエリ

sport_list(L):- 
     bagof(S,N^G^D^students(N,G,S,D),L), 
      S = cricket. 

student(patash,5,rugby,male). 
student(naomi,3,netball,female). 
student(lepo,6,_,male). 
student(diamal,4,cricket,male). 
student(bonga,5,chess,female). 
student(imi,6,cricket,male). 
student(ayanda,3,_,female). 
+0

'SETOF/3'と' bagof/3'最初の引数は、あなたが収集したい用語であることを示すためのドキュメント:望ましい結果が得られ

sport_list(L):- bagof(S,athletic(S),L). 

:sport_list/1の。この場合、それはstudent * name *変数になります。 2番目の引数は条件でなければならず、3番目の引数は収集するリストです。あなたの 'bagof'コールはスポーツを' L'に集め、 'S'と' cricket'を統一しようとします。名前の集まりはありません。 – lurker

+0

'student/4'クエリの結果に冗長性の問題がない場合は、' findall(N、students(N、_、cricket、_)、L) 'を使用することができます。 – lurker

+0

スポーツをしていない生徒の名前は除外しますか?私はそれを試みたときに、スポーツを持たない学生を返しました。 – user8291645

答えて

1

あなたは3番目の引数は代わり_のunathletic学生のためのnoneであるように、あなたの知識ベースをモデル化することができ誰がスポーツとしてnoneを持っていない:

athletic(S) :- 
    dif(X,none), 
    student(S,_,X,_). 

その後、単一の目標にアスレチック/ 1を使用します

?- sport_list(L). 
L = [patash,naomi,diamal,bonga,imi]