Sie sind auf Seite 1von 28

- 1 -

I ntroduccin

Conocer Prolog es importante para todo aquel que est relacionado con las
computadoras, debido a que el lenguaje se ha convertido en el principal entorno de
programacin para inteligencia artificial (IA), una de las principales reas de aplicacin de
las computadoras que est emergiendo, aunque posiblemente demasiado lejos del objetivo
que persigue. La Inteligencia Artificial est relacionada ntimamente con algunas de las ms
excitantes reas de la Informtica: Procesadores de ltima generacin, Sistemas Expertos y
procesamiento del lenguaje natural.

En sus inicios (Los aos 80) Prolog estaba orientado a minicomputadoras o
estaciones de trabajo razn por la cual estaba disponible para pocos programadores que
tenan acceso a tales computadoras, pero hoy en buena parte, la Inteligencia Artificial est
disponible virtualmente a todo el mundo. Prolog es uno de los lenguajes de programacin
ms usado por los investigadores de Inteligencia Artificial, es que a criterio de stos, Prolog
ofrece un mtodo diferente al empleado con los lenguajes ms familiares.

Si usted se siente atrado por la Inteligencia Artificial, debe saber que el lenguaje no
convertir a su mquina en un cerebro, ni le ofrecer soluciones inmediatas a aplicaciones
poderosas, sin embargo aprender a desarrollar algunos mtodos de software que han sido ya
aplicados por los investigadores de Inteligencia Artificial.

Aqu hago un poco de historia:
1
Prolog significa PROgramming in LOGic y es un
lenguaje de programacin de computadoras inventado en 1970 por Alain Colmeraeuer y sus
colegas de la Universidad de Marsella (Francia). Rpidamente Prolog se convirti en el
principal lenguaje de la IA en Europa mientras que LIPS era el ms utilizado en Estados
Unidos. Prolog no haba despertado mucho inters en los programadores de todo el mundo,
hasta que los cientficos japoneses lanzaron su famoso proyecto de quinta generacin con el
objetivo de disear nuevas computadoras y software, los cuales no tendran rivales a partir
de los aos 90 (Siglo XX), no fue coincidencia que eligieran a Prolog para su trabajo, de
repente la gente comenz a mirar de otra forma a Prolog y a sus posibilidades.


1
Buena parte de introduccin fue tomada del Libro Aplique Turbo Prolog escrito por Phillip R. Robinson de la
Editorial McGRAW-HILL, 1987.

- 2 -
Contenido

Introduccin

Unidad I
1.- Trminos Importantes
2.- El entorno de Prolog
3.- Introducindonos Brevemente Al Cdigo De Prolog
4.- Hechos: Objetos y Relaciones

Unidad II
5.- Sintaxis De Los Programas En Prolog
6.- Hechos (Programas, Predicados)
7.- Introduccin Del Primer Programa Ejemplo
8.- El Primer Programa Ejemplo
9.- Variables.

Unidad III
10.- Reglas Y Vuelta Atrs
11.- Objetivos Con Mltiples Argumentos
11.- Unificacin
12.- Comparacin De Trminos
14.- Estructuras De Control
15- Aritmtica
16.- Listas

Unidad IV
17.- Ejemplos
Bibliografa
Apndice






p

- 3 -
Unidad I
1.- Trminos Importantes
2


Programacin Lgica.
La programacin lgica es un paradigma de los lenguajes de programacin en el
cual los programas se consideran como una serie de aserciones lgicas. De esta
forma, el conocimiento se representa mediante reglas, tratndose de sistemas
declarativos. Una representacin declarativa es aqulla en la que el conocimiento
est especificado, pero en la que la manera en que dicho conocimiento debe ser
usado no viene dado. El ms popular de los sistemas de programacin lgica es el
PROLOG.

Lgica
Como su nombre lo implica PROLOG se basa en manipulaciones lgicas y no es
nico en ste aspecto, a ste grupo pertenecen varios lenguaje de programacin,
tales lenguajes trabajan con lgica proposicional, tambin conocida como lgica
de predicados o clculo proposicional. Por ejemplo, las siguientes sentencias son
hechos:

La gente con zapatos de baseball juega al baseball.
La persona # 1 tiene zapatos de baseball.

Lo que puede inferirse, calcularse, figurarse, deducirse o determinarse de stos
hechos es que la persona # 1 juega al baseball.

Prolog hace que la computadora maneje la parte de inferir.

Prolog tiene un motor de inferencia integrado que automticamente busca los
hechos y construye o prueba conclusiones lgicas. As, dado el problema puede
parecer trivial, pero si usted tuviera una base de datos tcnicas almacenada con
miles de hechos y reglas, no sera prctico darle a un humano esa lista y pedirle
una respuesta de manera prctica, pues en el procesamiento del lenguaje natural,
la base de datos contendra reglas acerca del reconocimiento y comprensin del
lenguaje



3


, Todos los humanos son mortales y Todos los griegos son humanos, se llega a la conclusin
vlida de que Todos los griegos son mortales. Aristteles


2
Trminos tomados del libro Aplique Turbo Prolog escrito por Phillip R. Robinson de la Editorial McGRAW-
HILL, 1987.
3
http://www-history.mcs.st-andrews.ac.uk/history/References/Aristotle.html

- 4 -
2.- El entorno de Prolog

Por unos segundos ver la pantalla con la que Broland Presenta al Turbo Prolog 2.0.


Despus la barra espaciadora ver la siguiente ventana, que es la principal de Turbo
Prolog 2.0, en breve describo cada una de ellas:


Ventana Editor.- Es la ventana que se utilizar para escribir nuestros cdigos,
note que en la parte superior de la misma se encuentran ciertos datos que entre
cosas nos informan de la lnea donde nos encontramos, la columna donde nos
encontramos, as como tambin el nombre del archivo que estamos editando (en
el ejemplo WORK.PRO), as tambin se indica si el editor est en modo insert.

Ventana Dialog.- Los programas en PROLOG generalmente buscan a travs de
una lista de reglas y hechos intentando responder a preguntas, pero tambien pude
hacer otras cosas que otros lenguajes de programacin hacen: pueden realizar
juegos, dibujar grficos o resolver ecuaciones. Usted se har preguntas y obtendr
respuestas en la ventana dialog.

Ventana Message.- Algunas variedades del Prolog no dicen cuando algo est
mal. Si usted comete alguna falta de escritura o si tiene algn problema con su
programa, el interprete o compilador del Prolog le dar como mucho un crtico

- 5 -
mensaje de error. El Turbo Prolog usa la ventana Message para decirle lo que est
sucediendo, sea correcto o incorrecto.

La Ventana Trace.- Aunque su programa cumpla con las reglas sintcticas del
Turbo Prolog oficial, puede que no realice exactamente lo que quiere. Aunque
que realice lo que ha planificado, puede que quiera saber lo que hace desde el
principio hasta final. ste el propsito de la ventana Trace. Puede aadir rdenes
al Turbo Prolog forzando al programa a que trabaje paso a paso en vez de
seguido. Despus de cada paso la ventana parar y mostrar lo que el programa
est haciendo.

3.- Introducindonos Brevemente Al Cdigo De Prolog
4



El rbol genealgico,
un problema comnmente resuelto en Prolog

Prolog se enmarca en el paradigma de los lenguajes declarativos, lo que lo diferencia
enormemente de otros lenguajes ms populares tales como Fortran, Pascal, C, etc.

En todos los mencionados, las instrucciones se ejecutan normalmente en orden
secuencial, es decir, una a continuacin de otra, en el mismo orden en que estn
escritas, que slo vara cuando se alcanza una instruccin de control (un bucle, una
instruccin condicional o una transferencia).

Los programas en Prolog se componen de clusulas que constituyen reglas del tipo
"modus ponens", es decir, "Si es verdad el antecendente, entonces es verdad el
consecuente". No obstante, la forma de escribir las clusulas es al contrario de lo
habitual. Primero se escribe el consecuente y luego el antecedente. El antecedente
puede ser una conjuncin de condiciones que se denomina secuencia de objetivos.

Cada objetivo se separa con una coma y puede considerarse similar a una instruccin
o llamada a procedimiento de los lenguajes imperativos. En Prolog no existen
instrucciones de control. Su ejecucin se basa en dos conceptos: la unificacin y el
backtracking. Gracias a la unificacin, cada objetivo determina un subconjunto de
clusulas susceptibles de ser ejecutadas. Cada una de ellas se denomina punto de
eleccin. Prolog selecciona el primer punto de eleccin y sigue ejecutando el
programa hasta determinar si el objetivo es verdadero o falso. En caso de ser falso

4
A Wikepedia Projects, http://www.wikipedia.com
Aunque an falta dar muchas
indicaciones en cuanto a cdigo, este
ejemplo nos muestra algunas cosas


- 6 -
entra en juego el 'backtracking', que consiste en deshacer todo lo ejecutado situando
el programa en el mismo estado en el que estaba justo antes de llegar al punto de
eleccin. Entonces se toma el siguiente punto de eleccin que estaba pendiente y se
repite de nuevo el proceso. Todos los objetivos terminan su ejecucin bien en
"verdadero", bien en "falso", tal como lo ilustra el siguiente bien comentado ejemplo:
.
%%
%% declaraciones
%%

padrede('juan', 'maria'). % juan es padre de maria
padrede('pablo', 'juan'). % pablo es padre de juan
padrede('pablo', 'marcela').
padrede('carlos', 'debora').

% A es hijo de B si B es padre de A

hijode(A,B) :- padrede(B,A).

% A es abuelo de B si A es padre de C y C es padre B

abuelode(A,B) :- padrede(A,C), padrede(C, B).

% A y B son hermanos si el padre de A es tambien el padre de B
y
% si A y B no son lo mismo

hermanode(A,B) :- padrede(C,A) , padrede(C,B), A <> B.

% A y B son familiares si A es padre de B o A es hijo de B o A
es
% hermano de B

familiarde(A,B) :- padrede(A,B) ; hijode(A,B) ;
hermanode(A,B).



Las Consultas se hacen desde la ventana Dialog

%%
%% consultas
%%

% juan es hermano de marcela?
?- hermanode('juan', 'marcela').
yes

% carlos es hermano de juan?
?- hermanode('carlos', 'juan').
no

% pablo es abuelo de maria?
?- abuelode('pablo', 'maria').
yes

% maria es abuelo de pablo?
?- abuelode('maria', 'pablo').
no

- 7 -


- 8 -
Unidad II

4.- Hechos: Objetos y Relaciones

En la forma ms sencilla Prolog trata con objetos y las relaciones entre ellos. Puede
incluso or hablar de l como lenguaje orientado a objeto. Un objeto no es
necesariamente algo tangible, puede ser cualquier cosa que puede representarse
simblicamente en una computadora, he aqu unos ejemplos de objetos:

carlos felipe
diana Isabel

Aqu algunas relaciones que son tiles cuando se consideran estos objetos:

rey reina prncipe
princesa madre padre
hijo

Habr observado que ninguna de estas palabras comienza en maysculas, pues no es
ninguna falta, pues maysculas y minsculas tienen significado diferente en Prolog.

He aqu otro conjunto de objetos y relaciones:

vaca murcilago iguana secoya
helecho ibm_pc apple_macintosh

y las relaciones son:

animal mineral vegetal mamifero
reptil computadora


Ahora ya est preparado para escribir unas cuantas sentencias en Prolog pero antes
debe conocer un poco la sintaxis del programa.

5.- Sintaxis De Los Programas En Prolog

La sintaxis de un lenguaje de programacin es el conjunto de reglas que gobiernan
que las palabras estn bien escritas, la posicin en que deben escribirse estas
palabras, los lugares donde van las puntuaciones, etc. Aunque comprenda la teora de
un lenguaje, no podr hacer nada con el si no se conoce su sintaxis.

Existen varios tipos de sintaxis en Prolog. Implementaciones del lenguaje de
diferentes compaas de Software son a veces muy diferentes.

El Turbo Prolog contiene la mayora de las caractersticas y sintaxis del Prolog
descritos en el popular libro Programming in Prolog de W.F cloksin, las mismas se
irn describiendo conforme avance en ste tutorial.

6.- Hechos (Programas, Predicados)

- 9 -

Expresan relaciones entre objetos. Supongamos que queremos expresar el hecho de
que "un coche tiene ruedas". Este hecho, consta de dos objetos, "coche" y "ruedas", y
de una relacin llamada "tiene". La forma de representarlo en PROLOG es:

tiene (coche, ruedas).

Es decir

relacion (objeto)

Obsrvese que el objeto est entre parntesis, y la relacin le precede, cuando se
escribe de sta forma la relacin se conoce como predicado

Un programa Prolog est formado por predicados. Cada predicado est definido
unvocamente por su nombre y su aridad.

La aridad es el nmero de argumentos (o parmetros) de un predicado. Ejemplo:

humano (pepe).
humano (juan).

Para referenciar este predicado se utiliza nicamente su nombre y aridad: humano.
Cada predicado en Prolog puede estar definido por una o ms clusulas. En nuestro
ejemplo, humano est definido por dos clusulas.

Las clusulas a su vez pueden ser de dos tipos:

hechos y
reglas.

Los hechos son afirmaciones que consideramos ciertas en nuestro programa.

Las reglas son implicaciones lgicas, que pueden tener varios antecedentes pero un
nico consecuente. Este tipo de reglas se denominan clusulas de Horn.

Ej. humano(X) mortal(X).

que utilizando la sintaxis de Prolog se escribe:

mortal (X):- humano(X).

Los hechos se pueden considerar casos particulares de reglas en donde no hay ningn
antecedente.

7.- Introduccin Del Primer Programa Ejemplo
5



5
Tomado del libro Aplique Turbo Prolog escrito por Phillip R. Robinson de la Editorial McGRAW-HILL,
1987.


- 10 -
La siguiente es una lista de la lista de hechos de la segunda lista de objetos y
relaciones mencionados anteriormente:

animal (vaca)
animal (murcielago)
animal (iguana)
vegetal (secoya)
computadora (ibm_pc)
computadora (apple_macintosh)

Note que no debe dejar espacios en blancos, as que puede usar el carcter de
subrayado.

Antes de introducir ste programa en la ventana editor de Prolog e interactuar con l
desde la ventana dialog, necesitamos saber otros dos detalles:

1. Los comentarios
Los comentarios en prolog se deben escribir entre /* y */, ejemplo:

/* Esto es un ejemplo de comentario en Turbo Prolog 2.0 */

Otra forma es con % al inicio de la lnea, ejemplo:

% Esta es otra manera de hacer comentarios en
% Turbo Prolog 2.0

2. Divisiones del programa
La mayora de los programas en Turbo Prolog estn organizados en cuatro
secciones principales:

Clasulas (clauses)
Predicados (predicates)
Dominios (domains)
Objetivos

Nota: No necesariamente deben estar todas estas secciones en un programa en
Prolog, pero vale familiarizarse con ellas.

Clusulas (clauses)
Los hechos que construyo con los objetivos y relaciones se listan en la seccin de
clauses, esta seccin puede incluir reglas y construcciones que se detallaran
brevemente ms adelante.

Predicados (predicates)
Los predicados son las relaciones (termino heredado de la lgica formal, el cual
es una de las bases del Prolog), en esta seccin se declaran los predicados que
vaya a usar en su programa.

Dominios (domains)

- 11 -
Esta seccin se usa para decirle al Prolog que tipo de dato van a manejar los
predicados y ahorrar trabajo al Prolog.

Objetivos (goal)
Esta seccin le dice al Turbo Prolog lo que ha de encontrar en lo que desea que la
computadora haga con la informacin que se le ha suministrado en las otras tres
secciones.

Normalmente un programa tendr las secciones de clauses y predicates, pero es
posible tener un programa que tenga slo una seccin objetivo (goal).

Debido a que prolog puede usarse interactivamente, es frecuente ejecutar un
programa y esperar que luego se le pregunte un objetivo (desde la ventana
dialog). Es que el Turbo Prolog tambin trabaja de sta forma, pero suministra
una seccin objetivo (goal) para permitirle ejecutar los programas en forma no
interactiva. Usted puede escribir el objetivo en el cdigo original de tal forma que
tan pronto como ejecute el programa, ste pueda trabajar en la bsqueda de la
solucin deseada.

8.- El Primer Programa Ejemplo

/* Ejemplo Animal, vegetal o computadora */














Note que en ste programa no aparece la seccin goal en la ventana editor, asi
tambin note que vez compilado el programa (F9) y luego ejecutado (R) aparece
la palabra goal en la ventana dialog para all expresar los objetivos y que el
prolog pueda trabajar, en el ejemplo le preguntamos a Prolog si el objeto perro
tiene relacin con animal y contesto no, pues la razn que no le especificamos en
el cdigo una clauses o predicates correspondiente.

9.- Variables.
Hay otra forma de hacer preguntas. Si se conoce la relacin pero no los objetos,
puede usar variables. Cualquier palabra objeto que comienza con un letra
mayscula se considera una variable. Despus de la mayscula puede tener
cualquier nmero de letras (mayscula o minscula), junto con dgitos y
doamins
cosa = symbol

predicates
computadora (cosa)
vegetal (cosa)
animal (cosa)
clauses
animal (vaca)
animal (murcielago)
animal (iguana)
vegetal (secoya)
computadora (ibm_pc)
computadora (apple_macintosh)

- 12 -
caracteres de subrayado. La forma ms rpida de ver lo que puede hacer una
variable es hacer una pregunta al programa, de la siguiente manera:

animal (X)

como un objetivo, pronto ver la siguiente pantalla.

goal: animal (X)
X = vaca
X= muercielago
X= iguana
3 Solutions


- 13 -
Unidad III


10.- Reglas Y Vuelta Atrs
El Turbo Prolog ofrece mucho ms que los hechos y variables elementales escrito ya
antes en ste tutorial.

Trminos.- son los bloques de construccin de Turbo Prolog 2.0. Un trmino puede
ser una constante una variable o una estructura. Lo que hemos venido usando hasta
ahora han sido constantes, tales como:

Murcilago
Vaca
Ibm_pc
apple_macintosh

Tambin hemos trabajados con variables aunque slo con la popular X una
constante representa un objeto o relacin especfica. Una variable (la cual comienza
siempre con una letra mayscula) representa un objeto cuyo nombre an no se
conoce cuando se est haciendo el programa. Examinaremos ms adelante las
estructuras.

Aridad.- La aridad de un predicado es el nmero de argumentos que tiene (hasta
ahora slo he explicado ejercicios con predicados de una aridad). Pero la mayora de
ejemplos en Prolog no son de esa manera, observe el siguiente ejemplo.

Tiburn (pierna, humano)

para describir la relacin (predicado) entre los dos argumentos pierna y humano.
Esto podra traducirse como los tiburones se comen la piernas de los humanos.
Pero recuerde que el significado es el que Usted quiera darle, por que tambin lo
podra tomar como las piernas son la parte de los humanos que atraen a los
tiburones. Se pueden escribir comentarios en los programas para explicar lo que
intenta decir un predicado. Esto ayuda al programador, pero si lo que usted quiere es
ayudar al compilador debe hacer algo como esto:

computadora (ibm_pc,_512,_2_floppy,_DOS_2,_2serial,_lparallel,
_Hercules,_Princeton)

Como notar son las caractersticas bsicas de antigua computadora, puede incluso
tener un predicado sin argumentos (? Se ver mas adelante).

Considere que las letras que empiezan con maysculas se toman como variables (es
por eso que usamos los _ en algunos casos).

11.- Objetivos Con Mltiples Argumentos
Los programas que trabajan con mltiples argumentos pueden cumplir con objetivos
ms complejos. Ejemplo:

observa (guillermo, roberto)

- 14 -
observa (juan, juana)
observa (federico, felicia)
observa (miguel, guillermo)
observa (brenda, gregorio)
observa (roberto, roberto)
observa (federico, gregorio)
observa (guillermo, felipe)

Llame a la ventana editor y escriba lo siguiente:



El predicado observa significa que el objeto de la primera posicin observa al
objeto de la segunda posicin; es decir: Guillermo observa a Roberto y no
Roberto observa a Guillermo. (El cdigo que escribi an no funciona).

Ahora puede incluir predicados y dominios en el ejercicio. Todos los argumentos son
del mismo tipo y pueden estar incluidos en el mismo dominio (symbol es el mejor
dominio para usarlo para nombres de cosas o personas). Recuerde que persona es
nuestro smbolo para ellos. La palabra symbol significa siempre una cierta cosa.



- 15 -

Apliquemos un poco de lo ya visto, y manejemos argumentos mltiples pero con una
variable y observe como Prolog responde en la ventana Dialog.



Tambin puede variables en ambos argumentos y vea como responde Prolog en la
ventana Dialog



Uso de variables annimas, se usa slo un carcter subrayado y el Prolog le
responde Yes o No. Ejemplo:

Observa (juan, _)

Prolog le dir si Juan observa a alguien o no pero no le dar el nombre.


- 16 -


Analice los ltimos ejemplos que se presentan en sta ventana


Objetivos Compuestos
Los objetivos pueden ser an ms complejos que los vistos en la seccin anterior,
observe el siguiente ejemplo de la figura siguiente.

Los operadores And, Or y Not
Si tiene el siguiente objetivo (se muestra en la figura):

observa (guillermo, roberto) and observa (juan, juana)

En el objetivo estar preguntando Es verdad por las clusulas que se tienen que
Guillermo observa a Roberto y Juan observa a Juana Este objetivo ser considerado
verdad si ambos partes del mismo son verdaderas, tal como lo muestra la siguiente
figura:

Nota: La palabra and puede ser reemplazado por , en algunas implementaciones
de Prolog.


- 17 -


Desde luego puede aplicar lo aprendido anteriormente y ejecutar variables annimas,
u otra cosa.

De la misma manera tambin puede usar el operador Or que se debe escribir or o
tambin ; el operador Not lo estudiamos ms adelante.

Reglas
Cmo en su espacio lo escrib, la seccin clauses tambin puede incluir reglas, una
rega tpica dice que algo es verdad si algo es verdad, las reglas hacen que Prolog pase
de se un diccionario a ser una mquina pensante. Aadamos la sguiente regla al
ejemplo:

feliz (gregorio) if observa (brenda, gregorio)

Y

nervioso (Quien) if observa (guillermo, Quien)

Al final de los hechos asegrese de poner .

La siguiente es una muestra de cmo debe estar su cdigo en la ventana edit.

domains
persona = symbol

predicates
observa (persona, persona)
feliz (persona)
nervioso(persona)

clauses

observa (guillermo, roberto).
observa (juan, juana).
observa (federico, felicia).
observa (miguel, guillermo).
observa (brenda, gregorio).

- 18 -
observa (roberto, roberto).
observa (federico, gregorio).
observa (guillermo, felipe).
feliz (erico) if observa (brenda, erico).
feliz (gregorio) if observa (brenda, gregorio).
nervioso (Quien) if observa (guillermo, Quien).


El Turbo Prolog intentar satisfacer o identificar el objetivo feliz (gregorio). De
arriba hacia abajo, buscar entre las clusulas, buscando uno que coincida con
feliz. Luego compraba si dicho predicado tiene la misma aridad, si es as contna el
proceso y cuando encuentra la palabra if concluye que esto no es hecho si no una
regla.

Vuelta atrs (Backtracking)
En ste punto el Turbo Prolog vuelve a la primera clusula y comienza a bsqueda
hacia atrs en la lista esto se llama vuelta atrs y es una importante caracterstica del
Prolog. Siempre que necesita ser satisfecho un subobjetivo, el Prolog vuelve hacia
atrs de la Base de Datos, buscando siempre de arriba hacia abajo y de izquierda a
derecha. Hasta encontrar una coincidencia. La vuelta hacia atrs puede fcilmente
crecer en complejidad conforme las reglas y los dems objetivos sean ms complejos.

Buscando en los hechos el Turbo Prolog pronto encuentra el hecho observa (brenda,
gregorio). Identifica el subobjetivo con ese hecho y vuelve a la regla feliz
(gregorio) if observa (brenda, gregorio), sabiendo entonces que la parte de la regla
feliz (gregorio) puede utilizarse para identificar el objetivo general, ya que la parte
derecha era true

Instanciacin y vinculacin
Si prueba el objetivo feliz (Quien) obtendr una respuesta Gregorio despus del
mismo tipo de bsqueda. La nica diferencia es que la variable quien necesita ser
instanciada a gregorio. El Turbo Prolog encuentra el predicado feliz, comprobar
su aridad, instanciar la variable Quien a la constante gregorio, actualizar el
objetivo de la parte derecha de la regla, identificar al nuevo objetivo y vuelve a la
regla. Entonces pondr la parte izquierda de la regla a true, identificar la parte
izquierda del objetivo se cumple e imprimir el valor dado a la variable. Si desea ver
paso a paso lo que sucede puede usar la ventana trace, slo debera escribir esta
palabra al inicio del programa.


trace
domains
persona = symbol

predicates
observa (persona, persona)
feliz (persona)
nervioso(persona)

clauses

observa (guillermo, roberto).
observa (juan, juana).

- 19 -
observa (federico, felicia).
observa (miguel, guillermo).
observa (brenda, gregorio).
observa (roberto, roberto).
observa (federico, gregorio).
observa (guillermo, felipe).
feliz (erico) if observa (brenda, erico).
feliz (gregorio) if observa (brenda, gregorio).
nervioso (Quien) if observa (guillermo, Quien).

Notas:

Como variante al if puede usar :-
El operador Not se puede usar de la siguiente forma: feliz (erico) if Not
(observa (brenda, erico)).


- 20 -
11.- Unificacin
La unificacin, como ya se ha comentado, es el algoritmo que se encarga de resolver
las igualdades lgicas. Aunque la unificacin en Prolog sustituye a la asignacin de
los lenguajes procedurales, no hay que confundirla con esta, son operaciones
totalmente distintas. La operacin de unificacin se representa mediante el operador
=.

Ejercicios:
X = pepe.
3 = X.
X = Y.
X = 3, X = 5.
f(3, 2) = f(X, 2).
f(X, p(a) ) = f(p(Y), Y).
X = 3 + 2.
5 = 3 + 2.
X + 3 = 2 + Y.
f(X, f(X) ) = f(Y, Y).

12.- Comparacin De Trminos
Para comparar trminos existen varios operadores. De estos operadores, los ms
importantes son el igual (==) y el distinto (\==). Para stos hay que tener en cuenta
que dos trminos son iguales solamente si son exactamente el mismo trmino (mismo
valor y mismo tipo).

Ej.
5 == 5 Yes
5 == 5 No Estamos comparando un entero con un tomo.
5 == 2 + 3 No Estamos comparando un entero con una estructura.
5 == X No Estamos comparando un entero con una variable.

Resolucin De Varios Ejercicios Programas

Ej.
humano(pepe).
humano(juan).
mortal(X):-
humano(X).

Despus de cargar este fichero podremos hacer preguntas como las siguientes:

[eclipse 1]: humano(pepe). Yes
[eclipse 2]: mortal(pepe). Yes
[eclipse 3]: mortal(javi). No
[eclipse 4]: mortal(X).
X = pepe more? (;)
X = juan

Si encuentra la pregunta como un hecho, la respuesta es directamente que s
(pregunta 1 del ejemplo anterior). Si encuentra la pregunta como la cabeza (o
consecuencia) de una regla, toma cada uno de los predicados del cuerpo de la regla
como nuevas preguntas y slo si todas son ciertas, la respuesta ser s (pregunta 2). Si
no encuentra ningn hecho o regla que haga cierta la pregunta, la respuesta ser no
(pregunta 3). Es importante tener en cuenta que para comprobar si la pregunta
coincide con un hecho o con la cabeza de una regla se aplica unificacin. Esto

- 21 -
significa que si en la pregunta hay alguna variable, sta unificar con los trminos del
hecho o regla, es decir, ser igual a los valores que hacen cierta la pregunta. Esto se
utiliza para extraer resultados (pregunta 4). Si existe ms de un resultado, habr que
pulsar ; para verlos.

Ejercicio:
Sea el siguiente programa Prolog:
padre(juan, pepe).
padre(pepe, javi).
padre(pepe, jose).
padre(antonio david).

Completarlo con varias reglas que definan las relaciones hijo, abuelo, hermano,
primo, etc. Por ejemplo, para hijo ser:

hijo(X, Y):- padre(Y, X).

14.- Estructuras De Control
En Prolog, a diferencia de lenguajes procedurales como Pascal o C, no existen
estructuras de control para bucles. stos se implementan mediante predicados
recursivos. En cambio existen estructuras de control nuevas que no existen en otros
lenguajes y que describiremos como And, Or, Not (ya se revisaron en ste manual).

Varias clusulas Operador ;

numero(X):- numero(X):-
integer(X). integer(X);
numero(X):- real(X).
real(X).

Normalmente se utiliza la disyuncin mediante clusulas puesto que resulta ms
claro.

La negacin se realiza mediante el operador not. El operador not antes de la
llamada a un predicado P cambia su valor de verdad, es decir, si el predicado P tiene
xito, not P fallar y si el predicado P falla, not P tendr xito.

Ej.
no_entero(X):-
not integer(X).

Sin embargo hay que tener la precaucin de aplicar la negacin nicamente en
llamadas a predicados donde todas las variables existentes estn ya instanciadas, ya
que si no el comportamiento no es el esperado.

Ej.
padre(pepe, juan).
huerfano(X):-
not padre(Z, X).

Para la pregunta huerfano(pepe) funcionar bien y dir que s, pero si preguntamos
quin es hurfano con huerfano(X) dir que no, es decir, que no hay ningn hurfano,
lo cual no es correcto.

- 22 -

15- Aritmtica
Como hemos visto, en la unificacin no se evalan expresiones. Para ello existe un
operador especial is que antes de realizar la unificacin evala la parte derecha
como si se tratase de una expresin aritmtica.

X is 3 + 2 es equivalente a X = evaluar(3 + 2)

Para que esta evaluacin se pueda llevar a cabo es necesario que la parte derecha no
contenga ninguna variable sin instanciar, en caso contrario el sistema dar error. En
el apndice 1 hay una tabla con las operaciones y funciones ms comunes en Prolog.

Ej.: Resultado
X is 3 + 2. X = 5 Yes
5 is 3 + 2 Yes
X is 3 + Y Error. No se puede evaluar.
X is ln(exp(2) ) X = 2.0 Yes

Comparacin Aritmtica
Existen varios operadores para comparar expresiones aritmticas. Estos operadores
evalan sus dos operandos antes de realizar la comparacin. En el apndice 1 se
pueden ver los distintos operadores existentes.

5 =:= 2 + 3. es equivalente a evaluar(5) =:= evaluar(2 + 3)

16.- Listas
La nica estructura de datos predefinida de Prolog son las listas. Sirven para agrupar
un nmero indeterminado de trminos. En Prolog se escriben de la siguiente forma:

[1, 2, 3]

Los trminos son de cualquier tipo, y se pueden mezclar dentro de una misma lista:

[1, pepe, 6.3, [10, 0], A]

El tomo [] se utiliza para indicar la lista vaca.

La nica operacin permitida sobre listas es separar la lista en su primer elemento y
el resto de la lista. Al primer elemento de la lista se le denomina cabeza y al resto de
la lista cola. El operador que se utiliza para separar la lista es la barra vertical: '|'. [1|
[2] ] representa [1, 2] Para separar una lista determinada en su cabeza y su cola, se
utiliza unificacin.

Ej. Si la lista L es [1, 2, 3]
L = [Cab| Cola]. Da como resultado:
Cab = 1
Cola = [2, 3]

Ej. Predicado para mostrar todos los elementos de una lista:
mostrar([]).
mostrar([Cab| Cola]):-
writeln(Cab),
mostrar(Cola).

- 23 -
Unidad IV

17.- Ejemplos

Ejemplo
Para este ejemplo igual que el otro necesitaremos un editor de textos para escribir los hechos
y reglas que lo componen. Un ejemplo sencillo de programa PROLOG es el siguiente:

quiere_a(maria,enrique).
quiere_a(juan,jorge).
quiere_a(maria,susana).
quiere_a(maria,ana).
quiere_a(susana,pablo).
quiere_a(ana,jorge).
varon(juan).
varon(pablo).
varon(jorge).
varon(enrique).
mujer(maria).
mujer(susana).
mujer(ana).
teme_a(susana,pablo).
teme_a(jorge,enrique).
teme_a(maria,pablo).

/* Esta linea es un comentario */

quiere_pero_teme_a(X,Y) :- quiere_a(X,Y), teme_a(X,Y).
querido_por(X,Y) :- quiere_a(Y,X).
puede_casarse_con(X,Y) :- quiere_a(X,Y), varon(X), hembra(Y).
puede_casarse_con(X,Y) :- quiere_a(X,Y), hembra(X), varon(Y).

Una vez creado, lo salvaremos para su posterior consulta desde el interprete PROLOG

Ejemplo
Para este ejemplo igual que el otro necesitaremos un editor de textos para escribir los
hechos y reglas que lo componen. Un ejemplo sencillo de programa PROLOG es el
siguiente:

quiere_a(maria,enrique).
quiere_a(juan,jorge).
quiere_a(maria,susana).
quiere_a(maria,ana).
quiere_a(susana,pablo).
quiere_a(ana,jorge).
varon(juan).
varon(pablo).
varon(jorge).
varon(enrique).
mujer(maria).
mujer(susana).
mujer(ana).
teme_a(susana,pablo).
teme_a(jorge,enrique).
teme_a(maria,pablo).

/* Esta linea es un comentario */

- 24 -

quiere_pero_teme_a(X,Y) :- quiere_a(X,Y), teme_a(X,Y).
querido_por(X,Y) :- quiere_a(Y,X).
puede_casarse_con(X,Y) :- quiere_a(X,Y), varon(X), hembra(Y).
puede_casarse_con(X,Y) :- quiere_a(X,Y), hembra(X), varon(Y).

Una vez creado, lo salvaremos para su posterior consulta desde el interprete
PROLOG.

Ejercicio
De un rbol Genealgico de una familia y pretende mostrarles como PROLOG
puede servir como un manejador de bases de datos. El ejercicio del rbol
genealgico. Consideren el siguiente cdigo PROLOG:

hij (abraham, teraj).
hij (najor, teraj).
hij (aram, teraj).
% hij (sara, teraj).
hij (lot, aram).
hij (hija mayor, lot).
hij (hija menor, lot).
hij (moab, hija mayor).
hij (moab, lot).
hij (ben ammi, hija menor).
hij (ben ammi, lot).
hij (esau, isaac).
hij (esau, rebeca).
hij (jacob, isaac).
hij (jacob, rebeca).

Este texto contiene una definicin de la relacin hijo o hija de. As, hij (X,Y) debe
leerse como X es hijo o hija (o descendiente inmediato) de Y. Observe que esto es
similar a una tabla de una base de datos. Cada tomo hij , corresponde a un registro
de la base de datos. Uno puede colocar toda esa informacin y la siguiente en un
archivo:

masculino(teraj).
masculino(abraham).
masculino(najor).
masculino(aram).
masculino(lot).
masculino(moab).
masculino(ben ammi).
masculino(ismael).
femenino(sara).
femenino(agar).
femenino(hija mayor).
femenino(hija menor).
femenino(melca).

Y entonces, uno puede interactuar y extraer informacin de un archivo con el texto
anterior. Por ejemplo, despus de cargar el archivo, puede uno preguntar al sistema si
Rebeca es hija de

? hij (rebeca, batuel).


- 25 -
Ms interesante todava es poder preguntar si acaso cierto personaje tiene un hijo o
hija:

? hij (X, abraham).

La X es una variable. Literalmente, estamos preguntando si existe algn X tal que
la relacin hij se cumple entre ese X y abraham. Las variables en PROLOG se
indican con cadenas de caracteres cuya primer letra es una mayscula. Esta es la
razn por la cual todos los nombres estn en minscula y no comienzan con
Mayscula como indica el buen espaol. Las respuestas de PROLOG ante esos dos
tipos de preguntas son similares. En ambas aparece el yes de confirmacin. Sin
embargo, en el segundo caso, la respuesta va acompaada de una indicacin de un
valor que permite que la respuesta se responda afirmativamente. Nada de lo anterior
supera a las facilidades que ofrece un manejador cualquiera de base de datos. La
diferencia comienza a surgir cuando uno usa las relaciones bsicas anteriores, para
definir nuevas relaciones por medio de reglas que en lo sucesivo llamaremos
clusulas:

hija( X, Y ) :- hij (X, Y), femenino( X ).

Esta es la forma PROLOG de escribir la clusula: X es hija de Y si X es descendiente
inmediata de Y y X es del sexo femenino. Por supuesto, muchas otras relaciones se
pueden definir:

hijo(X, Y) :- hij (X, Y), masculino( X ).
padre( X , Y ) :- hij ( Y, X ), masculino( X ).
madre( X, Y ) :- hij ( Y, X ), femenino( X ).
abuela( X, Y ) :- madre( X, Z ), hij ( Y, Z ).
abuelo( X, Y ) :- padre( X, Z ), hij ( Y, Z ).
descendiente( X, Y ) :- hij ( X, Y ).
descendiente( X, Y ) :- descendiente( X, Z ), descendiente(Z, Y).

La ltima clusula introduce una facilidad muy importante en un lenguaje de
programacin: recursin. Para definir la nocin de descendencia, se apela a la misma
definicin de descendencia. Computacionalmente esto slo es factible cuando, en la
definicin, se cuenta tambin con una clusula como la penltima que nos permite
terminar la deduccin. Hablaremos mucho de la recursin a lo largo de este curso.

Para completar el ejercicio, pedimos a los estudiantes que construyan las definiciones
adecuadas para responder a las preguntas:

? to(lot, Y). % Quien es to de Lot.
? ta(Y, sara) % Quien es sobrino o sobrina de Sara.
? prim (X, Y) % Quien es primo o prima de quien

Un recurso del sistema PROLOG que puede ser muy til para responder estas y otras
preguntas es el comando findall, que explicamos a continuacin:

Una pregunta en PROLOG puede tener ms de una respuesta. Si uno quiere encontrar
TODAS las respuestas a una pregunta puede hacerla a travs del comando findall,
cuya sintaxis es:


- 26 -
findall( Variable o estructura, PREGUNTA, lista de respuestas ).
Por ejemplo, para preguntar quienes son los hijos de Abraham, puede uno decirle a
PROLOG:

? findall( X, hijos( X, abraham ), L ).

y observar el valor asignado a L.

Si el tiempo no apremia, prueben tambin la pregunta:

? findall( X, descendiente( X, abraham), L ).

y observen que ocurre.


En lgica, a diferencia de los lenguajes naturales (como el espaol o el ingls), el
diseador del lenguaje hace un esfuerzo especial por evitar la ambigedad en las palabras
u oraciones: Cada oracin debe apuntar a un solo significado. Adems, quien "habla"
(escribe) el lenguaje lgico, procura evitar la inconsistencia entre sus oraciones y
declaraciones: no deben emitirse declaraciones contradictorias.


Los grandes problemas y el lenguaje

Todo el mundo ama a un amante
Implica que?
Todo el mundo ama a alguien.










Bibliografa:
Jess Correas Fernndez, e-mail: jcorreas@fi.upm.es. Departamento de Inteligencia
Artificial de la Facultad de Informtica de la Universidad Politcnica de Madrid.
Madrid 17 de julio de 2002.
Libro Aplique Turbo Prolog escrito por Phillip R. Robinson de la Editorial
McGRAW-HILL, 1987 (de all se tomo ms del 60 % de ste trabajo).
Wikepedia Projects, http://www.wikipedia.com


e-mail:
jpincay1983@hotmail.com
FACCI, 2005 - 2006


- 27 -
Apndice: Predicados Ms Comunes De Prolog










- 28 -