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?
Respuesta
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).
Gracias por ampliar la respuesta anterior. – astay13
@ astay13 Esta respuesta es correcta, mientras que la otra no. No se "expande" en la otra respuesta. –
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.
[pregunta relacionada] (http://stackoverflow.com/questions/4391435/how-to-manipulate-strings-in-prolog) – CamilleLDN
* Los átomos * en Prolog se incluyen entre comillas simples. – Thilo
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
- 1. ¿Cuál es la diferencia entre == y = en Prolog?
- 2. ¿Prolog es un lenguaje sin tipo? ¿Cuál es la diferencia entre Prolog y los lenguajes tipados dinámicamente?
- 3. ¿Cuál es la diferencia entre + = y = +?
- 4. ¿cuál es la diferencia entre:.! y: r !?
- 5. ¿Cuál es la diferencia entre ".equals" y "=="?
- 6. Cuál es la diferencia entre $ y jQuery
- 7. Cuál es la diferencia entre = y: =
- 8. Cuál es la diferencia entre $ (...) y `...`
- 9. ¿Cuál es la diferencia entre dict() y {}?
- 10. ¿Cuál es la diferencia entre [indefinido] y [,]?
- 11. ¿Cuál es la diferencia entre {0} y ""?
- 12. ¿Cuál es la diferencia entre .ToString (+) y ""
- 13. ¿Cuál es la diferencia entre `##` y `hashCode`?
- 14. ¿Cuál es la diferencia entre "$^N" y "$ +"?
- 15. ¿Cuál es la diferencia entre " " y ""?
- 16. ¿Cuál es la diferencia entre @ y $ y% en MSBuild?
- 17. OpenGL (ES) - ¿Cuál es la diferencia entre frustum y orto?
- 18. ¿Cuál es la diferencia entre la abstracción y la encapsulación?
- 19. ¿Cuál es la diferencia entre Session.Abandon() y Session.Clear() en ASP.Net?
- 20. ¿cuál es la diferencia entre didselectrowindexpath y willselectrowindexpath en iphone?
- 21. ¿cuál es la diferencia entre NULL y Empty en mysql
- 22. ¿Cuál es la diferencia entre longblob y longtext en mysql?
- 23. ¿Cuál es la diferencia entre $ @ y $ * en scripts de shell?
- 24. ¿Cuál es la diferencia entre flush y commit en Hibernate?
- 25. ¿Cuál es la diferencia entre iTerm2 y Terminal en Mac?
- 26. ¿Cuál es la diferencia entre @ y @@ en un módulo?
- 27. ¿Cuál es la diferencia entre & y && en MATLAB?
- 28. ¿Cuál es la diferencia entre _isEnabled y isEnabled en Anguila?
- 29. ¿Cuál es la diferencia entre referencias y objetos en Java?
- 30. cuál es la diferencia entre mapa y hashmap en STL
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. –
@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