我正在尝试编写一个 Prolog 谓词(SWI),它将从列表中选择 N 个元素,如下所示:
selectn ( +N , ?Elems , ?List1 , ?List2 ) 为真,当List1删除所有Elem后,结果为List2。
selectn(N,Lps,L1s,[]) :- length(L1s,L), N >= L, permutation(L1s,Lps).
selectn(0,[],L1s,Lps) :- permutation(L1s,Lps).
selectn(N,[E|Es],L1s,L2s) :-
select(E,L1s,L0s),
N0 is N-1,
selectn(N0,Es,L0s,L2s).
我的问题是,在某些情况下,我得到重复的结果,我不知道如何避免它们:
?- findall(L,selectn(2,Es,[a,b,c],L),Ls),length(Ls,Solutions).
Ls = [[c], [b], [c], [a], [b], [a]],
Solutions = 6.
这不是家庭作业,但如果你想像那样帮助我,我也会很高兴。