Está en la página 1de 15

UNIVERSIDAD NACIONAL DE SAN ANTONIO ABAD DEL CUSCO

ESCUELA PROFESIONAL DE INGENIERA INFORMTICA Y DE SISTEMAS

ASIGNATURA: INTELIGENCIA ARTIFICIAL


SEMESTRE ACADMICO: 2017-1

LECTURA 1: INTRODUCCIN A
PROLOG
Seoritas y Seores Estudiantes. La presente lectura tendr su
control en el primer examen parcial de salida, tres interrogantes
se plantearan en la prueba escrita

Cusco Per

Mayo 2017
Una introduccin a Prolog
Habitualmente, programar un
ordenador significa dar una sucesin de
tareas que, al ejecutarlas paso a paso,
permiten resolver un problema concreto.
Sin embargo, el proceso que se sigue en
la programacin lgica es
completamente distinto: un programa en
un lenguaje de programacin lgica est
formado por un conjunto de hechos, junto
con un conjunto de condiciones que debe
verificar la solucin... el ordenador,
usando un motor de inferencia, debe
"deducir" la solucin a partir de los hechos
y las condiciones dadas.
Prolog (del francs, PROgrammation
en LOGique) fue el primer lenguaje de
programacin basado en el paradigma de la programacin lgica. Se implement por
primera vez a principios de los aos setenta en la Universidad de Marsella (Francia), por
un equipo dirigido por A. Colmeraeur y utilizando resultados de R.
Kowalski (Universidad de Edimburgo). Aunque con ciertas dificultades iniciales, debido
principalmente a la novedad del paradigma y a la escasa eficiencia de las
implementaciones disponibles, el lenguaje se fue expandiendo rpidamente, sobre todo
en Europa y en Japn (en este ltimo pas la programacin lgica se incluy como parte
central del proyecto de ordenadores de quinta generacin de los aos ochenta) y en 1995
se normaliza con el correspondiente estndar ISO.

Teniendo en cuenta que es un lenguaje de programacin que se utiliza para resolver


problemas en los que existen objetos y relaciones entre objetos, la programacin en
Prolog consiste simplemente en:
declarar hechos sobre los objetos y sus relaciones,
definir reglas sobre dichos objetos y relaciones, y
hacer preguntas.

Uno de los posibles usos de Prolog es como lenguaje de programacin interactivo, lo


que quiere decir que el ordenador y el programador sostienen una especie de
conversacin donde Prolog espera que se le introduzcan los hechos y reglas que definen el
problema que se quiere resolver y, a continuacin, si se hacen las preguntas adecuadas,
buscar las respuestas y las presentar por pantalla.

Pese a la impresin inicial de tener capacidades limitadas, Prolog es un lenguaje muy


versatil que puede implementar cualquier tipo de algoritmo, no nicamente aquellos para
los que fue diseado, por lo que no es menos potente que lenguajes como C++, Java o
Haskell, y en algunos aspectos podra considerarse ms potente. La eleccin de un
lenguaje u otro depende, como siempre, del tipo de problema que se quiere resolver y del
objetivo que se tenga al resolverlo.

Antes de comenzar a programar en Prolog se ha de tener en cuenta una importante


consideracin: es, con mucha probabilidad, radicalmente distinto a cualquier otro
lenguaje de programacin con el que hayamos trabajado; en consecuencia, cuando se
quiere resolver un problema con l, no debe intentar resolverse previamente en otro
lenguaje con el fin de traducirlo luego a Prolog (algo que es relativamente fcil y comn
entre otros lenguajes)... aqu no hay que buscar un algoritmo que resuelva el problema,
basta proporcionar las bases lgicas suficientes para que el motor de inferencia de Prolog
lo resuelva por nosotros... pero hay de reconocer bien qu informacin bsica va a
permitir que Prolog realice su tarea (cuando se entra en ms profundidad en Prolog, se
descubre que tambin puede influir el orden en que se proporciona esa informacin, pero
ese aspecto no lo debatiremos aqu).

Los elementos de un programa en Prolog

Los hechos

Un hecho es un predicado (relacin) entre objetos. Su sintaxis en Prolog es relacion


(objeto, objeto, ...). Ha de tenerse en cuenta lo siguiente:
Los nombres de las relaciones deben comenzar con una letra minscula.
Los objetos se escriben separados por comas y encerrados entre parntesis.
Al final del hecho debe ir un punto.

Por ejemplo, un hecho es:

edad(juan,27).

Las reglas
Las reglas funcionan como las frmulas condicionales habituales en lgica. Reflejan
que la verdad de un hecho depende de la verdad de otro hecho o grupo de hechos. Consta
de una cabeza y un cuerpo, donde este ltimo puede estar formado por varios hechos
(tambin llamados objetivos). Su sintaxis general es:

cabeza :- objetivo 1, objetivo 2, ..., objetivo n.

Formalmente, desde un punto de vista lgico, se interpretara de la siguiente forma:


objetivo1objetivoncabezaobjetivo1objetivoncabeza

Los objetivos van separados por comas (que representan conjunciones) y al final debe
ir un punto. Por ejemplo:

mayor_de_edad(X) :- edad(X,E), E>18.

Las variables

Los nombres de las variables deben comenzar con letra mayscula o con el
carcter (_). Existe una variable especial, la variable annima o blanca, que se utiliza de
la misma manera que las dems variables pero nunca toma ningn valor.

La estructura de un programa en Prolog

La mayora de los programas Prolog estn organizados en cuatro secciones


principales:
dominio: donde se declaran los argumentos que utilizarn los predicados.
predicados: donde se declaran todos los predicados no predefinidos que se utilizarn
en las siguientes secciones.
objetivos: esta seccin permite ejecutar los programas de forma no interactiva, y por
tanto, buscar la solucin deseada tan pronto como se ejecute el programa. Como
tambin es habitual usar Prolog de forma interactiva es frecuente ejecutar un
programa y luego esperar a que se nos pregunte por los objetivos.
clausulas: donde se escriben los hechos y las reglas que conocemos del dominio.

Un ejemplo de Lgica Proposicional

Vamos a comenzar dando un ejemplo que ya hemos analizado en las clases de teora
para resolverlo por medio de un programa en Prolog.
Ejemplo Disponemos de una base de conocimiento compuesta por reglas sobre
clasificacin de animales y hechos sobre caractersticas de un cierto animal tal y como
muestra la siguiente lista:
Regla 1: Si un animal es ungulado y tiene rayas negras, entonces es una cebra.
Regla 2: Si un animal rumia y es mamfero, entonces es ungulado.
Regla 3: Si un animal es mamfero y tiene pezuas, entonces es ungulado.
Hecho 1: El animal es mamfero.
Hecho 2: El animal tiene pezuas.
Hecho 3: El animal tiene rayas negras.

Nuestro objetivo es demostrar, a partir de esta base de conocimientos, que el animal


es una cebra.

Para representar una regla, debemos elegir previamente los smbolos para los tomos
que aparecen en la regla:
Para la regla 1, podemos elegir los
smbolos es_ungulado, tiene_rayas_negras y es_cebra. La regla 1 puede
representarse como: Si es_ungulado y tiene_rayas_negras entonces
es_cebra. Usando las conectivas lgicas la expresin anterior se escribe mediante la
frmula:
es_unguladotiene_rayas_negrases_cebraes_unguladotiene_rayas_negrases_cebra

La frmula anterior se representa en Prolog mediante la clusula:

es_cebra :- es_ungulado, tiene_rayas_negras.

Como se puede observar, la transformacin ha consistido en invertir el sentido de la


escritura y sustituir las conectivas por :- (condicional inversa) y , (conjuncin).

Para representar los hechos basta elegir los smbolos de los tomos. Por ejemplo, el
hecho 2 se representa en Prolog por:

tiene_rayas_negras.

Los hechos pueden verse como reglas con el cuerpo vaco.


Para representar la base de conocimiento en Prolog, se escribe en un fichero (por
ejemplo, animales.pl) cada una de las reglas y los hechos:
:- set_prolog_flag(unknown,fail). % Para que SWI-Prolog

admita predicados no definidos

es_cebra :- es_ungulado, tiene_rayas_negras. % Regla 1

es_ungulado :- rumia, es_mamfero. % Regla 2

es_ungulado :- es_mamfero, tiene_pezuas. % Regla 3

es_mamfero. % Hecho 1

tiene_pezuas. % Hecho 2

tiene_rayas_negras. % Hecho 3

(Nota: lo que sigue al smbolo % se considera un comentario y no es procesado por


Prolog).
Importante: SWI-Prolog no adimte predicados no definidos previamente. Para
solventar este problema hemos de indicar a SWI-Prolog que admita este tipo de
predicados poniendo en la primera lnea de nuestro fichero la siguiente directiva:

:- set_prolog_flag(unknown,fail).

Una vez en Prolog, podemos cargar el fichero anterior e intentar ver si se puede
deducir el resultado que buscbamos. Una sesin interactiva que hiciera esto en SWI-
Prolog podra ser de la siguiente forma (el smbolo ?- es el prompt y lo que viene a
continuacin en su misma lnea lo introduce el usuario; la respuesta de Prolog se muestra
en la linea, o lneas, siguientes a la interaccin del usuario):

% library(win_menu) compiled into win_menu 0.00 sec, 29 clauses

Welcome to SWI-Prolog (Multi-threaded, 32 bits, Version 6.2.6)

Copyright (c) 1990-2012 University of Amsterdam, VU Amsterdam

SWI-Prolog comes with ABSOLUTELY NO WARRANTY. This is free software,

and you are welcome to redistribute it under certain conditions.

Please visit http://www.swi-prolog.org for details.

For help, use ?- help(Topic). or ?- apropos(Word).

?- [animales].

Yes

?- es_cebra.
Yes

Nota: Observa cmo se cargan ficheros en Prolog...


La respuesta Yes indica que el sistema ha encontrado una prueba de es_cebra a
partir de la base de conocimientos cargada en el fichero. El rbol de deduccin que sigue
Prolog es una bsqueda en profundidad que puede ser representado por la siguiente
figura:

En este rbol, cada estado es una pila de problemas por resolver. El estado inicial
consta de un nico problema (es_cebra). A partir de este estado buscamos en la base de
conocimientos una regla cuya cabeza coincida con el primer problema de la pila (en
nuestro caso, esta bsqueda da como resultado la regla 1). Sustituimos el problema por el
cuerpo de la regla. dando lugar a la pila de problemas es_ungulado,
tiene_rayas_negras. Para el primer problema (es_ungulado) tenemos dos reglas
cuyas cabezas coinciden (las reglas 2 y 3). Consideramos en primer lugar la regla 2,
produciendo la pila de problemas rumia, es_mamfero, tiene_rayas_negras, que
no coincide con la cabeza de ninguna regla, por lo que se produce un fallo y se considera
la otra eleccin, la regla 3, que genera la pila de problemas es_mamfero,
tiene_pezuas, tiene_rayas_negras. Cada uno de los problemas restantes coincide
con uno de los hechos (reglas sin cuerpo), por lo que obtenemos una solucin al problema
inicial.

La siguiente figura muestra una representacin del proceso que se sigue en la rama
exitosa del rbol anterior:

Ejemplos en Lgica de Primer Orden

Primer ejemplo

Para mostrar un ejemplo que contiene elementos de un lenguaje de primer orden


vamos a trabajar sobre la siguiente base de conocimientos:
Hechos:
1. Atlanta se encuentra en Georgia.
2. Houston y Austin se encuentran en Texas.
3. Toronto se encuentra en Ontario.
Que, usando el predicado located_in, podemos representar con las siguientes
clausulas:

located_in(atlanta,georgia). % Clause 1

located_in(houston,texas). % Clause 2
located_in(austin,texas). % Clause 3

located_in(toronto,ontario). % Clause 4

Reglas:
1. Lo que est en Georgia o Texas, tambin est en USA.
2. Lo que est en Ontario, tambin est en Canad.
3. Lo que est en USA o Canad, tambin est en Norte Amrica.
Que podemos representar con las siguientes clausulas (geo.pl):

located_in(X,usa) :- located_in(X,georgia). % Clause 5

located_in(X,usa) :- located_in(X,texas). % Clause 6

located_in(X,canada) :- located_in(X,ontario). % Clause 7

located_in(X,north_america) :- located_in(X,usa). % Clause 8

located_in(X,north_america) :- located_in(X,canada).%Clause 9

Observa que al estar trabajando con predicados que s reciben argumentos ya no es


necesario usar la directiva vista en el ejemplo anterior.

Vamos a ver cul es el rbol de deduccin que sigue Prolog para resolver la siguiente
clausula:

located_in(toronto,north_america).

A continuacin mostramos el proceso seguido por el motor de deduccin para llegar al


resultado final (afirmativo).
Segundo ejemplo

Para mostrar un segundo ejemplo que contiene elementos de un lenguaje de primer


orden vamos a trabajar sobre la siguiente base de conocimientos:
Hechos:
6 y 12 son divisibles por 2 y por 3.
4 es divisible por 2.
Regla: Los nmeros divisibles por 2 y por 3 son divisibles por 6.
Para representar esta base de conocimientos en Prolog usaremos las constantes 2, 3, 6
y 12 y el predicado binario divide(X,Y) que se verifica si X divide a Y. Los hechos se
representarn entonces por medio de 5 clusulas unitarias. La regla se puede expresar
como:
X[divide(2,X)divide(3,X)divide(6,X)]X[divide(2,X)divide(3,X)divide(6,X)]

y su representacin Prolog es

divide(6,X) :- divide(2,X), divide(3,X).


que hace uso de la variable X y que se considera universalmente cuantificada de
manera implcita. La representacin en Prolog de la base de conocimientos completa
sera:

divide(2,6). % Hecho 1

divide(2,4). % Hecho 2

divide(2,12). % Hecho 3

divide(3,6). % Hecho 4

divide(3,12). % Hecho 5

divide(6,X) :- divide(2,X), divide(3,X). % Regla 1

Usando la base de conocimientos anterior (Divide.pl)podemos determinar los


nmeros divisibles por 6 de la siguiente forma:

?- divide(6,X).

X = 6 ;

X = 12 ;

false.

La forma de interactuar con Prolog para obtener el resultado anterior es como sigue:
despus de obtener la primera respuesta se pide la bsqueda de otra solucin pulsando
punto y coma (;). Si en este proceso se obtiene como respuesta false significa que no hay
ms respuestas.
El rbol de deduccin correspondiente a la sesin anterior se muestra en la siguiente
figura, donde se observa que el rbol tiene dos ramas de xito y una de fallo. Adems, el
paso entre objetivos se ha ampliado: no se exige que el primer objetivo sea igual que la
cabeza de una regla, sino que sea unificable (es decir, que exista una sustitucin que los
haga iguales); por ejemplo, en el segundo paso el objetivo divide(2,X) se unifica con el
hecho divide(2,6) mediante la sustitucin de X por 6 (representada por {X/6}).
Componiendo las sustituciones usadas en una rama de xito se obtiene la respuesta.
Tercer ejemplo

Vamos a poner a continuacin un ejemplo algo ms elaborado en el que se utiliza un


lenguaje de primer orden que tiene smbolos de funcin. Este ejemplo nos permitir
presentar tambin un primer ejemplo de definicin recursiva. Sobre l haremos diversas
preguntas y analizaremos cmo Prolog consigue dar las soluciones.
Los nmeros naturales se pueden representar mediante una constante 0 (que
representa el cero) y un smbolo de funcin unitaria s (que representa la funcin
sucesora). De esta forma, 0, s(0), s(s(0)),... representan los nmeros
naturales 0,1,2,...
Vamos a definir la relacin suma(X,Y,Z) que se verifica si Z = X + Y. La
definicin, por recursin en el primer argumento, se basa en las identidades:

0 + Y = Y

s(X) + Y = s(X+Y)

que se traduce en las frmulas de primer orden:


Y[suma(0,Y,Y)]Y[suma(0,Y,Y)]

X,Y,Z[suma(X,Y,Z)suma(s(X),Y,s(Z))]X,Y,Z[suma(X,Y,Z)suma(s(X),Y,s(Z))]

y stas en Prolog:
suma(0,Y,Y). % R1

suma(s(X),Y,s(Z)) :- suma(X,Y,Z). % R2

Vamos a ver cmo Prolog responde a diversas cuestiones a partir de esta defnicin. La
primera cuestin es calcular la suma de s(0) y s(s(0)). La forma de plantear esta
pregunta en Prolog, y la respuesta obtenida, sera (suma.pl):

?- suma(s(0),s(s(0)),X).

X = s(s(s(0))).

El rbol de deduccin seguido se muestra en la figura siguiente:

Para evitar conflicto entre las variables se cambian de nombre, aadiendo el


ndice 0 a las del objetivo inicial, y el nivel del nodo en el rbol para el resto de clusulas
del programa. El nodo inicial slo tiene un sucesor con la regla 2, porque es la cabeza de
la nica regla con la que unifica; efectivamente el tomo suma(s(0),s(s(0)),X0) no es
unificable con suma(0,Y1,Y1) porque los primeros argumentos son tomos sin
variables distintos y s es unificable con suma(s(X1),Y1,s(Z1)) mediante la
sustitucin {X1/0, Y1/s(s(0)), X0/s(Z1)} que, aplicada a ambos tomos, da el
tomo suma(s(0),s(s(0)),s(Z1)). Lo mismo sucede con el segundo nodo. Finalmente,
la respuesta se calcula componiendo las sustituciones realizadas en la rama de xito a las
variables iniciales: X se sustituye inicialmente por X0, en el primer paso se
sustituye X0 por s(Z1) y en el segundo se sustituye Z1 por s(s(0)) con lo que el valor
por el que sustituye X es s(s(s(0))).
La segunda cuestin es cmo calcular la resta de s(s(s(0))) y s(s(0)). Para ello no es
necesario hacer un nuevo programa, basta con observar
que X=abX+a=bX=abX+a=b y plantear la pregunta:

?- suma(X,s(s(0)),s(s(s(0)))).

X = s(0) ;

false.

El rbol de deduccin correspondiente se muestra en la figura siguiente:

La tercera cuestin es descomponer el nmero 2 en suma de dos nmeros naturales;


es decir resolver la ecuacin X+Y=2X+Y=2. Tampoco para este problema se necesita un
nuevo programa, basta realizar la siguiente consulta:

?- suma(X,Y,s(s(0))).

X = 0,

Y = s(s(0)) ;

X = s(0), Y = s(0) ;

X = s(s(0)),

Y = 0 ;

false.
Obteniendo las tres soluciones 2=0+2=1+1=2+02=0+2=1+1=2+0. El rbol de
deduccin correspondiente se muestra en la figura siguiente:

Bibliografa y Recursos

Puedes encontrar informacin mucho ms completa en los siguientes enlaces y


recursos:
SWI-Prolog's Home
GNU Prolog's Home
Prolog Programming in Depth , Michael A. Covington, Donald Nute, and Andr
Vellino. Second edition, Prentice-Hall, 1997.
Prolog programming for artificial intelligence , I. Bratko. Pearson, 2001
Prolog WikiBoook
Learn Prolog Now! , curso online.
Prolog Problems
Introduccin a la programacin lgica con Prolog. Publicaciones del Grupo de
Lgica Computacional. Universidad de Sevilla, 2006.
Ejercicios de programacin declarativa con Prolog. Publicaciones del Grupo
de Lgica Computacional. Universidad de Sevilla, 2006.
Curso de Lgica Informtica (Temas 13 y 14). Dpt. Ciencias de la Computacin e
Inteligencia Artificial, Universidad de Sevilla, 2013-2014.

También podría gustarte