请帮我解决这个问题:
子集(N,[1,2,3],L)。
如果N = 2,我希望结果是:
[1,2];
[2,1];
[1,3];
[3,1];
[2,3];
并[3,2];
(以任何顺序)
答案 0 :(得分:2)
我重写了这个解决方案:(基于:Permuted combinations of the elements of a list - Prolog)
subset(N, InList, Out) :-
splitSet(InList,_,SubList),
permutation(SubList,Out),
length(Out, N).
splitSet([ ],[ ],[ ]).
splitSet([H|T],[H|L],R) :-
splitSet(T,L,R).
splitSet([H|T],L,[H|R]) :-
splitSet(T,L,R).
结果(在SWI-Prolog中测试):
?- subset(2,[1,2,3],R).
R = [2, 3] ;
R = [3, 2] ;
R = [1, 3] ;
R = [3, 1] ;
R = [1, 2] ;
R = [2, 1] ;
false.
答案 1 :(得分:1)
嗯,你的基本情况很简单:
subset(0,Lst,[]).
如果N> 0,你有2个选择如何处理Lst的第一个元素:
你可能认为你必须担心Lst太短(或者N太大了:同样的事情),但是如果你已经正确地编写了上述代码,那么应该为你照顾它。
这足以让你开始。