簡體   English   中英

在Prolog中建立遞歸列表

[英]Recursive list building in 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的第一部分需要完成,這意味着應該在何時停止構建列表。

如果有人可以幫助我,我將非常感激。

建立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系統中也存在的解決方案計數和限制謂詞也很有用。

再見

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM