SWI-Progologは、引用された引用符で引用されていない文字列(スペースなし)を同じルールに統合するのですか?

StackOverflow https://stackoverflow.com/questions/4100943

質問

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

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)),[]))))
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top