Sunteți pe pagina 1din 60

Las constantes, en P ROLOG, se representan con nombres que comienzan con minusculas. Hay otro tipo de constantes (e.g.

, numericas)
que veremos mas adelante. Por otro lado, los nombres que comienzan con mayusculas denotaran variables cuantificadas universalmente.

Cada una de las lneas anteriores representa un hecho. Un hecho corresponde a un literal positivo cerrado (sin variables).

Estos axiomas no pueden tomar una forma arbitraria, sino que tienen restricciones sintacticas importantes. No es posible escribir un
programa P ROLOG a partir de cualquier conjunto de axiomas de un
lenguaje de primer orden. Por otra parte, P ROLOG esta extendido
con caractersticas extra-logicas, de modo que la relacion que hay
entre P ROLOG y logica de predicados no es obvia.

Un programa P ROLOG es un conjunto de axiomas en un lenguaje de


primer orden.

Introduccion a P ROLOG

Captulo 1

Hechos

Suponga que queremos escribir la informacion genealogica de un


grupo de personas. Para esto podemos utilizar los predicados
y
del siguiente modo:

1.1

Notese que P ROLOG responde


solo cuando el hecho asociado
aparece en la base de datos que tiene almacenada, o cuando se deriva
de la informacion almacenada.

o a traves de un archivo. Por ejemplo, si los hechos anteriores estan


en el archivo
, entonces el interprete P ROLOG lee el archivo
de la siguiente forma:

El prompt
indica que el interprete esta listo para escuchar los
requerimientos del usuario. A partir de esto uno puede hacer consultas:

Al desarrollar un programa, uno interactua con un interprete de P RO LOG . El programa, en este caso el conjunto de hechos anteriores, se
puede ingresar de dos formas; directamente:

Una pregunta mas interesante involucra el uso de variables. Por


ejemplo, si queremos saber si existe alguien que sea el padre de juan,
podemos preguntar:

Al decir
estamos preguntandole a P ROLOG si existe
alguna interpretacion para la variable que haga que
sea verdadera. P ROLOG responde que
es un valor que
hara que la consulta sea verdadera.

Mediante el signo , P ROLOG pregunta si se desea buscar otra solucion para el mismo problema. Al decir ; se le indica a P ROLOG
que efectivamente uno quiere buscar otra solucion. Al no haber otra
solucion, P ROLOG responde . Otro ejemplo puede ser:

En este u ltimo ejemplo, P ROLOG busca todos los pares


tales
que
es verdadero. Tambien es posible realizar preguntas mas complejas. Por ejemplo, supongamos que queremos saber
:
quien es el abuelo paterno de

(1.1)

donde, y
son literales positivos. Las variables que aparezcan en la cabeza de la clausula se suponen cuantificadas universalmente desde afuera. Por ejemplo, la clausula:

es equivalente a:

En este ejemplo, la consulta


se procesa en orden. Primero se resuelve la sub-consulta
y los valores resultantes de se usan para responder la segunda subconsulta. La , se interpreta como conjuncion.

Reglas

Una regla P ROLOG es una clausula de Horn definitiva, las cuales son
de la forma:

1.2

:-

El a tomo positivo se llamacabeza y en la sintaxis de P ROLOG la


clausula 3.1 se escribe:

Lo que se lee como es verdadero si


son verdaderos. El
smbolo
se lee si y corresponde a una implicacion de derecha a
izquierda.

Al programa que tenamos anteriormente, podemos agregarle las siguientes reglas:

se pueden escribir como la regla:

En esta notacion el smbolo ; se utiliza como disyuncion. La regla anterior es equivalente a las dos reglas originales. El uso de ;
debe restringirse intentando mantener la claridad de las reglas que
se escriban. No es recomendable utilizar ; cuando el resultado sea
difcil de leer.

Con estas regla podemos consultar quien es abuelo de quien:

Las reglas para

10

Suponga que se desea definir la relacion


mer termino, definiremos:

Con el significado obvio. As, podremos escribir que:

. En pri-

Como ejercicio, defina la relacion


entre dos individuos.
Esta relacion sera verdadera cuando los dos sujetos tengan al padre
o a la madre en comun.

De modo que obtenemos:

11

Que es un programa P ROLOG y como responde consultas?

Para indicar que es un predicado de aridad se escribe


teral, asociado al predicado
es un a tomo de la forma
Donde cada es un termino.

. Un li-

En particular tenemos un lenguaje basico que consta de un conjunto


de nombres de predicados, cada uno de ellos de una aridad determinada.

El lenguaje P ROLOG esta basado en logica de predicados de primer


orden o calculo de predicados.

1.3.1 Predicados, Functors y Terminos

1.3

12

Figura 1.1: Manejo de listas

Funciones: El u ltimo tipo de termino corresponde a terminos de


funcion o functors. Estos terminos son tambien llamados estructuras, pues se utilizan para construir estructuras complejas.
, etc. Un functor tiene una aridad
Por ej.,
asociada. Si es el nombre de un functor,
denota que
tiene aridad . Un termino de funcion asociado a un functor
sera
, donde cada es a la vez un termino.

Variables: Smbolos que comiencen con letra mayuscula o con un


. El smbolo de variable
underscore . Por ej.,
tiene un significado especial: es una variable que debe ser
reemplazada por un nombre nuevo cada vez que aparezca (aun
y cuando aparezca mas de una vez en la misma regla).

Caracteres y textos (strings): Los caracteres y los strings se en, etc.


cierran entre comillas dobles. Por ej.

Numeros:
Enteros y/o reales. Por ej.

Atomos: Smbolos que comienzan con letra minuscula, por ej.


, etc. Smbolos encerrados en comillas simples, por
ej.
, etc. (Nota: el a tomo
es equivalente al a tomo , y del mismo modo para todos los
smbolos que comienzan con minuscula.

14

En un lenguaje de listas, recordando a L ISP o Scheme, podramos


para denotar la lista vaca, y
tener constantes
para denotar a tomos. Podemos utilizar
para denotar el functor
que tiene dos argumentos. Ademas, podemos tener el prey el conjunto de reglas:
dicado

E JEMPLO : L ISTAS

Constantes: Estas pueden ser:

Al igual que en calculo de predicados, un termino puede ser: Sintacticamente, P ROLOG utiliza reglas similares a las de calculo de
predicados para la definicion de terminos. Los terminos pueden ser:

13

Para comprender cabalmente el funcionamiento del interprete de Prolog, necesitamos conocer los conceptos de unificacion y sustitucion,
que se estudian a continuacion.

La salida del interprete sera , cuando no sea posible demostrar, a


partir del programa, que la consulta es verdadera. En otro caso, responde si o entrega valores para las variables en la consulta que hagan
que la consulta sea verdadera.

Esta forma no es valida en S ICSTUS.

Cada
es un literal positivo de la forma
, donde
es un predicado de aridad . De este modo, las reglas para
de la sub-seccion anterior corresponden a un programa valido.

Formulas de la forma anterior reciben el nombre de clausulas unitarias.

es un literal.

El interprete de P ROLOG recibe como entrada un programa y una


consulta.

donde cada

:-

o como:

16

El interprete de P ROLOG toma como entrada un programa P ROLOG


y una consulta. Una consulta es una clausula de Horn sin literal
positivo. Una consulta se puede ver como una regla sin cabeza:

:-

Un hecho corresponde a una clausula de Horn con


escribir como1 :

y se puede

Un programa P ROLOG es un conjunto ordenado de clausulas de


Horn:

1.3.2 Programa y Consulta

15

cuando

Una sustitucion se puede aplicar a listas de literales, de modo que si


es una lista de literales, entonces
correspondera
a la lista
.

En este caso se dice que es un unificador para y . Naturalmente,


dados dos literales cualesquiera, no siempre existe un unificador para
ellos.

Dos sustituciones y pueden componerse para formar una tercera


, de modo que si es un literal, entonces
sustitucion
. Por ejemplo:

corresponde al termino

Por ejemplo,

18

si existe una sustitucion

Si
es un literal y una sustitucion, entonces
es un literal
que resulta de sustituir las variables que aparezcan en y por los
terminos asignados en .

unifica dos literales

es una instancia de un literal


.

Se dice que una sustitucion


.

Un literal
tal que

Una sustitucion es un conjunto de asignaciones de terminos a variables. Por ejemplo, las siguientes son sustituciones:

1.3.3 Sustitucion y Unificacion

17

G ENERAL .
U NIFICADOR M AS

s
s

es el resultado entregado por


unificar los argumentos.

cuando no es posible

Un unificador tambien se representara como una lista, cuyos elementos seran pares variable, termino . El manejo de listas se
hara a` la L ISP.

Un termino, tambien se representa como una lista con estructura


similar a la asociada a un literal positivo.

Un literal positivo se representa como una lista cuyo primer elemento es el nombre del predicado y los otros elementos son los
argumentos. Un literal negativo se representa con una lista cuyo
car (primer elemento) es el smbolo
y cuyo cdr (la lista sin
el primer elemento) es la lista correspondiente al literal positivo.

Dado un par de listas de literales


y , siempre existe un unificador que es mas general que cualquier otro, a e ste unificador se le
.
denota

recibe como argumentos


y . Cada argumento
La funcion
puede ser una lista de literales, un literal, una variable o una constante. Utilizaremos la siguiente convencion:

Por ejemplo, si queremos unificar


con
, el unies mas general que el unificador
ficador
, puesto que
.

20

A continuacion se especifica el procedimiento


para encontrar el
unificador mas general entre dos listas de literales.
q

y
se dice mas geneUn unificador para listas de literales
cuando existe otro unificador
tal que
ral que un unificador
.

19

22

Figura 1.3: Procedimiento

(fig. 3.3) recibe los mismos argumentos que


La funcion
mas una sustitucion a la que se le compondran nuevas sustituciones
para retornar el resultado final.

21

: Unificador Mas General

Figura 1.2: Procedimiento

es una funcion recursiva.


es un predicado que es verdadero cuando su argumento es una variable. Utiliza las siguientes
funciones auxiliares:

23

24

De este modo, es posible que P ROLOG entregue sustituciones problematicas, como la mencionada anteriormente.

Figura 1.4: Procedimiento

En el lenguaje de programacion P ROLOG, la unificacion, entre literales o entre terminos, juega un rol fundamental. En cada paso de
derivacion, como veremos mas adelante, se utiliza unificacion. Por
esta razon, es fundamental que este procedimiento sea muy eficiente. Persiguiendo esta eficiencia, en P ROLOG el occurs check no se
realiza. Es decir, P ROLOG, utiliza el siguiente procedimiento:

El procedimiento
recibe como primer argumento
una sustitucion y como segundo argumento una lista de literales, un literal o un termino y devuelve el resultado de aplicar la
sustitucion del primer argumento al segundo argumento.

Finalmente, el procedimiento
(fig 3.4), recibe una variable
como primer argumento y retorna una unificacion entre esta variable y su segundo argumento. Esto es posible solo si la variable no
aparece en su segundo argumento.

es un predicado que retorna verdadero cuando su argumento es una constante.

La funcion
realiza el llamado occurs check, mediante el
cual se verifica que en la unificacion no se produzca una asignacion
.
recursiva del tipo

1.3.4 Unificacion en P ROLOG

P ROLOG intenta uniSi a P ROLOG se le entrega la consulta


ficar ambos terminos. Si ambos terminos son unificables, entonces
P ROLOG dice que
es verdadero y entrega la unificacion(el
predicado de P ROLOG es extra-logico y no corresponde al smbolo
de igualdad logica).

En P ROLOG existe un predicado que permite encontrar el UMG entre dos expresiones.

25

El interprete maneja una lista


inicializa como:

de objetivos que inicialmente se

Ademas, maneja una sustitucion inicializada en vaco. Una vision simplificada del interprete se da en la figura 3.5 Algo que no
se menciona en la figura es que el interprete da la posibilidad de encontrar otra sustitucion que satisfaga al objetivo inicial en caso de
que la respuesta sea positiva. Por simplicidad, en el algoritmo que
describimos mas abajo ignoraremos este paso.

Dado que P ROLOG no realiza el occurs check, se observa el siguiente


comportamiento:

Los literales
se interpretan como una lista de objetivos a
ser demostrados uno a uno. Los literales de esta lista pueden incluir
variables. En cuyo caso podemos decir que la tarea de prolog es
determinar si existe una sustitucion para la cual la conjuncion de
sea deducible a partir del programa.

:-

Por ejemplo:

26

Ahora estamos en posicion de estudiar que hace el interprete de


P ROLOG. Como mencionaramos anteriormente, le interprete recibe como entrada una consulta:

1.3.5 Que hace el interprete de P ROLOG?

Lista

Interprete de Prolog

S (exito) + susticion de
variables que aparecen
en objetivo inicial

No (falla)

27

28

y
: Dos procedimientos que reciben una lista de objetivos
y retornan una sustitucion o #Falso si no hay sustitucion posible.
recibe ademas de la lista de objetivos, un ndice a una
clausula dentro del programa.

ren: Un procedimiento que recibe una lista de literales y renombra


las variables con nombres nuevos. Es usual que estos nombres
sean de la forma donde es un numero entero.

: sustituciones.

: Lista de objetivos (literales positivos).

: Lista de literales correspondientes al objetivo o consulta inicial.

En la descripcion del algoritmo que estudiamos mas abajo utilizaremos la siguiente convencion:

DE CONSULTAS .
A LGORITMO DE P ROLOG PARA RESOLUCI ON

Figura 1.5: Entrada/Salida del Interprete de Prolog

de Objetivos

Programa P ROLOG

sin el occurs check.

y
: dos funciones sobre reglas o listas de objetivos. Si
es una lista, entonces
es el primer literal de y
es el resto de la lista. Si es una clausula,
es la cabeza de la clausula y
es el cuerpo.

: Constante que se inicializa como el numero de clausulas del programa.

: Las clausulas del programa.

: El procedimiento

29

2
En este procedimiento no se considera la posibilidad de que uno de los objetivos pueda corresponder al predicado
extra-logico .

El procedimiento
invoca a
(ver figura 3.6) indicandole
que debe comenzar a buscar una sustitucion, que permita satisfacer
la lista de objetivos, a partir de la clausula del programa2 .

30

podramos guardar el estado de la computacion en un objeto. Este objeto, llamado continuacion, contendra el stack de registros de
activacion junto con el punto en el cual se esta ejecutando el procedimiento. Entonces, en vez de ejecutar la instruccion de return como
aparece en el procedimiento, se ejecuta una instruccion condicional.
La condicion dira que, en la primera ejecucion de este procedimiento, se retorna la composicion junto con la continuacion. La segunda
oportunidad en que se ejecuta esta continuacion, el procedimiento
retorna
. De este modo, la continuacion permite que se encuentren otras respuestas. La forma en que se detecta que invocacion
del procedimiento se esta ejecutando (es decir, va directa o va la
continuacion) depende del lenguaje utilizado y de la forma en que se
realicen las continuaciones.

es el objetivo inicial, el procedimiento prolog se in-

Dado que
voca como:

: Los procedimientos utilizados por


descritos anteriormente.

y
el procedimiento

Notese que, si quisieramos agregar la posibilidad de buscar nuevas


soluciones cada vez que encuentra una, este algoritmo se complica.
Para ello, lo que necesitamos es utilizar continuaciones. Conceptualmente, una continuacion es un procedimiento junto con un ambiente
de ejecucion. Por ejemplo, antes de ejecutar la u ltima instruccion
del procedimiento
:

La ejecucion del programa P ROLOG es equivalente a realizar una


busqueda en profundidad (concepto estudiado en datalle mas adelante) en un espacio definido por el programa y por el objetivo inicial.
La figura 3.8 ilustra el mismo.

A modo de ilustracion, considere el siguiente programa:

La figura 3.7 muestra

junto con la consulta:

E JEMPLO :

32

31

Figura 1.6: Procedimiento simplificado del interprete de P ROLOG

34

Figura 1.8: Arbol de Busqueda de una Demostracion

33

del objetivo

Figura 1.7: Resultado del

Supongamos que queremos escribir el predicado


,
donde es algun termino, y es una lista. Queremos que este predicado retorne verdadero cuando la lista contenga al termino en cuestion. Esto se puede escribir como en la figura 3.10.

Figura 1.10: Pertenencia de un termino a una lista (version 1)

Es importante tener en mente que la semantica


declarativa y la procedural no son equivalentes.

Figura 1.9: Que constituye una lista

son verdaderos.

36

En la figura 3.1 se presento una primera version de un conjunto de


reglas que permiten determinar si un objeto es una lista. Una version
simplificada de e ste es el programa de la figura 3.9.

Manejo de Listas

1.4.1 Aspectos Preliminares

1.4

El objetivo
sera verdadero si existe una sustitucion tal que, para cada sub-objetivo de ,
existe una clausula :en el programa, tal que:

Si
es una lista de literales que forman una consulta. Entonces,
desde un punto de vista declarativo, P ROLOG intenta demostrar que
es verdadero.

Nos interesa especificar la semantica declarativa de P ROLOG.

El significado procedural de un programa P ROLOG esta dado por el


algoritmo que simula el comportamiento de P ROLOG.

1.3.6 Significado Declarativo de un Programa P ROLOG

35

Podemos reescribir este procedimiento como en la figura 3.11, la


u nica diferencia es que la unificacion de lado derecho se realiza de
otra forma.

37

Al manejar listas, existen diversas operaciones de uso comun, las


que se describen en las sub-secciones siguientes.

Notese que no cualquier expresion que involucre el functor


puede escribirse como una lista. Este es el caso de los dos u ltimos ejemplos de la figura 3.13.

3
Es usual que este predicado, junto con otros predicados para manipulacion de listas, esten predefinidos o sean
parte de una librera estandar de P ROLOG.

Figura 1.12: Definicion de

se puede reescribir coDe esta manera, el procedimiento


mo el procedimiento
(nombre estandar) de la figura 3.123 .

En esta definicion, la lista vaca, que nosotros llamaramos


, se de. El operador
corresponde al operador . (punnota como
to).

Al igual que en el lenguaje de programacion L ISP, las listas son elementos basicos del lenguaje P ROLOG y se encuentran predefinidas.

es equivalente a la lista
, lo que tambien puede escribirse
. La tabla de la figura 3.13 ilustra las equivalencomo
cias entre las diferentes notaciones para listas.

Figura 1.11: Pertenencia de un termino a una lista (version 2)

38

Al igual que en L ISP, existe una notacion mas facil de leer para
manejar listas. De hecho, la lista:

El predicado
recibe como argumentos tres listas. De moes un predicado verdadero cuando es
do que
el resultado de realizar append de las listas
y . Para comprender mejor la forma en que este predicado se define, veamos primero
una version L ISP del mismo:

1.4.2

39

Esto se puede reescribir como:

40

La segunda condicion de la funcion L ISP, dice que si no es vaca,


el resultado es un
del primer elemento de con el
del
resto de y . Esta recursion esta bien definida pues en cada paso
se reduce la lista .

Notese que en L ISP hay solo dos argumentos para append, puesto
que la funcion retorna un resultado.

En P ROLOG, el resultado debe ser uno de los argumentos del predicado. Al invocar
, la variable
estara unifica. La primera condicion de la funcion L ISP
da al resultado del
dice que, si la primera lista es vaca, entonces el resultado es igual a
la segunda lista. Esto se escribe en P ROLOG como:

Esto se puede reescribir en P ROLOG como:

41

Notese el uso de unificacion para obtener las sub-componentes de


una lista. La unificacion es la herramienta usual para descomponer
estructuras arbitrarias en sus componentes. Al igual que anteriormente, este procedimiento se puede reescribir como:

Figura 1.14: El Procedimiento

La figura 3.14 muestra la version final de este procedimiento.

42

Una caracterstica fundamental de P ROLOG es que los argumentos


de los predicados no tienen un rol de entrada/salida. Esto es, un
argumento se puede utilizar tanto para recibir datos como para entregar resultados. Esto se ilustra con las siguientes invocaciones a
:

1.4.5

Las definiciones alternativas de


son recursivas. Al analizar el procedimiento de ejecucion de un objetivo que utilice el segundo procedimiento es recursivo por la cola, mientras que el primero
no lo es. En general, resulta mas conveniente utilizar procedimientos
que sean recursivos por la cola por razones de eficiencia.

Es importante observar que la segunda version de


, que
, no produce el resultado esperado cuando su
hace uso de
primer argumento no es una lista.

Figura 1.16: Segunda version de

se ve en la figura 3.16.

ternativa para

Figura 1.15: Primera version de

44

El predicado
es verdadero si su segundo argumento es el
u ltimo elemento del primer argumento, el cual debe ser una lista.

1.4.4

El objetivo
sera satisfecho cuando L1 y L2 sean
listas con los mismos elementos pero en orden inverso, la figura 3.15
ilustra una primera version de este procedimiento. Una version al-

1.4.3

43

es una

46

La invocacion
se satisface cuando
es otra lista que es una permutacion de .
lista y

es igual

45

1.4.7

La invocacion
se satisface, cuando
menos una de sus componentes.
a

1.4.6

Una posible ejecucion de esto es:


Manejo de Numeros

En P ROLOG los objetos numericos pueden corresponder a tipos


o
. Para realizar operaciones numericas, se tiene el predicado
, el cual se comporta como una asignacion. As, el objetivo
sera satisfecho cuando unifique con el resultado de
evaluar expresion resulte en un numero. Por ejemplo, si definimos:

1.5

47

, P ROLOG ofrece el siguiente conjunto de

48

, que corresponden a comparaciones usuales.

Las expresiones aritmeticas se forman de la manera usual utilizando parentesis redondos y operadores , , , que son operadores de
suma, resta y multiplicacion, y y , que corresponden a division
e
respectivamente. El operador
corresponde al
resto de la division.

observaremos el siguiente comportamiento:

y
que permiten comparar dos valores numericos. El
primero es verdadero si los valores numericos son iguales, y el
segundo se son diferentes.

2. , ,

1.

Ademas del predicado


predicados:

Manejo de Caracteres y de Strings

49

se maneja en forma similar a como se maneja


El tipo de dato
en el lenguaje . As, un char es simplemente un numero entre y
, correspondiente a los caracteres de la tabla ASCII.

1.6

Un string se maneja como una lista de caracteres. Por ejemplo:

EJEMPLO: Generacion y Prueba

50

Como ejemplo, suponga que tenemos un conjunto de nombres de


individuos y que queremos encontrar a algun individuo que tenga
apellido
.

Si el espacio de soluciones para un problema es enumerable, entonces podemos tener un modulo generador de soluciones, y un modulo
chequeador o probador de soluciones.

1.7.1 Motivacion

1.7

El espacio de posibles soluciones esta dado por el conjunto de individuos, que en P ROLOG podramos especificar como:

En este caso, el generador de soluciones posibles es el predicado


, mientras que
es el probador, que debe satisfacerse cuando su argumento corresponda a una lista ordenada.

La eficiencia de la estrategia presentada dependera exclusivamente


del algoritmo de generacion de posibles soluciones.

52

Si es una lista de numeros que queremos ordenar, entonces un espacio de soluciones posibles corresponde al conjunto de permutaciones
de , de modo que podemos escribir:

1.7.2 Ordenamiento de listas

La estrategia utilizada ha sido generar las posibles soluciones, utilicomo generador de posibles soluciones, y probar, utizando
lizando
como probador.

Si tratamos de satisfacer el
cion que queremos.

51

, P ROLOG entregara la solu-

La solucion de nuestro problema puede ser:

Se obtiene el siguiente resultado:

53

Se obtienen dos soluciones, debido a la repeticion de terminos en la


lista.

Ordenamiento por insercion directa:

Para el problema especfico de ordenacion de listas, es posible especificar un algoritmo mas apropiado que el anterior.

permutaciones para obtener


En el peor caso, el algoritmo genera
el resultado. Este algoritmo de ordenacion es pesimo!!!!!!

Tambien es posible utilizar algoritmos con mejor comportamiento,


como quicksort, el procedimiento quicksort lo dejamos como ejercicio.

Como es sabido, este algoritmo ordena una lista en tiempo proporcional a .

Consideraremos que una posible solucion es una secuencia de acciones elementales (cruces del ro de un lado a otro), que llamaremos
plan. De este modo, necesitaremos un generador de planes, junto
con un chequeador de planes, el cual debera reconocer cuando un
plan es exitoso.

Queremos resolver este problema utilizando la estrategia generacion


y prueba. Para ello, debemos definir un espacio de posibles soluciones, junto con una prueba que permita chequear una solucion.

Hay tres canbales, tres misioneros, un ro y un


bote. Los canbales, los misioneros y el bote
se encuentran en una rivera del ro. Los seis
sujetos deben cruzar el ro, pero el bote solo
permite trasladar a dos personas a la vez. Se
debe encontrar una secuencia de movimientos de
personas en el bote que permita cruzar a los seis
individuos de manera segura. No es seguro que
hayan mas canbales que misioneros en alguna
parte del ro en un momento dado.

1.7.3 Misioneros y Canbales

54

Notese que una especificacion como:

no estan unificadas, se

56

,
Para representar esta accion, utilizaremos el termino
donde correspondera al numero de canbales y correspondera al
numero de misioneros a cruzar.

Las acciones posibles pueden ser especificadas como:

Finalmente, un plan de accion sera representado como una lista de


acciones primitivas.

La u nica alternativa sera especificar logicamente los numeros enteros y sus operaciones basicas. Esto se puede realizar, pero el costo
computacional del procedimiento resultante es muy alto.

En nuestro ejemplo, una accion primitiva corresponde a un cruce de


personas de un lado al otro del ro.

no funciona. puesto que si las variables


produce un error.

Un plan de accion es un conjunto de acciones primitivas que deben


ser ejecutadas en orden.

.
P LANES DE ACCI ON

55

q
q

El estado inicial se representa como


, mien. En el programa
tras que el estado final es
que estamos construyendo, esto lo representamos con los hechos:

: Indica en que lado del ro se encuentra el bote.

: Misioneros en la rivera derecha.

: Canbales en la rivera derecha.

: Misioneros en la rivera izquierda.

Ademas, necesitamos saber cual es el estado resultante despues de


ejecutar una accion. Esto lo podemos lograr del siguiente modo:

: Canbales en la rivera izquierda.

El estado del problema lo representaremos con un termino


donde los argumentos corresponden a:

58

Dado un estado, nos interesa saber si una accion determinada es


valida en ese estado. Para esto, definimos:

A partir de la configuracion o estado inicial, queremos aplicar acciones primitivas para generar otras configuraciones o estados. Estos
estados deben representarse explcitamente.

E STADOS .

57

Para la generacion de planes, definimos el predicado


.
Como una primera aproximacion, consideraremos que este predicado es verdadero para cualquier conjunto de acciones. De modo que,
una definicion posible es:

DE P LANES .
G ENERACI ON

59

P ROLOG dara como primera solucion

El orden de enumeracion o de generacion de planes resultante es de


menor a mayor longitud.

4
La situacion es aun mas compleja, puesto que antes de generar todos los planes de longitud
todos los planes de longitud .

, se generan

La naturaleza exponencial de este problema hace que esta solucion,


que es declarativamente correcta, no funcione en la practica.

Esto es, aproximadamente, entre 10 y 50 millones de planes!!!

Dado que hay cinco acciones posibles, tendremos que generar entre
y
planes distintos.

El plan mas corto que resuelve nuestro problema es de tamano once.


De modo que, para encontrar la solucion, deberemos generar por lo
menos todos planes de longitud diez4 .

Es posible resatisfacer este objetivo una cantidad infinita de veces.

60

Se generan todos los planes de longitud 1, despues de longitud 2, etc.


El proceso de generacion y prueba mas simple de formular es uno en
el cual se enumeran los planes hasta que se encuentre uno que de el
resultado buscado.

Al resatisfacer el objetivo, P ROLOG respondera


(por que?).

Al invocar
que
.

62

Finalmente, nos queda por especificar el predicado


cual es simplemente:

, el

Como ejercicio, analice como resultara el proceso de evaluacion de


si la primera accion fuese el primer elemento de
la lista.

El plan encontrado contiene a la u ltima accion a ejecutar en la primera posicion.

En este punto, se puede notar que la representacion de planes es en


base a una lista de acciones primitivas.

Donde
sera verdadero cuando al
partir de y del plan se llega al estado final , sin pasar por ningun
estado intermedio invalido.

Este u ltimo predicado se define como:

De este modo, escribiremos:

Una mejora sustantiva a este algoritmo de generacion y prueba se


obtiene al no generar la lista de planes posibles en base a fuerza
bruta. Un enfoque alternativo es considerar que
es verdadero solo para listas de acciones que se ejecuten en estados
posibles y que no produzcan estados inseguros (para los misioneros).

61

Para obtener este plan, se generaron 55252 planes posibles o intermedios.

El resultado de este programa se obtiene al darle a P ROLOG el objetivo


, lo cual arroja el siguiente resultado:

64

63

El programa resultante es:

Mas adelante, se estudia en forma metodica el tema de busqueda.

En nuestro ejemplo, se logro una mejora muy importante al generar


el espacio de busqueda en forma cautelosa.

Por esta razon, es necesario introducir conocimiento estructural de


los problemas, junto con estrategias de busqueda inteligentes.

Estos problemas no se pueden atacar utilizando fuerza bruta, pues el


numero de estados generados crece exponencialmente.

El problema de los misioneros y de los canbales es un ejemplo


clasico de planificacion.

.
C ONCLUSI ON

65

66

67

Para esto, se introducen mecanismos extra-logicos y meta-logicos,


que permiten escapar al mecanismo de demostracion para resolver
algun objetivo o consulta.

Para producir programas practicos, es necesario escapar del paradigma de programacion logica pura (es decir, P ROLOG puro).

En ese contexto, se busca producir programas que sean declarativamente correctos.

Con la sola excepcion del predicado


y de aquellos para la manipulacion de numeros (
etc.), el captulo anterior se
centro en lo que comunmente se conoce como P ROLOG puro.

68

En este captulo estudiaremos ambos tipos de extensiones a programacion logica pura.

Por otra parte, los predicados meta-logicos son aquellos que permiten razonar respecto de las reglas que se ejecutan y respecto del
estado de una demostracion.

P ROLOG intenta satisfacer dicho objetivo, invocando a procedimientos aritmeticos que no obedecen a una especificacion logica, sino a
rutinas aritmeticas extra-logicas.

El Lenguaje de Programacion P ROLOG

Captulo 2

Por ejemplo, al resolver un objetivo como:

Control del Proceso de Demostracion

Cuando se encuentra con el objetivo , P ROLOG se compromete con


todas las unificaciones que se han realizado antes del y desde el
momento que se introduce el a la lista de objetivos pendientes.

Es decir, P ROLOG buscara todas las formas de satisfacer el objetivo. En muchas ocasiones uno puede estar interesado en una sola
solucion para un objetivo dado. Para estos casos, P ROLOG entrega
la posibilidad de cortar la busqueda, mediante el uso del operador
.

70

Utilizando el operador de corte, observaremos el siguiente comportamiento:

Si utilizamos el predicado
, que vimos anteriormente (figura 3.12), observaremos el siguiente comportamiento:

2.1.1 El Operador de corte

2.1

69

Como segundo ejemplo, suponga que se desea escribir el predicado


. Este predicado debera ser verdadero si su segundo y
tercer argumentos son listas y si su primer argumento pertenece a
ambas listas. Una solucion para este problema es:

71

Es decir, P ROLOG nos entrega todas las posibles unificaciones para


que satisfacen el objetivo:

El operador es muy problematico y, si es mal usado, corrompe el


significado declarativo de los programas.

En este caso, observaremos:

De este modo observaremos el siguiente comportamiento:

72

Es comun que uno este interesado en una sola solucion para un problema. En este caso podemos reescribir la definicion de la siguiente
manera:

Despues pasa por el operador , lo que lo compromete con la unificacion


.

74

Como ejercicio, determine que respuestas diferentes da P ROLOG pay con el objetira con el objetivo
vo
.

, P ROLOG ya se ha comproy no intenta re-satisfacer el objetivo

Luego, al fallar
metido con aquel valor para

A pesar de ser capaces de demostrar que pertenece a ambas listas,


cuando se pregunta por algun que pertenezca a ellas, P ROLOG dice
que no hay ningun objeto que pertenezca a ambas listas.

Lo anterior ocurre puesto que al resolver


, P ROLOG encuentra como primera solucion

Por que?

Con el ejemplo anterior, observaremos lo siguiente:

El uso equivocado de cortes puede introducir errores difciles de detectar.

73

por el lado derecho de

donde
e
son tuplas disjuntas de
variables. Si P ROLOG logra demostrar
, entonces el
se satisface, y
P ROLOG se compromete con las unifica.
ciones encontradas para resolver
Ademas, P ROLOG se compromete con la
regla y no buscara otra manera de satisfacer
.

:-

Supongamos que en un momento dado


P ROLOG utiliza la regla:

Ahora bien, si reemplazamos


y
sus respectivas reglas, observaremos:

Observaremos el siguiente comportamiento:

76

Dado que las u nicas reglas para


y
son las especificadas anteriormente, este comportamiento es incorrecto, desde un punto de
vista puramente declarativo. Este ejemplo ilustra que el significado
de depende fuertemente del contexto en que aparezca.

Como se dijo anteriormente, el uso del operador


puede romper
completamente la logica de un programa. En particular, supongamos
que las siguientes son las u nicas reglas para
y
:

75

77

es el mayor entre el primer y se-

Por esta razon, al escribir el corte impedimos que P ROLOG explore


ramas de busqueda de soluciones que fallaran.

Al utilizar la primera regla, una vez que se satisface la condicion


se sabe que la otra condicion (que correspondera al else) no se
puede cumplir.

El tercer argumento de
gundo argumentos.

Para determinar si un corte determinado es verde o es rojo, uno simplemente elimina los cortes y lee el programa en forma declarativa.
Si la lectura declarativa es correcta, entonces el corte es verde.

Un corte se dice rojo cuando se busca abusar del procedimiento P ROLOG de demostracion. Esto u ltimo resulta en programas
que pierden su significado declarativo.

78

Un uso comun para el corte en programas P ROLOG es cuando se


requiere del uso de condiciones de tipo if then else. Ejemplo:

Un corte se dice verdecuando su uso no rompe la logica del


programa.

En la jerga del lenguaje de programacion P ROLOG, se han catalogado dos formas del uso del operador de corte, llamadas cortes verdes
(green cuts) y cortes rojos (red cuts).

2.1.2 Como y Cuando usar el Operador

Para ilustrar lo que puede ocurrir cuando se escriben programas que


utilizan cortes rojos, consideremos la siguiente modificacion a las
reglas anteriores:

Entonces, como estilo de programacion se recomienda que se escriban programas sin cortes. Si la lectura declarativa del programa es
correcta, se agregan cortes con el objetivo de impedir que P ROLOG
se entretenga explorando demostraciones que no tendran e xito.

79

La condicion
no puede ser verdadera si se invoca la segunda
regla. Por ello, la condicion
esta demas.

80

Este razonamiento es correcto solo cuando se invoca


con
argumentos para los cuales debiera ser verdadero, o cuando el tercer
argumento es variable. Por ejemplo:

Sin embargo, este procedimiento puede responder erroneamente a


ciertas consultas. Por ejemplo:

Para definir negacion como falla, utilizamos el predicado


como objetivo).
cual nunca se satisface (es como escribir

Definiremos el predicado
, que recibe un literal positivo como
argumento. Si el literal es demostrable por P ROLOG, entonces se
sera satisfecho.
fallara. En otro caso, el predicado

, el

es verSi quisieramos inferir correctamente que


dadero, el lenguaje P ROLOG debiera permitirnos escribir reglas que
permitan inferir negaciones de este tipo.

Esto no es equivalente a negacion de verdad.

Desgraciadamente, este programa no es valido en P ROLOG, puesto que las clausulas admisibles en un programa P ROLOG deben ser
clausulas de Horn. Es decir, estas reglas no pueden escribirse en
P ROLOG.

En base al ejemplo anterior, la idea es que si el objetivo


falla (es decir, no se puede demostrar), entonces diremos que dicho
objetivo es falso.

Nos gustara poder escribir esto como:

Si el a tomo pertenece a la primera lista, entonces la tercera lista debe


unificar con la primera lista, en otro caso, la tercera lista debe unificar con la segunda.

82

La alternativa a lo anterior es utilizar nuestro conocimiento del procedimiento de demostracion para definir un operador de negacion
basado en fallas.

Como ejemplo, supongamos que queremos definir una regla que reciba un a tomo y tres listas de a tomos como argumentos.

El uso mas comun del operador de corte es para consultar si algo no


es satisfacible.

2.1.3 Negacion como Falla

81

Las reglas son:

El corte es imprescindible puesto que si no estuviese y se intentara


resatisfacer el objetivo, se invocara la segunda regla. La segunda
regla siempre tiene e xito.

La regla dice que si es demostrable, entonces el resultado es

Observaremos el siguiente comportamiento:

La semantica de este procedimiento de negacion ha causado mucha


controversia en el ambiente de programacion logica.

De este modo, podemos redefinir las reglas para


guiente manera:

La primera clausula es un tanto extrana, pues su significado procedural pareciera ser de segundo orden.

83

El predicado
esta predefinido en P ROLOG y se escribe
reglas anteriores se pueden escribir como:

84

. Las

de la si-

Entrada y Salida

86

Para lectura de un archivo que contenga definiciones de predicados,


, cuyo argumento debe unificar
se utiliza el predicado
con una lista de a tomos. Por ejemplo, al satisfacer el objetivo:

2.2.1 Lectura de Programas

que, es equivalente a:

En P ROLOG es posible realizar lectura desde varios archivos de entrada y escritura a varios archivos de salida. La entrada desde el
teclado y la salida a la pantalla se tratan igual que los archivos comunes de entrada y salida respectivamente.

El manejo de la Entrada y Salida de datos muchas veces vara de implementacion a implementacion. Nosotros usaremos una de las formas mas comunes del manejo de entrada y salida, la cual se origino
en las primeras implementaciones de P ROLOG en maquinas DEC10.

2.2

85

Despues de leer el contenido de los tres archivos, se procede a leer


clausulas desde el terminal. Todas las clausulas que aparezcan en los
archivos seran integradas a la base de datos de clausulas mantenidas
por P ROLOG.

se leera, en el orden mencionado, el contenido de los archivos


,
y
.

:-

Dentro de un archivo, es posible incluir lneas con la forma:

En este caso, P ROLOG intentara satisfacer


, si falla, se
. Estos objetivos se usan para darle insproduce un
trucciones al sistema de prolog. Por ejemplo, en S ICSTUSP ROLOG,
el objetivo:

87

88

El flujo de entrada, inicialmente


(correspondiente al terminal),
cuyo argumento
puede ser cambiado utilizando el predicado
debe unificar con un a tomo que se asocia a un archivo. Por ejem, la proxima operacion de
plo, al satisfacerse el objetivo
lectura se realiza desde el archivo
. Si el archivo no existe, se
produce un error. Las operaciones de lectura se realizan en forma
se satisface cuando su argumensecuencial. El predicado
to unifica con el flujo de entrada en uso. Si
es un archivo cuya
primera lnea contiene , se observa el siguiente comportamiento:

Esta librera incluye definiciones para operaciones sobre listas. Por ejemplo,
, etc. En el futuro, utilizaremos manejo de listas en base a los procedimientos de esta librera.

se puede usar si uno ha modificado las definiciones que aparecen en


el archivo
.

que, es equivalente a:

.
Otra forma de leer archivos es mediante el predicado
Que tambien recibe una lista de archivos. La diferencia es que cada
conjunto de reglas que aparezca en un archivo, para definir un predicado, reemplazara a cualquier definicion existente anteriormente.
Por ejemplo

Le indica a P ROLOG que debe leer el contenido del archivo de la


1
librera
.

El predicado de lectura basico es


que se utiliza para leer
, P ROLOG leera un termino desde el
terminos. Al invocar
flujo de entrada, el cual sera unificado con . Si hay un error de
sintaxis, se produce un error. El fin del termino se reconoce cuando
se encuentra un .. Por ejemplo:

2.2.2 Lectura de Datos

Para leer un archivo como un flujo de caracteres, se utiliza


y
. Al invocar estos predicados se lee un char del archivo
de entrada en uso y se unifica con el argumento recibido. Al usar
, todos los caracteres de control son ignorados, mientras que
unifica su argumento con cualquier caracter ASCII.

90

El predicado de escritura basico es


que se utiliza para es, P ROLOG escribira en el flujo
cribir terminos. Al invocar
de salida el termino con el que este unificado. Por ejemplo:

2.2.3 Escritura de Datos

Si el archivo no contiene mas datos, el argumento de


unifica con
. Para terminar de ver un archivo, se utiliza
. Este predicado siempre se satisface y cierra el archivo de
).
entrada (si e ste no es

89

y luego cerrara e ste.

en el archivo

Finalmente, para escribir un caracter de cambio de lnea, se utiliza


, que siempre se satisface y como efecto lateral escribe un
cambio de lnea en el flujo de salida.

Escribira

Este predicado siempre se satisface. Por ejemplo:

Para terminar de escribir un archivo, se utiliza

El predicado
se satisface cuando su argumento unifica
con el flujo de salida en uso.

92

Para escribir un archivo como un flujo de caracteres, se utiliza


.
Al invocar e ste predicado el char de la tabla ASCII correspondiente
a su argumento se escribe en el flujo de salida en uso. Por ejemplo:

Si el archivo existe, e ste se reescribe.

Por ejemplo, al satisfacerse el objetivo


racion de escritura se realiza al archivo

, la proxima ope-

El flujo de salida, inicialmente


(correspondiente al terminal),
puede ser cambiado utilizando el predicado
cuyo argumento
debe unificar con un a tomo que se asocia a un archivo.

91

Al intentar satisfacer el objetivo


, se lee un caracter,
que queda instanciado en . A continuacion, se invoca a
Este u ltimo predicado se satisface cuando, habiendo ledo el primer
caracter de la palabra, se lee la palabra
, y la lectura se suspende habiendo ledo el caracter , que corresponde al
primer caracter que no pertenecera a la palabra. Esta forma de leer
palabras puede resultar confusa. Sin embargo, hay que tener en mente que no se puede reconocer el fin de una palabra sin leer el primer
caracter que no pertenece a ella. Este caracter que no pertenece a
la palabra, debera utilizarse al continuar la lectura. As, leer palabra
recibe como primer argumento el primer caracter que podra formar
parte de la nueva palabra. De ah la necesidad de la primera lectura
. Una vez leda la primera palabra, se lee el resto de la
oracion de forma similar:

Ahora definimos que caracteres son validos como parte de una palabra:

se define como:

94

En primer termino, especificaremos que caracteres pueden ser utilizados para terminar la entrada de una oracion. Ademas, especificamos cuales constituyen caracteres de puntuacion validos.

El predicado

Para programar programas interactivos, es a menudo deseable leer


como entrada listas de palabras. Por ejemplo, un programa podra
preguntar el nombre de un individuo. Ante esto, el usuario escri.
bira en el terminal un string como:
Para procesar este string, es muy posible que lo mas conveniente
sea transformarlo en una lista de cuatro a tomos como
. Lamentablemente, las primitivas de P ROLOG para hacer lectura no permiten hacer esto de manera
directa. Lo que se requiere es leer los datos desde el terminal (o
de un archivo) caracter a caracter, utilizando
, y armando en
forma sucesiva los a tomos que compondran la lista final. En esta
seccion, veremos como es posible realizar esta operacion.

2.2.4 Ejemplo: Lectura de Oraciones

93

La primera regla dice que si se ha ledo un caracter terminal, entonces no hay nada mas que hacer. El
se incluye para evitar
que se intente resatisfacer este predicado, puesto que ello forzara a
continuar la lectura. La segunda regla tiene exactamente la misma
, excepto que el primer
estructura que la regla para
caracter a considerar se recibe como argumento y no es necesario
leerlo.

95

El resto de las reglas necesarias para completar la lectura de palabras


se debe entender
sigue una estructura muy similar. El uso de
como una forma de if then else.

96

98

El predicado
que se satisface si su argumento es una variable
corresponde a la negacion
no unificada. El predicado
del anterior. Por ejemplo:

En el segundo ejemplo
se satisface, pues en ese
momento, las variables involucradas estan unificadas.

El operador
se utiliza para comparar terminos. Si T1 y
T2 se satisface cuando ambos
T2 son terminos, entonces T1
terminos son literalmente iguales. Por ejemplo:

El primer mecanismo para manipulacion de terminos fue discutido


anteriormente. Se trata del smbolo , el cual permite la unificacion
de dos terminos. Ademas de e ste, tenemos:

P ROLOG provee de una variedad de mecanismos para examinar y


manipular terminos. Como se aprecio en el captulo anterior, las estructuras construdas con functores permiten representar datos compuestos. Por lo cual la manipulacion de terminos resulta muy importante.

El operador
es la negacion del operador anterior. Si T1 y
T2 son terminos, entonces T1
T2 se satisface cuando ambos
terminos son literalmente diferentes.

Manipulacion de Terminos

2.3

97

El predicado
es verdadero si su argumento no contiene variables no unificadas.

99

El predicado
es verdadero si su argumento es un termino
no numerico de aridad cero.

100

Ademas,
se satisface si su segundo y tercer argumentos estan instanciados al nombre y aridad del primer argumento. Por ejemplo:

El predicado
se satisface si su argumento esta instanciado como un termino compuesto, es decir, de aridad mayor
que 0. Por ejemplo:

Los predicados
son verdaderos si los argumentos que reciben son de los tipos correspondientes.

El predicado
se satisface si su primer argumento esta
instanciado con un termino compuesto, el segundo argumento es
el nombre del functor asociado al termino y el tercer argumento
es la aridad del termino. Por ejemplo:

recibe un numero entero , un termino , ambos instanciados, y retorna verdadero si su tercer argumento corresponde
al -esimo argumento de . Por ejemplo:

101

Este predicado tambien se puede usar para construir un termino


compuesto a partir de una lista. Por ejemplo:

Este predicado se puede usar con notacion infija. Por ejemplo,


para
en el caso anterior podramos haber escrito
obtener el mismo resultado.

El predicado
permite descomponer un functor en sus componentes. Si el primer argumento esta instanciado como un
termino atomico (no numerico) o compuesto, entonces el predicado sera verdadero si el segundo argumento unifica con la
descomposicion del termino en una lista. Por ejemplo:

102

El predicado
se satisface cuando recibe un a tomo y un
string como argumentos y el nombre del a tomo corresponde con
el string. Por ejemplo:

De este modo, estos predicados podran ser analizados o modificados


en forma dinamica.

Si se desea que un programa analice o modifique un predicado estatico,


se debe cambiar su estatus en forma explcita. En S ICSTUS, esto se
.
hace con el predicado

Los predicados que hayan sido definidos durante la ejecucion de un


programa son dinamicos.

Los predicados estaticos estan definidos mediante clausulas que han


sido incorporadas a traves de un comando de tipo
.

En las versiones modernas de P ROLOG se distingue a los predicados


utilizados en los programas como estaticos o dinamicos.

Por ejemplo, si quisieramos que los predicados


y
fuesen dinamicos, tendramos que declarar esto, dentro del archivo
que defina este predicado, de la siguiente forma:

Modificar, eliminar o agregar reglas al programa.

104

Almacenar y modificar estructuras de datos durante la ejecucion


del programa.

Al ejecutar un programa, P ROLOG mantiene una base de datos con


todas las reglas almacenadas. Esta base de datos es accesible y puede
ser utilizada por el programador con el fin de:

2.4.1 Predicados estaticos y dinamicos

Modificacion del Programa

2.4

103

Para consultar por la existencia de una clausula asociada a un predi. Por ejemplo:
cado determinado, se utiliza el predicado

2.4.2 Consultas y modificaciones a la base de datos

105

, reciben una clausula co-

Por ejemplo:

El primero, inserta la clausula en la base de datos antes que cualquier


otra clausula asociada al predicado mencionado en su cabeza; el segundo predicado inserta la clausula despues de todas las clausulas
asociadas al predicado en cuestion.

Los predicados
mo argumento.

Para modificar el contenido de la base de datos de P ROLOG se utilizan los predicados


y
.

106

108

Por ejemplo:

El predicado
recibe una clausula como argumento y elimina la primera clausula del programa que unifique con e sta.

Notese los parentesis extra al incluir una clausula de la forma


.

107

Si se intenta resatisfacer el predicado


, P ROLOG continuara retractando clausulas que unifiquen con el argumento de

recibe como argumento un literal. Al


El predicado
invocarse, todas las clausulas cuya cabeza unifiquen con este argumento seran retractadas.

Todas las Soluciones

Para este tipo de situaciones, P ROLOG provee de tres predicados


y
, todos ellos reciben como argumentos un literal, un objetivo y una lista de terminos.

Por ejemplo, en el programa de los misioneros y canbales, podramos


querer encontrar una lista con todas las acciones que se pueden ejecutar en un determinado estado.

Estos predicados encuentran todas las soluciones para el objetivo dado. Por ejemplo:

110

Las diferencias entre los tres predicados es que


se satisface
con
como tercer argumento en caso de que el objetivo falle. Los
otros dos predicados fallan cuando esto ocurre. Ademas
se
satisface cuando la lista contiene las posibles soluciones en el orden
en que estas se encuentren (con repeticiones, si las hay). En el caso
, el tercer argumento unifica con una lista con todas las
de
soluciones en orden, sin repeticiones. Finalmente, la diferencia mas
las variables que aparezcan en el
importante es que con
objetivo, que no aparezcan en el primer argumento, se tratan como
cuantificadas existencialmente. Por ejemplo, suponga que tenemos
los siguientes hechos:

Es comun que uno quiera encontrar todas las soluciones para una
determinada consulta.

2.5

109

111

El objetivo
se debe interpretar como:
encontrar todas las soluciones para , tal que existe un tal que
es verdadero. As observaremos:

Por otra parte, tanto


como
son tales que las variables
que aparecen en el objetivo, pero no en el literal, son unificadas una
debe leerse
sola vez. As, el objetivo
como: encontrar todas las soluciones para tales que ellas comparten un para el cual
se satisface.

De modo que observaremos el siguiente comportamiento:

112

Estructuras de Datos

Un ejemplo es el a rbol de la figura 4.1.

La propiedad basica de un a rbol binario de busqueda es que la informacion asociada al nodo raz es mayor o igual que la informacion
almacenada en los nodos del sub-arbol izquierdo y menor que la informacion almacenada en los nodos del sub-arbol derecho.

y que definen
En P ROLOG, existen los predicados
una relacion de orden entre terminos del lenguaje (este orden coincide con el orden numerico para terminos numericos y con el orden
alfabetico para a tomos no numericos).

Un a rbol binario de uso comun es un a rbol binario de busqueda. Estos a rboles se pueden definir cuando existe una relacion de orden
total para los datos que se almacenan en los nodos.

Figura 2.1: Arbol de Binario

Susana

Pedro

Juan

Andres

Rodrigo

Luis

Julian

Ana

Roberto

Jaime

Laura

Por ejemplo, el a rbol de la figura 4.1 es un a rbol binario. El smbolo


lo usamos para denotar un nodo vaco.

se usa para denotar al a rbol vaco.

Donde el a tomo

Cada hijo puede ser vaco, o bien puede ser otro a rbol binario.

114

Para especificar, en P ROLOG, que cosa es un a rbol, definimos el predicado


de la siguiente forma:

Un a rbol binario es un nodo, que almacena informacion, junto con


dos hijos.

Por ejemplo, considere el tipo de dato abstracto a rbol binario.

Para definir un a rbol binario en P ROLOG, usaremos el functor


tal que el primer argumento es la informacion asociada al nodo, y el
segundo y tercer argumentos son sus hijos izquierdo y derecho respectivamente.

En P ROLOG los terminos del lenguaje se utilizan para formar estructuras de datos complejas.

2.6.1 Representacion de Arboles

2.6

113

2
Cuando P ROLOG presenta una unificacion, no la presenta formateada. El formato fue agregado para mejorar la
legibilidad del resultado.

116

De este modo, observaremos el siguiente comportamiento2 :

As, insertar se puede definir como:

El a rbol resultado debe unificar con el a rbol inicial al cual se le ha


insertado el termino.

Para definir la operacion basica de insercion de terminos a un a rbol


binario de busqueda utilizamos el predicado
, el cual
recibe un a rbol inicial, un termino y un a rbol resultado.

115

La ventaja de esta representacion es que tenemos acceso a la cola


de la lista. De este modo, si queremos escribir un predicado para
agregar un elemento a la lista, podremos escribir:

118

Al observar este procedimiento, notamos que la insercion al final


se hace en un paso. Utilizando la notacion tradicional para listas, en
cambio, resulta en un procedimiento cuya ejecucion toma un numero
de pasos proporcional al tamano de la lista.

Para denotar una de estas listas, usaremos el operador infijo , de


modo que el termino
, donde es una variable
y .
no unificada denotara la lista con elementos

Obtenemos el siguiente comportamiento:

Un ejemplo estandar es una definicion alternativa de listas. En este


caso, la lista vaca se representa como una variable no instanciada.
As, la lista con elementos
y se representara como
, donde es una variable no instanciada.

Una caracterstica interesante de P ROLOG es que los terminos pueden contener variables, las cuales pueden no estar unificadas.

2.6.2 Estructuras de Datos Incompletas

117

119

Del mismo modo, es posible redefinir el procedimiento para juntar


dos listas. Esto lo haremos con el procedimiento
que juega el rol que
juega para listas tradicionales:

Claramente, desde un punto de vista logico, el termino que resultare


no sera legtimo.

Es interesante notar que las variables de P ROLOG pueden utilizarse,


en la definicion de estructuras de datos, del mismo modo que los
punteros se usan en lenguajes de programacion imperativos. Hay
que tener en mente que si estas estructuras presentan circularidades,
entonces el resultado de la unificacion podra no ser imprimible en
forma finita.

As, resulta:

S-ar putea să vă placă și