Prolog语法-使用函数结果

Prolog语法-使用函数结果,prolog,permutation,Prolog,Permutation,我正在尝试对以下结果执行求和运算: combination(0,_,[]). combination(K,L,[X|Xs]) :- K > 0, el(X,L,R), K1 is K-1, combination(K1,R,Xs). el(X,[X|L],L). el(X,[_|L],R) :- el(X,L,R). 例如,用户将输入is_sum_equal_10([1,2,3,4,5,6,7]),如果任何排列的和等于10,则结果将为真 我正在努力把它们放在一起

我正在尝试对以下结果执行求和运算:

combination(0,_,[]).
combination(K,L,[X|Xs]) :-
   K > 0,
   el(X,L,R),
   K1 is K-1,
   combination(K1,R,Xs).

el(X,[X|L],L).
el(X,[_|L],R) :- el(X,L,R).
例如,用户将输入is_sum_equal_10([1,2,3,4,5,6,7]),如果任何排列的和等于10,则结果将为真


我正在努力把它们放在一起,有没有人能帮我定义一个is_sum_equal_10规则,它在每个排列中使用组合规则?

好的,写起来很容易,真的,你只需要一个规则来说明如果一个特定的组合和为10,然后再加上一个,通过不同大小的组合列表进行统计(这是必需的,因为您使用K编写组合的方式需要在检查规则时减少)


这种方法当然更容易理解,而且效率更高。

谢谢你,KernelJ,给出了如此详细的答案。还有一件事——为了简化任务——我想将排列大小设置为预定义的值5。因此,每次,如果给定列表中的5个整数的排列集的总和为10,则只会检查其中的5个整数。我曾尝试将R值设置为5,但每次计算都会得到错误的答案。给定未知长度的输入列表,为了在每次尝试时检查固定大小的置换集,我需要更改哪个值?谢谢你的帮助!我认为很明显,如何根据已有的代码制定新规则,您只需要在规则中使用组合和总计。这是单行线!自己动手写吧;如果您仍然有问题,请发布您尝试过的内容,然后也许我可以找出您不理解的部分。我尝试的是添加一行额外的内容:is_comb_sum_equal_10(数字,5):-组合(5,数字,C),总计_10(C,0)。现在我用新行替换了初始行(用5代替R的行)除此之外,如果我想添加另一个条件,我可以先写一个新函数,然后再将该条件添加到同一行,如:is comb,sum,equal,10(数字,5):-combion(5,数字,C),totals,10(C,0),first,to,last(C)。它是否能确保新条件将在整个列表中的5个整数的同一当前组合上运行?是的,对于某些集合组合C,所有三个条件必须同时为真。Prolog从左到右检查它们,因此第一个到最后一个条件将只检查5个总计为10的组合。
1 ?- [user].
|: combination(0,_,[]).
|: combination(K,L,[X|Xs]) :- K > 0,
|:    el(X,L,R), K1 is K-1, combination(K1,R,Xs).
|: el(X,[X|L],L).
|: el(X,[_|L],R) :- el(X,L,R).
|: 
|: totals_10([],10).
|: totals_10([X|Xs],T) :- N is T+X, totals_10(Xs,N).
|: 
|: is_comb_sum_equal_10(Numbers,_,R) :- combination(R,Numbers,C), totals_10(C,0).
|: is_comb_sum_equal_10(Numbers,N,R) :- Rnext is R+1, Rnext =< N,
|:    is_comb_sum_equal_10(Numbers,N,Rnext).
|: 
|: is_sum_equal_10(Numbers) :- length(Numbers,N), is_comb_sum_equal_10(Numbers,N,0).
|: 
% user://1 compiled 0.13 sec, 1,824 bytes
true.

2 ?- is_sum_equal_10([2,3,5]).
true .

3 ?- is_sum_equal_10([2,235,124,3,3347,5,2373]).
true .

4 ?- is_sum_equal_10([2,235,124,3,3347,6,2373]).
false.

5 ?- is_sum_equal_10([1,1,1,1,1,-1,1,1,1,1,12]).
false.

6 ?- is_sum_equal_10([1,1,1,1,1,-1,1,1,1,1,11]).
true ;
false.
7 ?- [user].
|: is_subset_sum(0,[]).
|: is_subset_sum(N,[_|Xs]) :- is_subset_sum(N,Xs).
|: is_subset_sum(N,[X|Xs]) :- R is N-X, is_subset_sum(R,Xs).
|: 
% user://2 compiled 0.03 sec, 540 bytes
true.

8 ?- is_subset_sum(10,[3,5,6]).
false.

9 ?- is_subset_sum(10,[123,4,1,77,3,2,34]).
true .

10 ?- is_subset_sum(11,[0,2,4,6,8,10,12,14,16,18,20,22]).
false.