What is the difference between ' and " in Prolog?

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.


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. 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 and Trealla which 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).


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.