5

次のルールがあるとします。

unify('test', 'this is a test').
run :- write('Enter something: '), 
       read(X), 
       unify(X, Y), 
       write('The answer is '), write(Y).

そして、次のように実行します。

?- ['unify.pl'].
% unify.pl compiled 0.00 sec, -48 bytes
true.

?- run.
Enter something: test.
The answer is this is a test
true.

?- run.
Enter something: 'test'.
The answer is this is a test
true.

testSWI-Prolog が と の両方を'test'に統一するのはなぜunify('test', 'this is a test').ですか? SOに関するPrologの質問に答えているときに、これに遭遇しました。私はその人の質問に答えることができましたが、この特定の行動を説明することはできませんでした。

4

2 に答える 2

5

SWI-PROLOG のアトムは、たとえば のように一重引用符を使用して表すことができますが、SWI-PROLOG パーサーが、通常は のような小文字のアルファベット文字で始まる一連の文字からアトムを識別できる場合'This is an atom'、一重引用符は必要testありません。シーケンスに空白 (またはその他の文字) が含まれている場合は、アトムを正しく示すために一重引用符が必要です。英数字とアンダースコアなどの特定の句読点_は問題ありませんtest5_6

一重引用符のない文字列が数字などで始まる6k場合、パーサーはそれをnumber;として扱います。のような大文字のアルファベット文字の場合Test、パーサーはそれを変数として扱います。

于 2010-11-04T20:36:33.600 に答える
3

これは SWI 固有の動作ではなく、標準で必要です。これを見る簡単な方法があります。これは、構文が明らかでない他の用語にも使用できます。トップレベルで次のいずれかを入力します。

?- X = 「テスト」。
X = テスト。

?- X = 'これはテストです'。
X = 「これはテストです」。

答えは常に有効な Prolog テキストです。これは SWI に固有のものですが、YAP、GNU、B、IF、SICStus などの他の多くの Prolog システムにも当てはまります。

これを確認する別の方法は、write_canonical/1 を使用することです。

?- write_canonical(「これはテストです」)。
'これはテストです'
真実。

?- write_canonical([a,b,(c,d),{e,f}])。
'.'(a,'.'(b,'.'(','(c,d),'.'({}(','(e,f)),[]))))
于 2010-11-04T22:37:20.550 に答える