我试图在prolog中编写规则,要求我递归地构建列表。我能够构建该列表,但问题是我不知道如何停止构建列表的过程。所以,我需要编写一个规则来停止进一步构建该列表。
这就是我的规则:
%a few rules that are supplementing the rule popular:
member(H,[H|T]).
member(X,[H|T]) :- member(X,T).
notmember(H,A) :- member(H,A), !, fail.
notmember(H,A).
size([],0).
size([H|T],N) :- size(T,N1), N is N1+1.
listhasx(X,A) :- article(A,_,_,_,R), member(X,R).
notlisthasx(X,A) :- listhasx(X,A), !, fail.
notlisthasx(X,A).
makelist(A,L) :- ________________________________________________________.
makelist(A,L) :- listhasx(X,B), notmember(B,L), N2 is B, makelist(N2,L2), L=[A|L2].
popular(X,0).
popular(X,N) :- listhasx(X,A), makelist(A,L), size(L,N1), N-1<N1.
所以,基本上,我需要写一个流行的规则,我已经写过了。但是,它使用了部分不完整的makelist规则。具体而言,需要完成makelist的第一部分,这意味着应该停止建立列表。
如果有人可以帮我解决这个问题,我会非常感激。
答案 0 :(得分:0)
构建X列表以使其满足目标的最简单方法 G,是使用findall谓词。这是一个例子:
?- [user].
p(3).
p(1).
p(2).
^D
Yes
?- p(X).
X = 3 ;
X = 1
?- findall(X, p(X), L).
L = [3, 1, 2]
谓词finall / 3是ISO核心标准的一部分。所以应该 在大多数Prolog系统中都可以找到。相关谓词是bagof / 3和 SETOF / 3。
同样有用的是来自模块聚合的谓词 许多Prolog系统,或解决方案计数和限制谓词 在许多Prolog系统中也有发现。
再见