如果我尝试
logPower(X, N, REZ) :-
N mod 2 =:= 0,
!,
N1 is N/2,
logPower(X, N1, REZ1),
REZ is REZ1*REZ.
它没有用,我得到了
ERROR: is/2: Arguments are not sufficiently instantiated
但是如果我尝试
logPower(X, N, REZ) :-
N mod 2 =:= 0,
!,
N1 is N-1,
logPower(X, N1, REZ1),
REZ is REZ1*REZ.
它有效。
我如何编辑第一个工作?
答案 0 :(得分:0)
答案已经给出了in a comment,但我会稍微扩展一下来解释究竟发生了什么。
问题在于REZ is REZ1*REZ
行。谓词is/2
需要将右侧的所有参数都实例化,就像错误消息告诉您的那样。但是您尝试将REZ
用作变量,它不是。
现在我假设你有另一个子句服务器作为logPower/3
的停止点(或起点,取决于你如何看待它),否则你会有一个无限循环,但问题仍然存在,为什么第一个版本产生错误而不是第二个版本,因为它们都包含相同的行REZ is REZ1*REZ
?
好吧,您的第二个版本将行N1 is N/2
替换为N1 is N-1
,之后您再次“呼叫”logPower/3
。您检查了N
是否为偶数,然后您将其除以2或减去1.在前一种情况下,如果N
可由 4 分割,则N1
将仍然是均匀的,让你有机会达到logPower/3
的起点并达到解决问题的路线
但是在后一种情况下,N1
不会是偶数,你会失败,没有遇到错误,除了N
会使你在失败之前达到起点,因为偶数/奇数 - 检查。