我发现这个谓词用于计算所有可能的总和。
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
感谢。
答案 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).