I am new to Prolog and noticed that ' and " give different behavior, but am curious as to why. Specifically, when loading a file, ?- ['test1.pl'].
works, while ?- ["test1.pl"].
doesn't.
-
1In SWI-Prolog 7 and later, both work and mean the same. As someone will surely point out, this is not ISO-Prolog compliant behaviour. And please, un-accept the currently accepted answer because it is incorrect. – Sep 08 '15 at 13:10
-
4@Boris: with `set_prolog_flag(double_quotes, atom)` both queries are the same as is exemplified by default in IF/Prolog. Even SWI7 [can do better](http://www.complang.tuwien.ac.at/ulrich/iso-prolog/SWI7_and_ISO#strings_less_non_conforming), although as a whole SWI7 is not conforming. – false Oct 16 '15 at 09:54
2 Answers
Single quoted items are always atoms.
The meaning of double quotes depends on the Prolog flag 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. In older systems 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].
Even worse, if you use characters beyond 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 = ['Я',' ',т,в,о,й,' ',р,а,б,о,т,н,и,к,!].
This notation gives more readable answers and is the default in Scryer, Tau, Trealla, and Ichiban. Scryer and Trealla display them even more compactly with the double quote notation for printing any list of one-char atoms. For SICStus and SWI this can be emulated with the following library.
?- 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).

- 10,264
- 13
- 101
- 209
-
1
-
8@astay13 This answer is correct, while the other is not. It does not "expand" on the other answer. – Jul 15 '15 at 12:07
Strings in Prolog are written in single quotes. Terms written in double quotes are immediately converted to a list of character codes.
?- write('sdf').
sdf
true.
?- write("sdf").
[115, 100, 102]
true.

- 850
- 6
- 11
-
1[related question](http://stackoverflow.com/questions/4391435/how-to-manipulate-strings-in-prolog) – CamilleLDN Nov 25 '11 at 04:19
-
12
-
18Maybe a minor qualification: Atoms are usually just written down. Only if they would otherwise be mistaken for something else (like for example a variable) do you enclose them in single quotes. You can optionally do it in every case, only it's pointless. – mat Nov 25 '11 at 07:28
-
6