2013-10-03 2 views
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

Спасибо.

+0

Не могли бы вы расширить ваш вопрос? Я не понимаю, как «4» попадает в результат. – CapelliC

+0

@CapelliC '(200/10)/4 = 5' – zaquest

ответ

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). 
+0

Это прекрасно. Большое спасибо. – Vincenzoni

+1

Это работает хорошо (+1). Я хотел бы заставить его работать для 'gprolog', но, что интересно, предикат gprolog« целочисленный »работает немного иначе (неудача на« R равна 20/4, целое число (R) », например, поэтому я заменил« R is N/X' с 'R является N // X, Y является R * N, N = Y' и аналогично для' X1 является X/N'. Это работает в gprolog и swi-proog. – lurker

+0

Спасибо! Я долго не использовал gprolog. Печально, что встроенные устройства не переносимы. – seanmcl

Смежные вопросы