Está en la página 1de 5

Laboratorio 1 de Win Prolog1

Una Vista del Prolog


Prolog es un lenguaje de programación simbólica no numérica para computadores.
Principalmente para solucionar problemas que involucran objetos y relaciones entre objetos. Ej.
la relación Familia: padre_de(juan, maría).

Aquí, el nombre de la relación es: padre_de, juan y maría son sus argumentos. Note que el
nombre de la relación y los argumentos están escritos con letra minúscula. Escriba un programa
Prolog para el conjunto familia de la gráfica.

jua ines

n
luis
mari
a

pedr kare jose


o m

Arbol de Familia
hug
o

Este programa consiste de 6 cláusulas y cada una declara un hecho acerca de la relación
padre_de y cada una es una particular instancia de esa relación. Cada instancia es también
llamada relación. En general, una relación es definida como el conjunto de todas las instancias.

Cuando el problema ha sido bien comunicado al sistema Prolog, se puede hacer preguntas
acerca de la relación padre_de. Ej. es juan padre de maria?

Prolog maneja dos áreas de trabajo: El editor y la consola. El programa se escribe en el editor y
las preguntas se hacen en la consola así: ?- padre_de(juan, maría). Al ser esto un hecho en el
programa, Prolog responde: yes. Otra pregunta puede ser: ?- padre_de(luis, karem). Prolog
responde no, porque en el programa no hay mención de que luis sea padre de karem. También
responde no para al pregunta: ?- padre_de(ines, pilar). Porque el programa no ha escuchado
algo a cerca de pilar.

Otra interesante pregunta es: Quien es padre de pedro?


?- padre_de(Quien, pedro). Prolog responde asumiendo a Quien como variable y asignándole
el valor maria, así: Quien = maria.

Se puede preguntar Quiénes son los hijos de maria: ?- padre_de(maría, Quien). Y Prolog
puede entregar más de una respuesta:
Quien = pedro. Si se desea otra respuesta, se oprime la barra espaciadora y aparece una
nueva respuesta: Quien = karem. Al requierse más soluciones Prolog responde no porque
todas las posibilidades han sido presentadas.

Finalmente, el programa puede ser definido preguntado: Encontrar X y Y, tal que X es padre de
Y. Se expresa en Prolog así: ?- padre_de(X, Y). Prolog busca y presenta las parejas padre-hijo

1
Compiló Antonio García P.
y lo hace una a una, cuando se le pida una siguiente respuesta. Es posible parar cuando así lo
deseemos oprimiendo la tecla <enter>.

Es posible realizar otras preguntas algo más complicadas como: Quién es el abuelo de José?.
Esta pregunta es hecha en dos pasos:
ines

padre_de
lui
s

padre_de

jos
e

1) Quién es el padre de José?. Asuma que la respuesta es Y.


2) Quién es el padre de Y?. Asuma que es X.

La composición para la consulta es: Encontrar X y Y tales que satisfagan los siguientes dos
requerimientos:
?- padre_de(Y, jose), padre_de(X, Y). Se puede cambiar el orden de requerimientos: ?-
padre_de(X, Y), padre_de(Y, jose). Con igual significado lógico.

La respuesta es: X = ines, Y = luis

También es válida la pregunta De quién es abuelo ines o quienes son los nietos de ines?. ?-
padre_de(ines, Y), padre_de(Y, X). Las respuestas de Prolog son:

X = maria, Y = pedro; X = maria, Y = karem; X = luis, Y = jose

Otra pregunta es: pedro y karem tienen un padre en común? Esto puede ser expresado en dos
pasos:
1) Quién es el padre (X) de pedro?
2) Es (este mismo) X el padre de karem?, así:
?- padre_de(X, pedro), padre_de(X, karem).
La respuesta es X = ines

Ahora es posible plantear:


 Es fácil definir una relación con las n-tuplas de objetos que
satisfacen la relación.
 Es fácil hacer consultas acerca de las relaciones definidas.
 Un programa consiste de cláusulas y cada cláusula termina
con un punto.
 Los argumentos de una relación pueden ser objetos o
constantes (llamados átomos), u otros objetos como X, Y, Z llamados variables.
 Las preguntas al sistema consisten de una o más metas.
 Una respuesta puede ser positiva o negativa dependiendo si la
meta se satisface o no. Si es positiva se dice que la meta es satisfacible y se logra el éxito.

Ejercicio 1
1. Cómo responde Prolog las siguientes preguntas
a. ?- padre_de(hugo, X).
b. ?- padre_de(X, hugo).
c. ?- padre_de(juan, X), padre_de(X, karem).
d. ?- padre_de(juan, X), padre_de(X, Y), padre_de(Y, hugo).
2. Formule en Prolog preguntas para las siguientes relaciones
a. Quiénes son padres de karem?
b. Puede tener jose un hijo.
c. Quienes son los abuelos de karem
3. realice todo lo anterior con el árbol genealógico de su propia familia.
4. Dibuje el árbol genealógico como el de la primera grafica y aplicado a su familia.

Extensión del ejemplo con la inclusión de reglas


El anterior ejemplo puede ser extendido por varias vías. Inicialmente se adiciona información del
genero de las personas que concurren en la relación padre_de. Esto se puede mediante la
adición de hechos así:
femenino(ines).
femenino(maria).
femenino(karem).

masculino(luis).
masculino(jose).
...
Las relaciones anteriores son unarias, usadas para definir propiedades de los objetos y pueden
ser leída como: ines es femenino ó luis es masculino. Estas mismas relaciones se pueden
convertir en binarias:
sexo(ines, femenino).
sexo(ines, masculino).
...
Se introduce la relación hijo_de como inversa de la relación padre_de. Se define la nueva
relación haciendo una lista de hechos mencionando el par de personas tal que una hijo_de con
la lista de la relación padre_de. Ej. hijo_de(maria, juan). Pero puede ser definida más
elegantemente haciendo
uso del hecho de que es
la inversa de la relación X X X
padre_de que ya ha sido padre_de
hijo_de
definida. Así: padre_de
padre_de abuelo

Para todo X y Y, Y
hijo_de X si X padre_de Y Y Y
Y. padre_de

En Prolog se construye
así: hijo_de(Y, X):- Z
padre_de(X, Y). Este
tipo de cláusulas es llamado reglas. Una regla tiene una parte de condición (el lado derecho de
la regla) y una de conclusión (el lado izquierdo). La conclusión es llamada cabeza de la cláusula
y a condición es el cuerpo: hijo_de(Y, X):- padre_de(X, Y).
cabeza cuerpo
Ahora se adicionan más relaciones al programa ejemplo. La relación madre se basa en la
lógica: Paro todo X y Y, X es madre de Y si X padre_de Y y X es femenino. En Prolog se
construye así: madre(X, Y):- padre_de(X, Y), femenino(X).

Ejercicio 2
Defina nuevas reglas para relaciones como papá, tío, tía, primo, prima, hermano, hermana y
todas las de lazos familiares.

Definición de Reglas Recursivas


Ya es posible adicionar, en el programa familia, la relación predecesor a partir de la relación
padre_de(X, Y). Esa relación se expresa con dos reglas:
 La
primera define la relación directa X X
(inmediata) de predecesor. padre_de predecesor
 La padre_de
segunda presenta a los
predecesores indirectos (abuelos, Z Y
etc.).
padre_de predecesor
X es un indirecto predecesor de
Z, si entre ellos hay una cadera de Z
relaciones padre_de

La primera regla puede ser formulada como:


Para todo X y Z, X es un predecesor de Z si X es padre de Z.

Prolog lo construye así: predecesor(X, Z):- padre_de(X, Z).

La segunda regla puede ser construida así:


predecesor(X, Z):- padre_de(X, Y), padre_de(Y, Z).
predecesor(X, Z):- padre_de(X, Y1), padre_de(Y1,Y2), padre_de(Y2,Z).
predecesor(X, Z):- padre_de(X, Y1), padre_de(Y1,Y2), padre_de(Y2,Y3), padre_de(Y3,Z).
...
X
Ese programa se haría extenso para contemplar otras
posibilidades de predecesores (si el árbol de familia fuere
más profundo). Es más elegante y correcto formular padre_de la
relación predecesor y para que trabaje para toda
profundidad en el árbol de familia. La idea es definir Y
predecesor en términos de él mismo:
predecesor
Para todo X y Z,
X es predecesor de Z si hay un Y tal que
Z
1. X es padre_de Y y
2. Y es un predecesor de Z.

Que en Prolog se escribe así para la relación


indirecta: predece
...
predecesor(X, Y):- sor
padre_de(X, Y),
predecesor(Y, Z).
X
La regla para la relación directa es:
predecesor(X, Y):-
padre_de(X, Y).
Z
En la primera, la clave para la formulación es usar el mismo
predecesor en su definición y se llama definición
recursiva como se presenta en el grafico de la derecha.

Esta programación recursiva constituye uno de los principios fundamentales de programación


Prolog.

Ejercicio 3
1. Presente una nueva relación llamada sucesor(X, Z) para la relación inversa de
predecesor.
2. A partir de las anteriores relaciones, construya una relación pariente en la que se
incluyan los familiares por sucesores o predecesores y en las que se indique si hay alguna
relación de familia entre dos elementos X y Y.

También podría gustarte