What is the difference between ' and " in Prolog?
Asked Answered
P

2

57

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.

Prohibit answered 25/11, 2011 at 4:1 Comment(2)
In 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.Destined
@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, although as a whole SWI7 is not conforming.Preponderant
P
51

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).

Preponderant answered 25/11, 2011 at 13:33 Comment(2)
Thanks for expanding on the answer above.Prohibit
@Prohibit This answer is correct, while the other is not. It does not "expand" on the other answer.Destined
W
10

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.
Windsail answered 25/11, 2011 at 4:18 Comment(4)
related questionWindsail
Atoms in Prolog are enclosed within single quotes.Edson
Maybe 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.Silberman
This answer is misleading at best. Sadly, it is the accepted answer.Destined

© 2022 - 2024 — McMap. All rights reserved.