0

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

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

谢谢。

4

1 回答 1

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).
于 2013-10-03T13:03:53.983 回答