2017-07-11 2 views
0

Comment interroger les faits de base de données avec 3 attributs ou plus dans Prolog en utilisant bagof, setof. Un exemple j'ai défini une base de données students(name, grade,sport,gender). Je veux trouver une liste d'élèves qui pratiquent un sport particulier, par exemple le cricket. Ma requête en coursProlog bagof, setof, findall prédicats

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

La documentation de 'setof/3' et' bagof/3' indiquent que le premier argument est le terme que vous souhaitez recueillir . Donc dans ce cas, ce serait la variable student * name *. Le deuxième argument devrait être la condition, et le troisième argument est la liste à collecter. Donc: 'setof (N, G^D^étudiants (N, G, cricket, D), L). 'Votre appel' bagof' recueille les sports dans 'L', puis tente d'unifier' S' avec 'cricket'. Aucune collection de noms ne se produit. – lurker

+0

Si vous n'avez aucun problème de redondance dans les résultats des requêtes 'student/4', vous pouvez utiliser' findall (N, étudiants (N, _, cricket, _), L). ' – lurker

+0

Merci pour la réponse mais comment Est-ce que j'exclus les noms des étudiants qui ne pratiquent pas un sport? Quand j'ai essayé cela a renvoyé des étudiants qui n'avaient pas de sport. – user8291645

Répondre

1

Vous pouvez modéliser votre base de connaissances telles que le troisième argument est none pour les étudiants unathletic au lieu de _:

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

Ensuite, vous pouvez définir un prédicat qui décrit les étudiants atheletic comme ceux qui n'ont pas none comme sport:

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

utiliser la suite d'athlétisme/1 dans le seul but de sport_list/1:

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

Cela donne le résultat souhaité:

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