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, ?- ['']. works, while ?- [""]. 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 [""] 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).
    ?- 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).
    ?- 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)).
    ?- phrase(("Ja tvoi ",("sluga"|"rabotnik"),"!"), Satz).
       Satz = "Ja tvoi sluga!"
    ;  Satz = "Ja tvoi rabotnik!".
    ?- phrase(("Я твой ",("слуга"|"работник"),"!"), Satz).
       Satz = "Я твой слуга!"
    ;  Satz = "Я твой работник!".

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