2017-05-23 6 views
0

Je suis nouveau chez Prolog. Ma "base de données" comprend les règles suivantes:Duplicata de base de données 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). 

"professeur" a le schéma:

teacher(TeacherID, TeacherFirstname, TeacherLastname) 

"école" a le schéma:

school(SchoolID, SchoolName, City) 

"groupe" a la régime:

group(GroupID, GroupName, TeacherID, SchoolID) 

Je veux o Exemplaire toutes les écoles où les enseignants travaillent dont le nom de famille est «Johnson».

Ma requête est la suivante:

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

Je veux revenir le nom des écoles, qui correspondent à la requête, une seule fois. Cependant en utilisant ma requête actuelle, je reçois une seule école plusieurs fois. Comment puis-je détecter les doublons et ne pas les sortir? Merci!

PS: L'algèbre relationnelle serait

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

Quel est le but de votre requête? Les résultats répétés signifient qu'une solution donnée satisfait votre requête de plusieurs façons. – lurker

+0

Je veux connaître le nom de toutes les écoles où travaille un enseignant dont le nom de famille est "Johnson". Il ne sert à rien d'avoir deux fois la même école. Tu vois ce que je veux dire? – pmax1

+0

Que voulez-vous dire, "Je reçois une seule école plusieurs fois"? Ecrire avec précision - vous obtenez plusieurs tuples de résultat, dont certains ont la même école. Si vous ne voulez que des écoles, demandez seulement des écoles. – philipxy

Répondre

2

Avec un prédicat auxiliaire:

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

Vous pouvez utiliser le prédicat setof/3 vous donne un ensemble de solutions, qui est une liste triée avec les doublons supprimés:

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

Il est également possible d'utiliser setof/3 sans un prédicat auxiliaire, mais c'est moche et facile de se tromper.