【发布时间】:2016-02-15 06:33:06
【问题描述】:
这是此页面的一个扩展问题。 Prolog possible removal of elements in a list
例如,对于一个列表 X = [1,2,3],我可以像下面这样减去:
从第一个/第二个元素中减去 1,X 变为 [1-1, 2-1, 3] = [0, 1, 3] = [1, 3]
从第一个/第三个元素中减去 1:X 变为 [2, 2]
从第 2/3 个元素中减去 1:X 变为 [1, 1, 2]
从第 2/3 个元素中减去 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.
【问题讨论】:
-
您能否举例说明您希望查询的外观?以及您真正想要如何定义谓词的作用?不是很清楚。
-
我已经尝试使用
permutation([1,2,3], X)来获取所有可能的组合,这样我就可以简单地从列表中获取前两个元素。减法后,我可以简单地通过排序得到结果。但是,我发现这种方式有一些重复.. -
@lurker 所以,我总是可以对列表中的任意 2 个元素进行减法运算。但是在减法之后,元素必须始终大于或等于 0。并且对于减法,两个元素必须用相同的数字相减,即
E1 - N = R1 >= 0和E2 - N = R2 >= 0。和我之前的问题一样,如果 R1 或 R2 = 0,它必须从列表中删除。它更有意义吗? -
@lurker 很抱歉描述的混乱。实际上我已经研究这个问题一个星期了...我完全不知道..
-
不,我的错。我只是愚蠢。现在似乎很清楚了。
标签: list search prolog subtraction