参数未实例化,需要它从零开始但也能够更改它
Argument is not instantiated, need it to start at zero but also be able to change it
每当我 运行 我的代码时,我都会收到一个错误,指出参数未实例化。
ads(X,Z):- mod(X,2) =:= 0, Z is Z+X.
ads(X,Z) :- mod(N,2) =\= 0,Z is Z.
sum_of_nums(0,0,0).
sum_of_nums(X,Y,Z) :- X=<Y, ad(X,Z), sum_of_nums(X+1,Y,Z).
我希望能够将 X 到 Y 中的数字相加,但只能是偶数。不知道为什么不行。
首先,有一些小错误,你的编译器应该指出,比如第二个子句中不必要的单例变量。修复此问题并用广告替换广告后,我们有:
ad(X,Z):- mod(X,2) =:= 0, Z is Z+X.
ad(X,Z) :- mod(X,2) =\= 0,Z is Z.
sum_of_nums(0,0,0).
sum_of_nums(X,Y,Z) :- X=<Y, ad(X,Z), sum_of_nums(X+1,Y,Z).
?- sum_of_nums(1,2,S).
caught: error(instantiation_error,(is)/2)
为了定位这个错误,我将插入一些目标 false
这样
结果程序仍然产生这个实例化错误。
ad(X,Z):- mod(X,2) =:= 0, Z is Z+X, false.
ad(X,Z) :- false, mod(X,2) =\= 0,Z is Z.
sum_of_nums(0,0,0) :- false.
sum_of_nums(X,Y,Z) :- X=<Y, ad(X,Z), false, sum_of_nums(X+1,Y,Z).
?- sum_of_nums(1,2,S).
caught: error(instantiation_error,(is)/2)
因此,你这部分已经有错误了。
是 Z is Z+X
。在 (is)/2
的右手边,你总是
需要具有实例化(已知)的变量。 Z
不是
已知。
Prolog 中的变量有点不同。您不能重新分配它们。
而且,直接在 Prolog 中写这个并不能真正显示出
语言擅长。
sum_of(X, Y, 0) :-
X > Y.
sum_of(X1, Y, Z1) :-
X1 =< Y,
( X1 mod 2 =:= 0 -> S = X1 ; S = 0 ),
X2 is X1+1,
sum_of(X2, Y, Z2),
Z1 is Z2+S.
更惯用的方式是:
?- between(1,6,N).
N = 1
; N = 2
; N = 3
; N = 4
; N = 5
; N = 6.
?- between(1,6,N), N mod 2 =:= 0.
N = 2
; N = 4
; N = 6.
?- findall(N, ( between(1,6,N), N mod 2 =:= 0 ), Ns).
Ns = [2,4,6].
?- findall(N, ( between(1,6,N), N mod 2 =:= 0 ), Ns), sum_list(Ns,Sum).
Ns = [2,4,6], Sum = 12.
sum_of(X,Y,Sum) :-
findall(N, ( between(X,Y,N), N mod 2 =:= 0 ), Ns),
sum_list(Ns,Sum).
每当我 运行 我的代码时,我都会收到一个错误,指出参数未实例化。
ads(X,Z):- mod(X,2) =:= 0, Z is Z+X.
ads(X,Z) :- mod(N,2) =\= 0,Z is Z.
sum_of_nums(0,0,0).
sum_of_nums(X,Y,Z) :- X=<Y, ad(X,Z), sum_of_nums(X+1,Y,Z).
我希望能够将 X 到 Y 中的数字相加,但只能是偶数。不知道为什么不行。
首先,有一些小错误,你的编译器应该指出,比如第二个子句中不必要的单例变量。修复此问题并用广告替换广告后,我们有:
ad(X,Z):- mod(X,2) =:= 0, Z is Z+X.
ad(X,Z) :- mod(X,2) =\= 0,Z is Z.
sum_of_nums(0,0,0).
sum_of_nums(X,Y,Z) :- X=<Y, ad(X,Z), sum_of_nums(X+1,Y,Z).
?- sum_of_nums(1,2,S).
caught: error(instantiation_error,(is)/2)
为了定位这个错误,我将插入一些目标 false
这样
结果程序仍然产生这个实例化错误。
ad(X,Z):- mod(X,2) =:= 0, Z is Z+X, false.ad(X,Z) :- false, mod(X,2) =\= 0,Z is Z.sum_of_nums(0,0,0) :- false. sum_of_nums(X,Y,Z) :- X=<Y, ad(X,Z), false,sum_of_nums(X+1,Y,Z). ?- sum_of_nums(1,2,S). caught: error(instantiation_error,(is)/2)
因此,你这部分已经有错误了。
是 Z is Z+X
。在 (is)/2
的右手边,你总是
需要具有实例化(已知)的变量。 Z
不是
已知。
Prolog 中的变量有点不同。您不能重新分配它们。
而且,直接在 Prolog 中写这个并不能真正显示出 语言擅长。
sum_of(X, Y, 0) :-
X > Y.
sum_of(X1, Y, Z1) :-
X1 =< Y,
( X1 mod 2 =:= 0 -> S = X1 ; S = 0 ),
X2 is X1+1,
sum_of(X2, Y, Z2),
Z1 is Z2+S.
更惯用的方式是:
?- between(1,6,N).
N = 1
; N = 2
; N = 3
; N = 4
; N = 5
; N = 6.
?- between(1,6,N), N mod 2 =:= 0.
N = 2
; N = 4
; N = 6.
?- findall(N, ( between(1,6,N), N mod 2 =:= 0 ), Ns).
Ns = [2,4,6].
?- findall(N, ( between(1,6,N), N mod 2 =:= 0 ), Ns), sum_list(Ns,Sum).
Ns = [2,4,6], Sum = 12.
sum_of(X,Y,Sum) :-
findall(N, ( between(X,Y,N), N mod 2 =:= 0 ), Ns),
sum_list(Ns,Sum).