[英]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.