Prolog bagof、setof、findall 谓词

Prolog bagof, setof, findall predicates

如何使用 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).

您可以对您的知识库进行建模,使第三个参数对于不擅长运动的学生来说是 none 而不是 _:

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

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

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

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

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

这会产生所需的结果:

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