prolog中的递归列表构建

时间:2015-04-11 05:48:41

标签: list prolog rule recursive-datastructures

我试图在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的第一部分,这意味着应该停止建立列表。

如果有人可以帮我解决这个问题,我会非常感激。

1 个答案:

答案 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系统中也有发现。

再见