Prolog-打印从1到10的偶数之和

Prolog-打印从1到10的偶数之和,prolog,Prolog,我正在尝试使用Prolog打印从1到10的所有偶数,下面是我尝试过的: printn(10,0):- write(10),!. printn(X,Sum):- ( X mod 2 =:= 0 -> Sum is X+Sum, Next is X+1, nl, printn(Next); Next is X+1, printn(Next) ). 但它返回false 您有什么错误?以下是我的解决方案: 创建列表[1…10] 过滤它,排除奇数 对列表中的元素求和 代码:

我正在尝试使用Prolog打印从1到10的所有偶数,下面是我尝试过的:

printn(10,0):- write(10),!.
printn(X,Sum):- 
    ( X mod 2 =:= 0 -> Sum is X+Sum, Next is X+1, nl, printn(Next);
      Next is X+1, printn(Next) ).

但它返回false

您有什么错误?以下是我的解决方案:

创建列表[1…10] 过滤它,排除奇数 对列表中的元素求和 代码:


现在您可以调用sumofevenums1,10,N

您有什么错误?以下是我的解决方案:

创建列表[1…10] 过滤它,排除奇数 对列表中的元素求和 代码:


现在,您可以调用sumofevenums1,10,N

您不需要从一开始就用数字创建列表,最好检查一次数字:

print(X,Y):-print_even(X,Y,0).

print_even(X, X, Sum):- 
    (   X mod 2 =:= 0 -> Sum1 is X+Sum; 
        Sum1 = Sum
    ), print(Sum1).
print_even(X, Y, Sum):- 
    X<Y, Next is X+1,
    (   X mod 2 =:= 0 -> Sum1 is X+Sum, print_even(Next, Y, Sum1); 
        print_even(Next, Y, Sum)
    ).

您不需要从一开始就创建包含数字的列表,最好只检查一次数字:

print(X,Y):-print_even(X,Y,0).

print_even(X, X, Sum):- 
    (   X mod 2 =:= 0 -> Sum1 is X+Sum; 
        Sum1 = Sum
    ), print(Sum1).
print_even(X, Y, Sum):- 
    X<Y, Next is X+1,
    (   X mod 2 =:= 0 -> Sum1 is X+Sum, print_even(Next, Y, Sum1); 
        print_even(Next, Y, Sum)
    ).

获取Prolog输出最有用的方法是在变量中捕获解决方案,可以通过回溯单独捕获,也可以在列表中捕获。使用其他语言遗留下来的打印思想允许格式化等,但并不被认为是表达解决方案的最佳方式

在Prolog中,您希望将问题表示为一个关系。例如,我们可能会说,如果X是一个小于或等于Max的偶数,那么即使带有Max,Max也是true或successful。在Prolog中,当使用整数进行推理时,您希望使用CLPFD库

:- use_module(library(clpfd)).

even_up_to(X, Max) :-
    X in 1..Max,
    X mod 2 #= 0,   % EDIT: as suggested by Taku
    label([X]).
这将产生:

3 ?- even_up_to(X, 10).
X = 2 ;
X = 4 ;
X = 6 ;
X = 8 ;
X = 10.

如果您想收集到一个列表中,可以使用:findallX、even\up\u toX、Evens。

获取Prolog输出的最有用的方法是在变量中捕获解决方案,可以通过回溯单独捕获,也可以在列表中捕获。使用其他语言遗留下来的打印思想允许格式化等,但并不被认为是表达解决方案的最佳方式

在Prolog中,您希望将问题表示为一个关系。例如,我们可能会说,如果X是一个小于或等于Max的偶数,那么即使带有Max,Max也是true或successful。在Prolog中,当使用整数进行推理时,您希望使用CLPFD库

:- use_module(library(clpfd)).

even_up_to(X, Max) :-
    X in 1..Max,
    X mod 2 #= 0,   % EDIT: as suggested by Taku
    label([X]).
这将产生:

3 ?- even_up_to(X, 10).
X = 2 ;
X = 4 ;
X = 6 ;
X = 8 ;
X = 10.

如果您想收集到一个列表中,可以使用:findallX,even\up\u toX,Evens。

在ECLiPSe中,您可以使用迭代器编写:

sum_even(Sum):-
( for(I,1,10),fromto(0,In,Out,Sum)
    do
  (I mod 2 =:= 0 -> Out is In + I;Out is In)
)

在ECLiPSe中,您可以使用迭代器编写:

sum_even(Sum):-
( for(I,1,10),fromto(0,In,Out,Sum)
    do
  (I mod 2 =:= 0 -> Out is In + I;Out is In)
)
与:

感谢@capelical的灵感。

包括:



感谢@capelical的启发。

有没有不使用列表解决此问题的方法?有没有不使用列表解决此问题的方法?出现了什么错误?无论如何,如果您不想打印所有数字,那么不应该在两个分支中都有printn调用!在prolog中不能像“Sum是X+Sum”那样写。无法更改Prolog的变量。出现了什么错误?无论如何,如果您不想打印所有数字,那么不应该在两个分支中都有printn调用!在prolog中不能像“Sum是X+Sum”那样写。无法更改Prolog的变量。该变量不起作用,,它打印以下错误未捕获异常:errorexistence\u errorprocedure,p/1,print\u偶数/3Hmm。。。似乎您还没有加载print_-even/3,请确保您已将上述代码复制粘贴到file.pl中,并再次查阅,然后告诉我…不起作用,,它会打印以下错误未捕获的异常:errorexistence_-errorprocedure,p/1,print_-even/3Hmm-weird。。。似乎您还没有加载print_even/3,请确保您已将上述代码复制粘贴到file.pl中,然后再次查阅并告诉我……我认为在“label”之前写入“X mod 2=0”约束更好。@TakuKoyahata我同意。我没有机会查看mod是否受CLPFD支持。在Carlo到达这里之前,聚合sume,介于1,10,E,E mod 2=:=0,Sum。@DanielLyons:你应该把它作为另一个答案选择。我认为在'label'之前写'X mod 2=0'约束更好。@TakuKoyahata我同意。我没有机会查看mod是否受CLPFD支持。在Carlo到达这里之前,聚合sume,介于1,10,E,E之间mod 2=:=0,Sum。@DanielLyons:您应该添加它作为另一个答案选择。