Prolog-打印从1到10的偶数之和
我正在尝试使用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] 过滤它,排除奇数 对列表中的元素求和 代码:
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:您应该添加它作为另一个答案选择。