Prolog中使用If-Else语句的递归函数

时间:2012-04-22 03:04:21

标签: if-statement recursion prolog iso-prolog

我正在尝试在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)
        )
    ).

3 个答案:

答案 0 :(得分:2)

您一直在使用2*X+Y这个词。为什么不先计算 然后将结果用于实际计算?也许你错过了问题陈述中的某些内容?

为什么要排除XYN都为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
        )
    ).