SWI-Progologは、引用された引用符で引用されていない文字列(スペースなし)を同じルールに統合するのですか?
-
29-09-2019 - |
質問
次のルールがあると仮定します。
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.
なぜSwi-progologは両方を統合するのですか test
と 'test'
に unify('test', 'this is a test').
?私はこれに出会いました。私はその人の質問に答えることができましたが、私はこの特定の行動を説明することができませんでした、そして、私は他の誰かができるかどうか疑問に思っていました。
解決
一方、swi-プロログの原子は、単一の引用を使用して示すことができますが、例えば 'This is an atom'
, 、単一の引用はです 必要ありません Swi-progologパーサーが一連の文字から原子を識別できる場合、通常は小文字のアルファベット文字から始まります。 test
. 。シーケンスにWhitespace(または他の文字)が含まれている場合、原子を適切に示すために単一の引用符が必要です。英数字の文字とアンダースコアのような特定の句読点 _
たとえば大丈夫です test5_6
.
単一の引用のない文字シーケンスが、数字などの他のものから始めることになった場合 6k
, 、パーサーはそれをaとして扱います number
;それが次のような大文字のアルファベット文字の場合 Test
, 、パーサーはそれを変数として扱います。
他のヒント
これはSWI固有の動作ではありません - 標準で必要です。これを見る簡単な方法があります。これは、構文が明らかでない他の用語にも使用できます。トップレベルでのタイプ:
?- X = 'test'. X = test. ?- X = 'this is a test'. X = 'this is a test'.
答えは常に有効なプロログテキストです - これはSWIに固有のものですが、YAP、GNU、B、if、sicstusなどの他の多くのプロログシステムにも固有です。
これを見る別の方法は、write_canonical/1を使用することです。
?- write_canonical('this is a test'). 'this is a test' true. ?- write_canonical([a,b,(c,d),{e,f}]). '.'(a,'.'(b,'.'(','(c,d),'.'({}(','(e,f)),[]))))