如何计算列表中所有可能的分区?

时间:2013-10-03 11:10:05

标签: prolog

我发现这个谓词用于计算所有可能的总和。

subset_sum(0,[],[]).

subset_sum(N,[_|Xs],L) :-
    subset_sum(N,Xs,L).

subset_sum(N,[X|Xs],[X|Rest]) :-
    R is N-X,
    subset_sum(R,Xs,Rest).

知道该部门没有交换属性,如何为该部门获得相同的结果?

此谓词仅适用于两个元素之间的划分和顺序。

subset_div(1,[],[]).

subset_div(N,[_|Xs],L) :-
    subset_div(N,Xs,L).

subset_div(N,[X|Xs],[X|Rest]) :-
    R is X/N,
    subset_div(R,Xs,Rest).

如何获得此结果?

?-subset_div(20,[10,100,90,3,5],L).
    L=[100,5].

?-subset_div(5,[10,4,59,200,12],L).
    L=[200,10,4].

5 =(200/10)/ 4或5 =(200/4)/ 10但5 \ =(4/200)/ 10或5 \ =(10/4)/ 200

感谢。

1 个答案:

答案 0 :(得分:1)

如果您只关心左关联解决方案,则可以根据产品进行操作。你可以做的解决方案,比如[20 /(10/2)/ 5]更难,并且需要更复杂的输出格式。

subset_prod(1, [], []).

subset_prod(N, [_|Xs], L) :-
    subset_prod(N, Xs, L).

subset_prod(N, [X|Xs], [X|Rest]) :-
    R is N/X,
    subset_prod(R, Xs, Rest).

subset_div1(N, [X|Xs], [X|L]) :-
    X1 is X / N,
    integer(X1),
    subset_prod(X1, Xs, L).

subset_div1(N, [_|Xs], L) :-
    subset_div(N, Xs, L).

subset_div(N, L, M) :-
    sort(L, L1),
    reverse(L1, L2),
    subset_div1(N, L2, M).