CARACTERISTICAS DE PROLOG
Existen dos tipos de cláusulas: Hechos y Reglas. Una regla es del tipo:
Cabeza :- Cuerpo.
y se lee como "La cabeza es verdad si el cuerpo es verdad". El cuerpo de una regla consiste en llamadas a predicados, que son llamados los objetivos de las reglas. El predicado ,/2 (es decir, un operador de paridad 2 (que recibe 2 argumentos) y de nombre , ) denota conjunción de objetivos, y el operador ;/2 denota disyunción. Conjunciones y disyunciones pueden sólo aparecer en el cuerpo, no en la cabeza de la regla. En realidad la disyunción no es un operador básico o predefinido, sino que está meta-programado así:
';' (A,_) :- A.
';' (_,B) :- B.
Las cláusulas sin cuerpo (es decir, antecedente) son llamados hechos porque siempre son ciertos. Un ejemplo de un hecho es:
gato(tom).
que es equivalente a la regla:
gato(tom) :- true.
El predicado predefinido true/0 siempre es verdad.
El predicado predefinido true/0 siempre es verdad.
Dado el hecho anterior, se puede preguntar:
¿ es tom un gato?
?- gato(tom).
Yes
¿ que cosas son gatos?
?- gato(X).
X = tom
Debido a la naturaleza relacional de muchos predicados, pueden ser usados revertidos sus argumentos. Por ejemplo, length/2 puede ser usado para determinar el tamaño (longitud) de una lista: length([a,b,c], L), así como para generar un esqueleto de lista para un largo dado (length(X, 5)). Similarmente, append/3 puede ser usado también para unir o anexar dos listas: append([a,b], [c,d], X), así como para dividir una lista en dos partes: append(X, Y, [a,b,c,d]). Todo depende de qué argumentos sean variables libres y cuáles sean instanciados. En analogía con la programación imperativa, las variables libres son argumentos de salida y el resto son argumentos de entrada. Pero en Prolog, a diferencia de los lenguajes imperativos, dicho rol es intercambiable en la mayoría de los predicados. Esta característica se denomina reversibilidad, y las combinaciones válidas de argumentos de salida o entrada se denomina modos de uso. Por ejemplo, el predicado length/2 es reversible y tiene tres modos de uso: los dos argumentos instanciados, el primer argumento instanciado pero el otro no, y viceversa. El modo de uso con los dos argumentos sin instanciar no tiene mucho sentido, pero podría ser admitido según algunas implementaciones, en tal caso, generaría todas los esqueletos de lista de todas las longitudes posibles...
Por esta razón, una biblioteca relativamente pequeña de predicados basta para muchos programas en Prolog. Todos los predicados pueden también ser usados para realizarpruebas unitarias: las consultas pueden ser incrustados en programas y permitir pruebas automáticas de regresión en tiempo de compilación.
¿ es tom un gato?
?- gato(tom).
Yes
¿ que cosas son gatos?
?- gato(X).
X = tom
Debido a la naturaleza relacional de muchos predicados, pueden ser usados revertidos sus argumentos. Por ejemplo, length/2 puede ser usado para determinar el tamaño (longitud) de una lista: length([a,b,c], L), así como para generar un esqueleto de lista para un largo dado (length(X, 5)). Similarmente, append/3 puede ser usado también para unir o anexar dos listas: append([a,b], [c,d], X), así como para dividir una lista en dos partes: append(X, Y, [a,b,c,d]). Todo depende de qué argumentos sean variables libres y cuáles sean instanciados. En analogía con la programación imperativa, las variables libres son argumentos de salida y el resto son argumentos de entrada. Pero en Prolog, a diferencia de los lenguajes imperativos, dicho rol es intercambiable en la mayoría de los predicados. Esta característica se denomina reversibilidad, y las combinaciones válidas de argumentos de salida o entrada se denomina modos de uso. Por ejemplo, el predicado length/2 es reversible y tiene tres modos de uso: los dos argumentos instanciados, el primer argumento instanciado pero el otro no, y viceversa. El modo de uso con los dos argumentos sin instanciar no tiene mucho sentido, pero podría ser admitido según algunas implementaciones, en tal caso, generaría todas los esqueletos de lista de todas las longitudes posibles...
Por esta razón, una biblioteca relativamente pequeña de predicados basta para muchos programas en Prolog. Todos los predicados pueden también ser usados para realizarpruebas unitarias: las consultas pueden ser incrustados en programas y permitir pruebas automáticas de regresión en tiempo de compilación.
Como un lenguaje de propósito general, Prolog también posee varios predicados predefinidos para interacción con el sistema operativo, como entrada/salida, gráficos y comunicaciones de datos. Estos predicados no tienen un significado relacional y son sólo útiles por los efectos laterales que exhiben en el sistema. Por ejemplo, el predicadowrite/1 muestra un término en la pantalla, pero no tiene relevancia su valor de verdad o falsedad.