2011-11-25 30 views
39

Soy nuevo en Prolog y noté que' y 'dan un comportamiento diferente, pero tengo curiosidad por saber por qué. Específicamente, al cargar un archivo, ?- ['test1.pl']. funciona, mientras que ?- ["test1.pl"]. no funciona.¿Cuál es la diferencia entre 'y "en Prolog?

+1

En SWI-Prolog 7 y versiones posteriores, tanto en el trabajo y significa lo mismo. Como alguien seguramente señalará, este no es el comportamiento conforme a ISO-Prolog. Y, por favor, no acepte la respuesta actualmente aceptada porque es incorrecta. –

+4

@Boris: con 'set_prolog_flag (double_quotes, atom)' ambas consultas son las mismas que se ejemplifican de forma predeterminada en IF/Prolog. Incluso SWI7 [puede hacerlo mejor] (http://www.complang.tuwien.ac.at/ulrich/iso-prolog/SWI7_and_ISO#strings_less_non_conforming), aunque en general SWI7 no se está cumpliendo. – false

Respuesta

32

Los elementos de una sola cita son siempre los átomos.

El significado de comillas dobles depende de la bandera Prolog double_quotes:


atom — con este valor "a" = a. Hoy en día, esto se usa raramente. Pero encontrará libros de Prolog donde se escribe ["abc.pl"].


codes — una lista de códigos de caracteres. Esto es con frecuencia el valor por defecto, pero conduce a respuestas muy ilegibles como

 
?- 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]. 

Peor aún, si utiliza caracteres más allá 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 — una lista de uno -char átomos. See this para obtener más información al respecto.

 
?- 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 = ['Я',' ',т,в,о,й,' ',р,а,б,о,т,н,и,к,!]. 

Esta notación da respuestas más legibles. Se puede mostrar de forma aún más compacta, ya que la notación de comillas dobles se puede utilizar para imprimir cualquier lista de átomos de un solo carácter. Hay library(double_quotes) para SICStus y 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 = "Я твой работник!". 

Si tiene dificultades para instalar double_quotes.pl como una biblioteca, sólo tiene que ponerlo en el directorio de sus otros archivos Prolog y decir: use_module(double_quotes).

+1

Gracias por ampliar la respuesta anterior. – astay13

+7

@ astay13 Esta respuesta es correcta, mientras que la otra no. No se "expande" en la otra respuesta. –

12

Las cadenas en Prolog están escritas entre comillas simples. Los términos escritos entre comillas dobles se convierten inmediatamente a una lista de códigos de caracteres.

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

?- write("sdf"). 
[115, 100, 102] 
true. 
+1

[pregunta relacionada] (http://stackoverflow.com/questions/4391435/how-to-manipulate-strings-in-prolog) – CamilleLDN

+10

* Los átomos * en Prolog se incluyen entre comillas simples. – Thilo

+15

Tal vez una calificación menor: los átomos generalmente se acaban de escribir. Solo si de otro modo se confundirían con otra cosa (como, por ejemplo, una variable), los incluyes entre comillas simples. Opcionalmente puedes hacerlo en todos los casos, solo que no tiene sentido. – mat

Cuestiones relacionadas