2017-05-23 2 views
0

私はPrologを初めて使用しています。私の「データベース」は、以下のルールで構成されていますPrologデータベースが重複します

teacher(1, 'Benjamin', 'Johnson'). 
teacher(2, 'Mike', 'Oliver'). 
teacher(3, 'James', 'Johnson'). 

school(1, 'School1','Town1'). 
school(2, 'School2','Town2'). 
school(3, 'School3','Town3'). 

group(1,'Group1', 1, 1). 
group(2,'Group2', 3, 2). 
group(3,'Group3', 2, 1). 
group(4,'Group4', 2, 1). 
group(5,'Group5', 3, 3). 
group(6,'Group6', 1, 3). 

「先生は、」スキームを持っています

teacher(TeacherID, TeacherFirstname, TeacherLastname) 

「学校」のスキームを持っています

school(SchoolID, SchoolName, City) 

「基」とありスキーム:

group(GroupID, GroupName, TeacherID, SchoolID) 

私はしたい姓が 'Johnson'の教師がいるすべての学校を発声します。次のように

私のクエリは次のとおりです。

group(GroupID, _ , TeacherID , SchoolID) , school(SchoolID , SchoolName, _) , teacher(TeacherID , _ , 'Johnson'). 

は、私は一度だけ、クエリに合わせ、学校の名前を返すようにしたいです。しかし、私の現在のクエリを使用して、私は単一の学校を何度も取得します。重複を検出して出力することはできますか?ありがとう!

PS:あなたのソリューションのセットを提供して

school_with_teacher_johnson(School) :- 
    group(_, _, Teacher, SchoolID), 
    school(SchoolID, School, _), 
    teacher(Teacher, _, 'Johnson'). 

あなたはsetof/3述語を使用することができ、つまり、ソートされたリスト:リレーショナル代数は補助述語で

π SchoolName (σ TeacherLastname = 'Johnson' (teacher ⨝ group ⨝ school)) 
+1

クエリの目的は何ですか?繰り返される結果は、あるソリューションが複数の方法でクエリを満たすことを意味します。 – lurker

+0

私は、先生が "Johnson"の姓で働いているすべての学校の名前を取得したいと思います。同じ学校を2回受けることには何の意味もありません。分かりますか? – pmax1

+0

「私は1つの学校を何度も教えます」という意味はどうですか?正確に記述すると、複数の結果タプルが得られます。そのうちいくつかは同じ学校を持っています。あなただけが学校を戻したい場合は、学校に頼んでください。 – philipxy

答えて

2

だろう重複を削除して:

?- setof(School, school_with_teacher_johnson(School), Schools). 
Schools = ['School1', 'School2', 'School3']. 

を使用することもできますには補助述語はありませんが、間違っていると醜いです。

関連する問題