我正在尝试编写一个 Prolog 断言(SWI),可以从列表中选择 N 个元素,如下所示:
selectn(+N,?Elems,?List1,?List2)是真的,当 List1<\/em> 删除所有 Elems<\/em> 后结果为 List2<\/em>。
我的问题是,在某些情况下,我会得到重复的结果,但我不知道如何避免它们:
这不是作业,但如果您能像对待作业一样帮助我,我也会感到高兴。
selectn(+N,?Elems,?List1,?List2)是真的,当 List1<\/em> 删除所有 Elems<\/em> 后结果为 List2<\/em>。
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.
这不是作业,但如果您能像对待作业一样帮助我,我也会感到高兴。
selectn/4
完成的,导致在查询selectn(3,[c,a,b],[a,b,c,d],[d]).
或selectn(0,[a,b],[b,a]).
时失败,当然这是因为重复项没有被视为答案。 - Carles Araguz