Prolog错误:是/ 2

时间:2016-01-10 12:09:54

标签: prolog

如果我尝试

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.

它有效。

我如何编辑第一个工作?

1 个答案:

答案 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会使你在失败之前达到起点,因为偶数/奇数 - 检查。