Prologの 'と'の違いは何ですか?

特に、ファイルをロードするときには、? - ['test1.pl']。が機能しますが、 code>? - ["test1.pl"]。はそうではありません。

40
@Boris: set_prolog_flag(double_quotes、atom)の両方のクエリは、IF/Prologでデフォルトで例示されているものと同じです。 SWI7でも rel="nofollow noreferrer">はより良いことができます。 SWI7は準拠していません。
追加された 著者 false,
SWI-Prolog 7以降では、どちらも同じ意味を持ちます。誰かが必ず指摘するように、これはISO-Prologに準拠した動作ではありません。そして、間違っているので、現在受け入れられている回答を受け入れてください。
追加された 著者 user1812457,

2 答え

一重引用符で囲まれた項目は常にアトムです。

二重引用符の意味は、Prologフラグ double_quotes に依存します。


atom — with this value "a" = a. Nowadays, this is rarely used. But you will find Prolog books where ["abc.pl"] is written.


codes — a list of character codes. This is frequently the default, but it leads to very unreadable answers like

?- set_prolog_flag(double_quotes,codes).
true.

?- phrase(("Ja tvoi ",("sluga"|"rabotnik"),"!"), Satz).
Satz = [74,97,32,116,118,111,105,32,115,108,117,103,97,33] ;
Satz = [74,97,32,116,118,111,105,32,114,97,98,111,116,110,105,107,33].

さらに悪いことに、ASCII以外の文字を使用すると:

?- phrase(("Я твой ",("слуга"|"работник"),"!"), Satz).
Satz = [1071,32,1090,1074,1086,1081,32,1089,1083,1091,1075,1072,33] ;
Satz = [1071,32,1090,1074,1086,1081,32,1088,1072,1073,1086,1090,1085,1080,1082,33].

chars — a list of one-char atoms. See this for more about it.

?- set_prolog_flag(double_quotes,chars).
true.

?- phrase(("Ja tvoi ",("sluga"|"rabotnik"),"!"), Satz).
Satz = ['J',a,' ',t,v,o,i,' ',s,l,u,g,a,!] ;
Satz = ['J',a,' ',t,v,o,i,' ',r,a,b,o,t,n,i,k,!].

?- phrase(("Я твой ",("слуга"|"работник"),"!"), Satz).
Satz = ['Я',' ',т,в,о,й,' ',с,л,у,г,а,!] ;
Satz = ['Я',' ',т,в,о,й,' ',р,а,б,о,т,н,и,к,!].

この表記法は、より判読可能な回答を提供します。二重引用符記法は1文字のアトムの任意のリストの印刷に使用できるので、よりコンパクトに表示することができます。 SICStus および SWI を参照してください。

?- use_module(library(double_quotes)).
true.

?- phrase(("Ja tvoi ",("sluga"|"rabotnik"),"!"), Satz).
Satz = "Ja tvoi sluga!" ;
Satz = "Ja tvoi rabotnik!".

?- phrase(("Я твой ",("слуга"|"работник"),"!"), Satz).
Satz = "Я твой слуга!" ;
Satz = "Я твой работник!".

If you have difficulties installing double_quotes.pl as a library, simply put it into the directory of your other Prolog files and say: use_module(double_quotes).

34
追加された
上記の答えを拡大していただきありがとうございます。
追加された 著者 astay13,
@ astay13この答えは正しいのですが、もう一方は正しくありません。それは他の答えで "展開"しません。
追加された 著者 user1812457,

Prologの文字列は一重引用符で囲まれています。二重引用符で書かれた用語は、すぐに文字コードのリストに変換されます。

?- write('sdf').
sdf
true.

?- write("sdf").
[115, 100, 102]
true.
13
追加された
Prologの Atoms は一重引用符で囲みます。
追加された 著者 Thilo,
追加された 著者 CamilleLDN,
たぶんマイナーな資格:原子は通常書き留められているだけです。そうでなければ他の何か(例えば変数のようなもの)と誤認される場合にのみ、それらを一重引用符で囲みます。あなたは任意にすべての場合にそれを行うことができます、それは無意味です。
追加された 著者 mat,
この答えはせいぜい誤解を招きます。悲しいことに、それは受け入れられた答えです。
追加された 著者 user1812457,