Prolog 代码对列表中的元素求和的问题

Alm*_*4my 3 prolog

希望你一切都好。我对序言相当陌生,我正在编写的代码遇到问题。代码的目的非常简单。它将列表中的每个元素添加到最后一个元素。我可以用 Java 做一些事情:

    static void add(double[] array){
        double x = .0;
        for (int i = 0; i < array.length; ++i)
            x += array[i];
        System.out.println(x);
    }
Run Code Online (Sandbox Code Playgroud)

然而,我一直在摸不着头脑,不知道如何在序言中做到这一点。我有以下代码

add_list([], X):- write(X).
add_list([Head|Tail],X) :- 
    Y is Head,
    X is 0 + Y, %initialize X and add Y every time it runs.
    add_list(Tail, X).
Run Code Online (Sandbox Code Playgroud)

我得到的错误是,当代码第二次运行时,变量 X 已经有界,这是有道理的,但我真的不知道如何解决这个问题。

任何帮助将不胜感激。

谢谢。

fal*_*lse 5

Prolog 程序是关系。使用以开头的名称add_听起来更像是命令式程序。如果你想学习 Prolog,请尽可能避免使用此类名称。在本例中,您希望在列表与其元素之和之间建立关系。list_sum/2听起来是一个更好的名字。

:- use_module(library(clpz)). % or clpfd
:- op(150, fx, #).

list_sum([], 0).
list_sum([E|Es], S) :-
   #S #= #E + #Si,
   list_sum(Es, Si).
Run Code Online (Sandbox Code Playgroud)

现在,根据这个定义,尝试一下!

?- list_sum([1,2,3], N).
   N = 6.
?- list_sum([1,2,3], 7).
   false.
?- list_sum([1,2,E], 7).
   E = 4.
?- list_sum([1,E,E], 7).
   E = 3.
Run Code Online (Sandbox Code Playgroud)