Пролог поиск возможной комбинации для вычитания 2 элементов из списка

Это расширенная проблема с этой страницы.Пролог возможного удаления элементов в списке

Например, для списка X = [1,2,3] я могу вычесть примерно так:

вычтите 1 из 1-го / 2-го элемента, и X станет [1-1, 2-1, 3] = [0, 1, 3] = [1, 3]

вычесть 1 из 1-го / 3-го элемента: X становится [2, 2]

вычтите 1 из 2-го / 3-го элемента: X становится [1, 1, 2]

вычтите 2 из 2-го / 3-го элемента: X становится [1, 1]

Таким образом, он всегда вычитает 2 элемента и с одинаковым номером, но всегда с действительным числом. У кого-нибудь есть идеи по этому поводу?

Это выглядит лучше:

subt_comb(X, Y).
X = [1,2,3]
Y = [1,3]
Y = [2,2]
Y = [1,1,2]
Y = [1,1]

Посмотрев на решения lurker и gusbro, я создал нечто подобное.

remove2([HX|T], S2):-
    between(1, HX, Y),
    remove2__([HX|T], Y, S2).
remove2([HX|T], [HX|TY]):-
    remove2(T, TY).

% remove2__(S1, Y, S2), this procedure is to execute 0 after
% subtraction. Y is generated from remove2(S1, S2).
remove2__([Y|T], Y, TY):- remove2_(Y, T, Y, TY).
remove2__([HX|T], Y, [HY|TY]):-
    HX>Y,
    HY is HX - Y,
    remove2_(HX, T, Y, TY).


% remove2_(HX, L, Y, S2).
% HX is the first element from the origin list. L is the tail of the
% origin list. Y is the number to subtract. S2 is the result.
remove2_(_, [H|T], H, T).
remove2_(_, [H|T], Y, [HY|T]):-   %for list with descending order
    HY is H - Y, HY >0.
remove2_(HX, [H|T], Y, [H|TY]):-   %going for another element.
    remove2_(HX, T, Y, TY).


?- remove2([3,2,1],X).
X = [2, 1, 1] ;
X = [2, 2] ;
X = [1, 1] ;
X = [3, 1] ;
false.

?- remove2([1,2,3],X).
X = [1, 3] ;
X = [2, 2] ;
X = [1, 1, 2] ;
X = [1, 1] ;
false.

Ответы на вопрос(2)

Ваш ответ на вопрос