Prolog bagof,setof,findall谓词

时间:2017-07-11 19:28:54

标签: prolog prolog-setof

如何使用bagofsetof在Prolog中使用3个或更多属性查询数据库事实。一个例子我有一个已定义的数据库students(name, grade,sport,gender)。我想找一份参加特定运动的学生名单,比如说板球。我当前的查询

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).

1 个答案:

答案 0 :(得分:1)

您可以为知识库建模,使第三个参数为none,适用于非运动学生而不是_

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

然后你可以定义一个谓词来描述那些没有none作为运动的学生:

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

随后在sport_list / 1的单一目标中使用运动/ 1:

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

产生了预期的结果:

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