You are on page 1of 8

Introduccin

A lo largo de la siguiente prctica encontraremos los tipos de programacin


utilizada en la elaboracin de programas en prolog, se analizan las
caractersticas propias de cada tipo as como una breve explicacin del
significado de programacin lgica y procedural en el ambiente prolog esto con
el fin de comprender en qu consiste cada tipo y lograr implementarlas de
manera correcta en la elaboracin de nuestros programas prolog.

I. La Programacin Lgica vs la Programacin Procedural.


La programacin lgica es aquel tipo de programacin que permite al
software razonar, esto es, hacer razonamientos, por ejemplo, de tipo
deductivo o inductivo. Dada una base de datos consistente en un conjunto
de entidades, propiedades de esas entidades y relaciones de unas
entidades con otras, el sistema es capaz de hacer razonamientos.
Bsicamente, este proceso se expresa de la siguiente forma:

Donde entendemos que hechos es el conjunto de datos que conoce el


sistema a priori(o que va adquiriendo a lo largo de su ejecucin) y reglas
son un conjunto de operaciones que se pueden aplicar a dichos datos para
sacar un resultado lgico. (Inteligencia en redes de comunicacin, n. d.).

Campos de Aplicacin
La programacin lgica encuentra su hbitat natural en aplicaciones de
inteligencia artificial o relacionadas:
Sistemas expertos, donde un sistema de informacin imita las
recomendaciones de un experto sobre algn dominio de
conocimiento.
Demostracin automtica de teoremas, donde un programa genera
nuevos teoremas sobre una teora existente.
Reconocimiento de lenguaje natural, donde un programa es capaz de
comprender (con limitaciones) la informacin contenida en una
expresin lingstica humana. (Programacin lgica, 2016).
Programacin Procedural
Se trata de un estilo de programacin basado en estructurar el cdigo de un
programa en componentes, que reciben el nombre de procedimientos,
subrutinas o funciones.

Caractersticas de los procedimientos


Consisten en una coleccin de computaciones, que tienen un punto de
comienzo (o entrada) y uno de finalizacin (o salida).
Proporcionan una funcionalidad concreta.
Pueden ser ejecutados tantas veces como sea necesario dentro del
programa al que pertenecen.
Se ejecutan mediante un mecanismo que recibe el nombre de llamada a
procedimiento (procedure call ).
Beneficios de la programacin procedural
Comprensibilidad La estructuracin de un programa en procedimientos
proporciona una comprensin ms clara del cdigo al programador, lo
cual facilita las labores de diseo, depuracin y mantenimiento.
Desarrollo modular Los procedimientos facilitan el desarrollo de un
programa en mdulos independientes, permitiendo que personas o
equipos diferentes trabajen en cada mdulo por separado.
Capacidad de reutilizacin El cdigo de los procedimientos puede ser
compilado y almacenado en ficheros de librera. stas pueden ser
reutilizadas en cualquier programa mediante el enlazado. (Programacin
procedural, n. d.).

I.1 Significado lgico de un programa en PROLOG.


Un programa lgico es un conjunto finito de frmulas lgicas, que reflejan el
conocimiento del que se dispone acerca del problema a resolver. Por lo tanto,
un programa en Prolog estar formado por una serie de frmulas lgicas que,
evidentemente, tendrn que adaptarse a la sintaxis especfica del lenguaje.

Los programas Prolog son programas lgicos definidos, y estn por lo tanto
compuestos por una serie de clusulas de Horn positivas, esto es, hechos y
reglas.

Hay que tener en cuenta sin embargo las siguientes diferencias en cuanto a la
notacin empleada en la Programacin Lgica Definida:
Los smbolos de predicado se denotan mediante tomos, por lo que no pueden
empezar, como ocurre en Programacin Lgica, mediante una letra mayscula.
Obsrvese por lo tanto que el lenguaje Prolog no distingue entre smbolos de
predicado, smbolos de funcin y constantes, puesto que todos ellos se
representan mediante tomos (el compilador distingue unos de otros
dependiendo del contexto en el que aparecen).
Para referirse a un predicado nombre_predicado se suele emplear la notacin
nombre_predicado/n, donde n indica el numero de argumentos del predicado.
Los hechos deben terminar con un punto y omitir el smbolo utilizado
en Programacin Lgica. As, el hecho A se escribe en Prolog de la
forma A..
Las reglas deben tambin terminar con un punto y sustituir el smbolo
de la Programacin lgica por el smbolo :-. As, la regla A A1, .
. . , An se escribe en Prolog de la forma A :- A1, . . . , An..
El convenio para describir el uso de un predicado es el siguiente:
nombre_predicado(#NomVar_1, ...., #NomVar_n) donde NomVar_1, ...,
NomVar_n son nombres de variables y el smbolo #, que sirve para
indicar como debe usarse el argumento correspondiente al realizarse
una consulta, puede tomar uno de los tres siguientes valores:
+ para indicar que el argumento correspondiente debe estar, en la consulta,
instanciado con un trmino no variable (este tipo de argumentos se
corresponden por lo tanto con parmetros de entrada).
- para indicar que el argumento correspondiente no debe estar instanciado en
la consulta, es decir, debe ser una variable (este tipo de argumentos se
corresponden por lo tanto con parmetros de salida).
? para indicar que el argumento puede estar tanto instanciado como no
instanciado (es decir, se trata de parmetros que se pueden usar tanto para
entrada como para salida).

I.2 Significado procedural de un programa en PROLOG.


El significado procedural especifica el cmo contesta Prolog a las preguntas.
Responder a una pregunta significa tratar de satisfacer una lista de metas.
Estas pueden satisfacerse si las variables que existen en las metas pueden
instanciarse de tal modo que las metas se sigan lgicamente del programa. As
el significado procedural de Prolog es un procedimiento para ejecutar una lista
de metas con respecto a un programa dado. Ejecutar las metas significa tratar
de satisfacerlas. Llamemos a este procedimiento 'ejecuta':

las entradas y salidas a este procedimiento son :


entrada : un programa y una lista de metas.
salida : un indicador de xito / falla y una instanciacin particular de las
variables.
el significado de las dos salidas es como sigue :
(1). El indicador de xito/falla es 'yes' si las metas son satisfactibles y 'no' si
ocurre lo contrario. Decimos que 'yes' seala una terminacin exitosa y 'no' una
falla.
(2). Una instanciacin de las variables se produce solamente en el caso de una
terminacin exitosa; en el caso de una falla no hay instanciacin.
Ejemplo. En el siguiente ejemplo se hace una traza de la ejecucin para ilustrar
el significado procedural de Prolog :
(a). Programa.
enorme( oso). % clusula 1
enorme( elefante). % clusula 2
chico( gato). % clusula 3
cafe( oso). % clusula 4
negro( gato). % clusula 5
gris( elefante). % clusula 6
oscuro( Z) :- negro( Z). % clausula 7: cualquier negro es
oscuro.
oscuro( Z) :- cafe( Z). % clusula 8 : cualquier caf es
oscuro.
(b). Pregunta. ?- oscuro( X), enorme( X). % Quin es oscuro y enorme ?
(c). Traza de la ejecucin.
(1). Lista inicial de metas : oscuro(X), enorme(X).
(2). Examina el programa de arriba hacia abajo buscando una clusula cuya
cabeza empate con la primera meta : oscuro(X).
Se encuentra la clusula 7 : oscuro( Z) :- negro( Z).
se reemplaza la primera meta con el cuerpo instanciado de la clusula 7, dando
una nueva lista de metas : negro(X), enorme(X).
(3). Examina el programa para encontrar un empatamiento de negro(X).
Se encuentra la clusula 5: negro( gato).
Esta clusula no tiene cuerpo, as que la lista de metas, luego de instanciarse
se convierte en : enorme(gato)
(4). Examina el programa para buscar la meta enorme(gato), no se encuentra
ninguna clusula. Por lo tanto se realiza un proceso de backtracking al paso 3)
y se elimina la instanciacin X = gato. Ahora la lista de metas es de nuevo:
negro(X), enorme(X).
Se contina examinando el programa a partir de la clusula 5. No se encuentra
ninguna clusula. Por lo tanto, se realiza un proceso de backtracking
nuevamente al paso (2) y se contina examinando a partir de la clusula 7.
Se encuentra la clusula 8: oscuro(Z) :- cafe(Z).
Se reemplaza la primera meta en la lista de metas por cafe(X), dando: cafe(X),
enorme(X)
(5). Examina el programa buscando empatar cafe(X), encuentra cafe(oso).
Esta clusula no tiene cuerpo, as que la lista de metas es ahora: enorme(oso)
(6). Examina el programa y encuentra la clusula enorme(oso). Esta clusula
no tiene cuerpo, as que la lista de metas se queda vaca. Esto indica una
terminacin exitosa y la instanciacin correspondiente a la variable queda
como:
X = oso.
(Prolog. n.d.)

I.2.1 cmo programar procedimientos de clculos en PROLOG?

Resolver un problema, es construir adecuadamente la base de conocimientos,


y esta base expresada en lenguaje Prolog junto con el conjunto de metas
especificadas constituirn nuestro programa.
Un programa Prolog probablemente utilizar predicados recursivos, es decir,
nuestro problema se expresa en trminos de s mismo aplicado sobre un
conjunto de datos distintos que tiende a convertirse en el conjunto de datos que
satisface el caso o casos triviales del proceso de recursin.

Cuando sea necesario construir un programa usando tcnicas recursivas


en Prolog, hemos de recordar que los objetivos intentarn satisfacerse
mediante una bsqueda que comienza por los predicados situados en la zona
superior, y para cada uno de ellos el proceso de unificacin se realizar de
izquierda a derecha. Evidentemente, para conseguir un funcionamiento
adecuado en el procedimiento de resolucin hemos de construir la base de
conocimientos adecuadamente, situando primero los casos triviales o
especficos y a continuacin los casos ms generales.

factorial(0,1).
factorial(N, R):- N1 is N-1, factorial(N1, Y), R is N*Y.

Igualmente, si ciertas realidades del mundo que se desea representar, se


pueden expresar mediante una regla de inferencia en lugar de hacerlo con un
conjunto de hechos, elegiremos la primera opcin, de modo que en nuestra
base de conocimientos, tendremos solamente los hechos que son necesarios
para deducir otros que se pueden razonar a travs de reglas.

Por ejemplo, si deseamos construir parte de nuestro rbol genealgico y


establecemos como dominio en el que vamos a trabajar el de las madres y
abuelas, solamente ser necesario definir el predicado madre para representar
hechos del tipo "Ana es madre de Pepa", "Pepa es madre de Luisa", etc. Sin
embargo, el predicado abuela no se implementar como un hecho, aunque
podra hacerse, sino como una regla de inferencia ya que ese suceso ocurrido
en el mundo que estamos representando se puede deducir en funcin del
hecho "ser madre".

A continuacin proponemos un ejemplo de cmo debe modificarse una base de


conocimientos incorrectamente implementada.

madre(pepa, juana).

madre(juana, ana).

madre(ana, beatriz).

abuela(pepa, ana).

abuela(juana, beatriz).

La base de conocimientos est mal construida porque su actualizacin es ms


complicada y, por tanto, tambin su manejo.
La forma correcta de realizar ese programa sera del modo que se propone:

madre(pepa, juana).

madre(juana, ana).

madre(ana, beatriz).

abuela(X,Y):-madre(X,Z), madre(Z,Y).

Como se observa la cantidad de cdigo se reduce ya que para establecer nuevos


hechos del mundo real: "ser madre" o "ser abuela" basta con introducir nuevos
predicados del tipo madre ya que el hecho de "ser abuela" se deduce en funcin de la
regla de inferencia especificada con el predicado abuela. (Bases de Conocimientos
prolog, n. d.).

Conclusiones

Con esta prctica se logr comprender que para lograr crear una base de
conocimientos completa y correcta debern analizarse tanto las relaciones que existen,
as como tambin nuestros hechos de tal manera que si es necesario crear nuevas
relaciones para lograr resolver una pregunta se agreguen, pues de esta manera se
lograr crear una base de conocimientos completa que pueda deducir o resolver
preguntas con la informacin que contenga.

Referencias
Bases de Conocimientos Prolog [en lnea], (n. d.). Bases de Conocimientos
Prolog. [fecha de consulta: 18 de septiembre de 2016]. Disponible en:<
http://www.uhu.es/nieves.pavon/pprogramacion/temario/tema1/tema1.html>
Inteligencia en redes de comunicacin [en lnea], (n. d.). Inteligencia en Redes
de Comunicacin. [fecha de consulta: 18 de septiembre de 2016]. Disponible
en:<
http://www.it.uc3m.es/jvillena/irc/practicas/estudios/Lenguajes_Logicos.pdf>
Programacin lgica [en lnea], (2106). Programacin lgica. [fecha de
consulta: 18 de septiembre de 2016]. Disponible en:<
https://es.wikipedia.org/wiki/Programaci%C3%B3n_l%C3%B3gica>
Programacin procedural [en lnea], (n. d.). Programacin procedural. [fecha de
consulta: 18 de septiembre de 2016]. Disponible en:<
http://www.atc.uniovi.es/telematica/2ac/Transparencias/T02-Programacion-
Procedural.pdf>
Prolog[en lnea], (n. d.). Prolog. [fecha de consulta: 18 de septiembre de 2016].
Disponible en:< https://itacateonline.files.wordpress.com/2013/03/prolog.pdf >

You might also like