Prolog忘记/取消实例化我的变量?

时间:2012-05-22 15:23:54

标签: prolog

我对Prolog很新,而且我遇到的问题似乎是我的变量被遗忘了

test(S) :-
X = 'testing',
(S = y, write(X) );
(S = n, write(X) ).

运行

test(y)

按预期打印文本,但

test(n)

打印出来

_L160

我假设这意味着该变量是不会进行的?为什么会这样?

我知道它可以将它吐成两个谓词,如:

test(y) :- X = 'testing', write(X).
test(n) :- X = 'testing', write(X).

但我的实际问题在于一个更大的谓词,不能像这样简化。

3 个答案:

答案 0 :(得分:3)

您的问题是;/2的优先顺序。 如果你发出listing(test/1),你会得到这个:

 test(A) :-
    (   B=testing,
        A=y,
        write(B)
    ;   A=n,
        write(B)
    ).

显示了解释器如何读取您的代码。

您应该将代码括起来以获得您想要的内容:

test(S) :-
   X = 'testing',
   ((S = y, write(X) );
    (S = n, write(X) )).

答案 1 :(得分:2)

分离(;)目前成功:

  1. 将'testing'分配给X,y分配给S并写入X. 或者,如果失败,则回溯并
  2. 将n分配给S并写入X
  3. 添加一些括号,使其按预期工作。

    test(S):-
    X = 'testing',
        (
            (S = y, write(X) )
        ; 
            (S = n, write(X) )
        ).
    

答案 2 :(得分:2)

让我为你重新缩进代码:

test(S) :-
        (   X = 'testing', S = y, write(X)
        ;   S = n, write(X)
        ).

我希望现在更清楚你写的是什么。