如何以当前长度生成列表中所有可能的元素集?
?- get_set(X, [1,2,3]).
X = [1,1,1] ;
X = [1,1,2] ;
X = [1,1,3] ;
X = [1,2,1] ;
X = [1,2,2] ;
X = [1,2,3] ;
X = [1,3,1] ;
X = [1,3,2] ;
X = [1,3,3] ;
.....
X = [3,3,2] ;
X = [3,3,3].
Run Code Online (Sandbox Code Playgroud)
UPD:Sharky给出了很好的答案.但也许这不是最好的.这是另一个:
get_set(X,L) :- get_set(X,L,L).
get_set([],[],_).
get_set([X|Xs],[_|T],L) :- member(X,L), get_set(Xs,T,L).
Run Code Online (Sandbox Code Playgroud)
小智 3
考虑:
get_set(L0, L) :-
length(L, Len),
length(L0, Len),
apply_elem(L0, L).
apply_elem([], _).
apply_elem([X|Xs], L) :-
member(X, L),
apply_elem(Xs, L).
Run Code Online (Sandbox Code Playgroud)
解释:
确定输入列表的长度允许我们L通过Len生成唯一变量 的列表L0。length/2然后,我们只需将 的元素应用于viaL的所有成员,这会为选项留下选择点(如果它们存在的话)(即,如果列表的长度> 1)。Prolog 将根据需要回溯以生成列表中所有可能的元素组合。L0member/2LLL0