Prolog bagof、setof、findall 谓词
Prolog bagof, setof, findall predicates
如何使用 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).
您可以对您的知识库进行建模,使第三个参数对于不擅长运动的学生来说是 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]
如何使用 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).
您可以对您的知识库进行建模,使第三个参数对于不擅长运动的学生来说是 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]