Prolog中没有双打的列表的所有组合

时间:2017-01-15 15:42:40

标签: list prolog

是否有一种简单的方法可以获得没有双打的列表的所有组合。没有双打,我的意思也是没有彼此的排列。所以没有[a,b,c][c,a,b][c,b,a]

因此对于输入[a,b,c],输出将为:

[a]
[b]
[c]
[a,b]
[a,c]
[b,c]
[a,b,c]

我只能找到带有双打(排列)的解决方案

2 个答案:

答案 0 :(得分:4)

这个问题的解决方案很简单:显然只有一个空集合中的一个组合:空集:

var expires=moment().add(1,'days').valueOf();
          var token = jwt.encode(user, config.secret,{
          exp: expires}),app.get('jwtTokenSecret'));

此外,对于每个元素,您可以决定是否添加它:

combs([],[]).

由于您按照列表的顺序选择(或删除),这可以保证您以后不会重新选择combs([H|T],[H|T2]) :- combs(T,T2). combs([_|T],T2) :- combs(T,T2). 。如果您将其a提供给它,则永远不会生成类似[a,b,c]的内容,因为一旦决定选择/删除[b,a,c],就无法添加a并重新决定b

运行此命令:

a

如果你想以相反的方式生成它(对第一个删除元素有更多的测试,而不是添加它们,你可以简单地交换递归语句):

?- combs([a,b,c],L).
L = [a, b, c] ;
L = [a, b] ;
L = [a, c] ;
L = [a] ;
L = [b, c] ;
L = [b] ;
L = [c] ;
L = [].

在这种情况下,结果将是:

combs([],[]).

combs([_|T],T2) :-
    combs(T,T2).
combs([H|T],[H|T2]) :-
    combs(T,T2).

修改

如果你想要排除空列表,你可以通过在通话中添加另一张支票来做到这一点:

?- combs([a,b,c],L).
L = [] ;
L = [c] ;
L = [b] ;
L = [b, c] ;
L = [a] ;
L = [a, c] ;
L = [a, b] ;
L = [a, b, c].

您可以在以下函数中定义:

?- combs([a,b,c],L),L \= [].

或者通过重写combs_without_empty1(LA,LB) :- combs_without_empty1(LA,LB), LB \= []. 函数。在这种情况下,您最好使用累加器来计算当前所选元素的数量:

comb/2

combs_without_empty(L,C) :- combs_without_empty(L,0,C). 有点复杂。如果列表只包含一个元素,则应检查combs_without_empty/3是否大于零。如果是这种情况,我们可以选择是否添加元素。如果N为零,我们必须包含它。所以:

N

我们还必须实现一个递归部分,在我们选择一个元素时将递增combs_without_empty([A],_,[A]). combs_without_empty([_],N,[]) :- N > 0.

N

全部放在一起给出了:

combs_without_empty([_|T],N,T2) :-
    combs_without_empty(T,N,T2).
combs_without_empty([H|T],N,[H|T2]) :-
    N1 is N+1,
    combs_without_empty(T,N1,T2).

产生:

combs_without_empty(L,C) :-
    combs_without_empty(L,0,C).

combs_without_empty([A],_,[A]).
combs_without_empty([_],N,[]) :-
    N > 0.

combs_without_empty([_|T],N,T2) :-
    combs_without_empty(T,N,T2).
combs_without_empty([H|T],N,[H|T2]) :-
    N1 is N+1,
    combs_without_empty(T,N1,T2).

答案 1 :(得分:4)

没有辅助检查空列表的干净解决方案只是从规则中排除空列表。基本情况应该是单个元素组合:

comb_without_empty([H|_], [H]).   % Simple case of one element comb
comb_without_empty([_|T], C) :-   % Combinations of the tail w/o head
    comb_without_empty(T, C).
comb_without_empty([H|T], [H|C]) :-  % Combinations of the tail including head
    comb_without_empty(T, C).

| ?- comb_without_empty([a,b,c], L).

L = [a] ? a

L = [b]

L = [c]

L = [b,c]

L = [a,b]

L = [a,c]

L = [a,b,c]

(1 ms) no
| ?-