2010-11-04 11 views
5

Supongamos que tengo las siguientes reglas:¿Por qué SWI-Prolog unifica una cadena entre comillas y sin comillas (sin espacios) para la misma regla?

unify('test', 'this is a test'). 
run :- write('Enter something: '), 
     read(X), 
     unify(X, Y), 
     write('The answer is '), write(Y). 

Y luego lo ejecuto de la siguiente manera:

?- ['unify.pl']. 
% unify.pl compiled 0.00 sec, -48 bytes 
true. 

?- run. 
Enter something: test. 
The answer is this is a test 
true. 

?- run. 
Enter something: 'test'. 
The answer is this is a test 
true. 

¿Por qué SWI-Prolog unificar tanto test y 'test'-unify('test', 'this is a test').? Me encontré con esto al responder una pregunta de Prolog en SO. Si bien pude responder la pregunta de la persona, no pude explicar este comportamiento en particular y me preguntaba si alguien más podría hacerlo.

Respuesta

5

Mientras átomos en SWI-PROLOG pueden ser denotados usando comillas simples, por ejemplo, no son necesitan 'This is an atom', comillas simples cuando el analizador SWI-PROLOG puede identificar un átomo de una secuencia de caracteres, por lo general a partir de un alfabético en minúscula personaje, como test. Si la secuencia contenía espacios en blanco (u otros caracteres), necesitaría las comillas simples para indicar un átomo correctamente. Los caracteres alfanuméricos y ciertos caracteres de puntuación como subrayado _ están bien, por ejemplo, test5_6.

Si la secuencia de caracteres sin comillas simples comenzara con cualquier otra cosa, como un número 6k, el analizador lo tratará como number; si fuera un carácter alfabético en mayúsculas, como Test, el analizador lo tratará como una variable.

+0

Ah, este comportamiento es SWI-Prolog-específico? –

+0

@Vivin Paliath: Tal vez, al menos con SWI-PROLOG, aunque parece típico de otras implementaciones de PROLOG que he visto también. Pero, sin embargo, sí, es algo que el analizador SWI-PROLOG hará en particular, tal vez solo para evitar que tenga que citar todos sus átomos :-) – sharky

4

Esto no es un comportamiento específico de SWI - es requerido por la norma. Hay una manera simple de ver esto. Puede usar esto también para cualquier otro término cuya sintaxis no sea evidente. Cualquiera de los tipos en el nivel superior:

 
?- X = 'test'. 
X = test. 

?- X = 'this is a test'. 
X = 'this is a test'. 

La respuesta es siempre válida texto Prolog - esto es específico de SWI pero también a muchos otros sistemas Prolog como YAP, GNU, B, SI, SICStus.

Otra forma de ver esto es utilizar write_canonical/1:

 
?- write_canonical('this is a test'). 
'this is a test' 
true. 

?- write_canonical([a,b,(c,d),{e,f}]). 
'.'(a,'.'(b,'.'(','(c,d),'.'({}(','(e,f)),[])))) 
+0

Muy informativo. ¡Gracias! –

Cuestiones relacionadas