siguiente anterior arriba atrasadelante (solo si previamente se ha ido
atras)

A.4.3. Predicados no lógicos

Prolog incorpora ciertas construcciones que, interpretadas como predicados, puede decirse que «siempre son verdaderos» (o «se satisfacen siempre» ), pero cuyo interés está en sus efectos secundarios, o «efectos laterales» . Entre ellos están:

«write(X)» tiene como efecto lateral escribir por el periférico asignado a la salida el valor con el que en ese momento esté unificada X, y «nl» provoca un «salto de línea» en ese periférico. Por ejemplo, podemos modificar el programa que calcula el factorial (Apartado A.2.6) para que en caso de darle un argumento negativo escriba un mensaje:

 fact(0,1).  
 fact(N,F) :- N<0,write(’Debe ser positivo’),nl.  
 fact(N,F) :- N>0,NM1 is N-1,fact(NM1,F1),F is N*F1.  
 
 ?- fact(4,X).  
 X=24  
 
 ?- fact(-4,X).  
 Debe ser positivo

«read(X)» es el correspondiente a la entrada. Podemos escribir un programa más «dialogante» para el cálculo del factorial :

 factorial :- write(’ Numero?’),nl,read(N),fact(N,X),  
              nl,write(’ factorial(’),write(N),  
              write(’)=’),write(X),nl.  
 
 ?- factorial.  
  Numero?  
 5.  
  factorial(5)=120

Otros predicados más elementales (get y put) permiten manejar la entrada/salida al nivel de caracteres, pero write y read están diseñados para interpretar el tipo de su argumento como constante numérica o simbólica, como ponen de manifiesto los anteriores ejemplos. Esto nos permite utilizarlos, por ejemplo, para obtener hacer más cómoda la lectura o la escritura de sentencias de lenguaje natural que internamente se representan como listas. Así, podemos definir:

 escr_lista([]) :- nl.  
 escr_lista([C|L]) :- write(C), tab(1), escr_lista(L).

(tab(X) es otro predicado no lógico: desplaza el cursor tantas posiciones como indique X).

 ?- escr_lista([’ Esto’,es,una,frase]).  
 Esto es una frase

De esta manera, si a nuestro programa sobre la generación de frases en español (Apartado A.2.4) le añadimos:

     sentencias :- sentencia(X),escr_lista(X).

podemos preguntar:

 ?- sentencias.  
 Espana es Espana  
 Espana es un estado  
 un estado es Espana  
 un estado es un estado

Compárese con la respuesta que se obtenía para «sentencia(X)» , al final del Apartado A.2.4. Y, de nuevo, hemos de tranquilizar al lector que pruebe el ejemplo: sólo obtendrá la primera respuesta. Luego veremos por qué, y la manera de obtenerlas todas.

Del mismo modo se puede hacer para leer frases, con lo que el lector puede intuir la posibilidad de escribir programas para dialogar con la máquina en lenguaje natural (por supuesto, construyendo no sólo un analizador sintáctico con muchas más reglas, sino también las partes más difíciles: el análisis semántico y la «inteligencia» necesaria para dar la respuesta adecuada).


siguiente
anterior arriba atrasadelante (sólo si previamente se ha ido atras)


algunos derechos reservados DIT-ETSIT-UPM
Portada