write tutorial swipl swi source programas open ejemplos down comandos prolog double-quotes dcg iso-prolog

tutorial - ¿Cuál es la diferencia entre ''y "en Prolog?



swipl editor (2)

Soy nuevo en Prolog y me di cuenta de 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.


Las cadenas en Prolog están escritas en 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.


Los elementos únicos citados son siempre átomos.

El significado de las comillas dobles depende del indicador de Prolog double_quotes :

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

codes - una lista de códigos de caracteres. Esto es frecuentemente el predeterminado, 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 usa caracteres más allá de 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 átomos de un char. Vea esto 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 una 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, simplemente double_quotes.pl en el directorio de sus otros archivos Prolog y diga: use_module(double_quotes).