3

私はPrologを初めて使用し、変数が忘れられているように見える問題を抱えています

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

ランニング

test(y)

期待どおりにテキストを出力しますが、

test(n)

プリントアウト

_L160

変数がインスタンス化されていないことを意味すると思いますか? なぜこうなった?

次のような2つの述語に吐き出すことができることを私は知っています:

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

しかし、私の実際の問題は、このように単純化できないはるかに大きな述語にあります。

4

3 に答える 3

3

あなたの問題は の優先順位です;/2。a を発行すると、次の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) )).
于 2012-05-22T15:31:10.360 に答える
2

コードを再度インデントします。

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

あなたが実際に書いたことがより明確になることを願っています。

于 2012-05-22T15:44:12.803 に答える
2

論理和 (;) は現在、次のいずれかによって成功します。

  1. 'testing' を 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 に答える