我正在尝试在prolog中编写递归函数,该函数在不使用指数运算符的情况下计算R = (2*X + Y)^N
。我用if-else语句编写了一个递归函数,我收到错误:) or operator expected
。在我看来,我的语法正确,但我必须遗漏一些东西。代码如下。
expbar(R, X, Y, N) :-
(X =:= Y =:= N =:= 0 ->
write("No two variables can equal 0 at the same time.");
(N =:= 0 ->
R is 2 * X + Y;
R is (2 * X + Y) * expbar(R, X, Y, N-1)
)
).
答案 0 :(得分:2)
您一直在使用2*X+Y
这个词。为什么不先计算 然后将结果用于实际计算?也许你错过了问题陈述中的某些内容?
为什么要排除X
,Y
和N
都为0的情况? ......虽然你不排除N < 0
的情况?
在Prolog中将结果放在相应的输入参数后很常见。此规则有例外,(is)/2
是最常见的示例,但它是作为中缀运算符编写的。
对于无法正确处理的情况,Prolog中有两个选项。要么你默默地失败,要么你发出一个干净的错误。 (还有第三个循环,虽然不理想但仍然比成功更好。)目前,你写出一个文本,然后你成功了。所以你假设有人会阅读你的信息。但是,程序通常无人值守,而且忽略了消息。
想象一下,我想用你的定义证明你的定义是 答案的问题:
?- expbar(42, 0, 0, 0).
这是我在将X =:= Y =:= N =:= 0
重写为X =:= 0, Y =:= 0, N =:= 0
后在SWI中获得的内容。
?- expbar(42, 0, 0, 0). [78,111,32,116,119,111,32,118,97,114,105,97,98,108,101,115,32,99,97,110,32,101,113,117,97,108,32,48,32,97,116,32,116,104,101,32,115,97,109,101,32,116,105,109,101,46] true.
它说true.
!以上这些数字肯定是来自如此高度复杂的计算的一些进展信息......所以很容易误读你的信息。如果您使用单引号会更容易一些。 More about single and double quotes。但即使有更可读的消息,也很容易跳过它。
处理这种情况的正确方法是发出错误:
throw(error(Error_term,_More_info))
以这种方式中止计算并且错误由顶层(或catch/3
处理它的下一个地方)处理。这降低了错误被误解的可能性。
理想情况下,Error_term
应该是现有的错误术语之一。
这是complete list of errors in ISO Prolog。
在您的情况下,它可能与definition of exponentiation类似evaluation_error(undefined)
。
答案 1 :(得分:0)
expbar不是一个函数。正确是
expbar(R, X, Y, N) :-
(X =:= Y =:= N =:= 0 ->
write("No two variables can equal 0 at the same time.");
(N =:= 0 ->
R is 2 * X + Y;
N1 is N - 1,
expbar(R1, X, Y, N1)
R is (2 * X + Y) * R1
)
).
答案 2 :(得分:0)
初始条件时应该有语法错误。 添加到joel76回答:
expbar(R, X, Y, N) :-
( ( X =:= 0, Y =:= 0 ; X =:= 0, N =:= 0 ; Y =:= 0, N =:= 0 )
-> write("No two variables can equal 0 at the same time.")
; ( N =:= 0
-> R is 2 * X + Y
; N1 is N - 1,
expbar(R1, X, Y, N1),
R is (2 * X + Y) * R1
)
).