3

我对 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).

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

4

3 回答 3

3

你的问题是;/2. 如果你发出 alisting(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) )).
于 2012-05-22T15:31:10.360 回答
2

析取 (;) 当前通过以下任一方式成功:

  1. 将“测试”分配给 X,将 y 分配给 S 并写入 X。或者,如果失败,则回溯并
  2. 将 n 分配给 S 并写 X

添加一些括号以使其按预期工作。

test(S):-
X = 'testing',
    (
        (S = y, write(X) )
    ; 
        (S = n, write(X) )
    ).
于 2012-05-22T15:33:03.227 回答
2

让我为您重新缩进代码:

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

我希望现在你写的内容更清楚了。

于 2012-05-22T15:44:12.803 回答