2013-10-03 85 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 \ =(200分之4)/ 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的'integer'謂詞有點不同(例如,在'R是20/4,整數(R)'時失敗),所以我替換了'R是N/X',其中'R是N // X,Y是R * N,N = Y',類似地,對於'X1是X/N'。這在gprolog和swi-prolog中起作用。 – lurker

+0

謝謝!我很久沒有使用gprolog了。內置的軟件不能攜帶是很可悲的。 – seanmcl