如何使用bagof
,setof
在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).
答案 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]