这是本页的扩展问题。Prolog 可能删除列表中的元素 https://stackoverflow.com/questions/33652059/prolog-possible-removal-of-elements-in-a-list/33652274?noredirect=1#comment55118895_33652274
例如,对于列表 X = [1,2,3],我可以像下面这样进行减法:
第一个/第二个元素减 1,X 变为 [1-1, 2-1, 3] = [0, 1, 3] = [1, 3]
从第一个/第三个元素减 1:X 变为 [2, 2]
从第二个/第三个元素减 1:X 变为 [1, 1, 2]
从第二个/第三个元素中减去 2: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.