Prolog:找出所有列表元素的总和是否等于 N

Prolog: Find out if sum of all list elements equals N

我想检查列表中的所有值是否相加。到目前为止,我已经写了以下内容:

list_sum([Head|Tail], Sum) :-
    list_sum(Tail, Sum1),
    Sum is Head + Sum1.

但是,当我尝试 list_sum([1,2,3,4], 10) Prolog returns false 时。 有人可以帮帮我吗?我不知道我做错了什么。

使用!

:- use_module(library(clpfd)).

要计算整数列表的总和,只需使用 库谓词 sum/3:

?- sum([1,2,3,4], #=, S).                 % Q: What is 1+2+3+4?
S = 10.                                   % A: Sum is 10

?- sum([1,2,3,4], #=, 10).                % Q: Does 1+2+3+4 equal 10?
true.                                     % A: yes, it does

?- sum([1,2,3,4], #=, 11).                % Q: Does 1+2+3+4 equal 11?
false.                                    % A: no, it doesn't

显示使用 clpfd 而不是 (is)/2 的好处的用例,@CapelliC 建议:

?- [A,B,C] ins 1..sup, sum([A,B,C,A], #=, 12), labeling([], [A,B,C]).
   A = B, B = 1, C = 9
;  A = 1, B = 2, C = 8
;  A = 1, B = 3, C = 7
;  A = 1, B = 4, C = 6
;  A = 1, B = C, C = 5
;  A = 1, B = 6, C = 4
;  A = 1, B = 7, C = 3
;  A = 1, B = 8, C = 2
;  A = C, B = 9, C = 1
;  A = 2, B = 1, C = 7
;  A = B, B = 2, C = 6
;  A = 2, B = 3, C = 5
;  A = 2, B = C, C = 4
;  A = 2, B = 5, C = 3
;  A = C, B = 6, C = 2
;  A = 2, B = 7, C = 1
;  A = 3, B = 1, C = 5
;  A = 3, B = 2, C = 4
;  A = B, B = C, C = 3
;  A = 3, B = 4, C = 2
;  A = 3, B = 5, C = 1
;  A = 4, B = 1, C = 3
;  A = 4, B = C, C = 2
;  A = 4, B = 3, C = 1
;  A = 5, B = C, C = 1.

在我看来,这很简单。

试试这个:

list_sum([], 0).
list_sum([Head|Tail], Sum):-
    list_sum(Tail, Sum1),
    Sum is Head + Sum1.