PDF de programación - Tutorial básico de programación en Prolog

Imágen de pdf Tutorial básico de programación en Prolog

Tutorial básico de programación en Prologgráfica de visualizaciones

Publicado el 20 de Julio del 2018
202 visualizaciones desde el 20 de Julio del 2018
437,2 KB
30 paginas
Creado hace 13a (06/09/2006)
Tutorial básico de programación en Prolog

Elementos del lenguaje

En esta sección explicaremos como reconocer los diferentes elementos que componen un
programa fuente en Prolog. Como observará en breve, Prolog carece de declaraciones en el
sentido imperativo: secciones, declaraciones de tipo, declaraciones de variable, declaraciones de
procedimientos, etc.
Después de leer está sección deber ser capaz de distinguir variables y términos lógicos entre la
"maraña" de caracteres que hay en un programa fuente.

Comentarios

Los comentarios en Prolog se escriben comenzando la línea con un símbolo de porcentaje.
Ejemplo:
% Hola, esto es un comentario.
% Y esto también.

Variables lógicas

Las variables en Prolog no son variables en el sentido habitual, por eso las llamamos variables
lógicas. Se escriben como una secuencia de caracteres alfabéticos comenzando siempre por
mayúscula o subrayado. Ejemplos de variables:
Variable
_Hola
_

Pero no son variables:
variable
$Hola
p__

El hecho de que los nombres de variables comiencen por mayúscula (o subrayado) evita la
necesidad de declarar previamente y de manera explícita las variables, tal y como ocurre en otros
lenguajes.

La variable anónima

Sí, sí, existen variables sin nombre, y todas ellas se representan mediante el símbolo de
subrayado _. Pero cuidado, aunque todas las variables anónimas se escriben igual, son todas
distintas. Es decir, mientras que dos apariciones de la secuencia de caracteres Hola se refieren a
la misma variable, dos apariciones de la secuencia _ se refieren a variables distintas.

Términos

Los términos son el único elemento del lenguaje, es decir, los datos son términos, el código son
términos, incluso el propio programa es un término. No obstante, es habitual, llamar término
solamente a los datos que maneja un programa.

Un término se compone de un functor seguido de cero a N argumentos entre paréntesis y
separados por comas. Los números enteros o decimales sin restricciones de tamaño también son
términos.
Un functor (también denominado átomo) puede ser:

• Una sucesión de caracteres alfanuméricos comenzando por una letra minúscula.
• Un símbolo de puntuación o secuencia de estos. Las secuencias permitidas varían de un

entorno de desarrollo a otro.

• Una sucesión cualquiera de caracteres encerrada entre comillas simples.

Veamos algunos ejemplos de functores:
functor
f384p12
'esto es un único functor, eh!!'
'_functor'
$
+

No son functores válidos:
_functor
Functor

Los argumentos de un término pueden ser:

• otro término.
• una variable lógica.

La mejor forma de aprender a escribir términos es mirando algunos ejemplos:
termino_cero_ario
1237878837385345.187823787872344434
t(1)
'mi functor'(17,hola,'otro termino')
f(Variable)
muchos_argumentos(_,_,_,Variable,232,f,g,a)
terminos_anidados(f(g), h(i,j(7)), p(a(b)), j(1,3,2,_))
+(3,4)
$(a,b)
@(12)


Operadores

Algunos functores pueden estar declarados como operadores, bien de manera predefinida, o bien
por el programador. Los operadores simplemente sirven para escribir términos unarios o binarios
de una manera más cómoda. Por ejemplo, un functor definido como operador infijo es la suma

(+). Así, la expresión a+b es perfectamente válida, aunque en realidad no es más que el término
+(a,b).
Los operadores binarios infijos nos permiten escribir el functor entre los dos argumentos y eliminar
los paréntesis.
Los operadores tienen asociada una prioridad. Por ejemplo, la expresión a+b*c es en realidad el
término +(a,*(b,c)). Esto es así porque el operador producto (*) tiene más prioridad que el
operador suma (+). Si no fuese así, se trataría del término *(+(a,b),c).
Los operadores también pueden ser unarios y prefijos, lo que nos evita escribir los paréntesis del
argumento. Por ejemplo, la expresión -5 es en realidad el término -(5).

Dando valor a las variables

El mecanismo de unificación

La unificación es el mecanismo mediante el cuál las variables lógicas toman valor en Prolog. El
valor que puede tomar una variable consiste en cualquier término, por ejemplo, j(3), 23.2, 'hola
que tal', etc. Por eso decimos que los datos que maneja Prolog son términos.

Cuando una variable no tiene valor se dice que está libre. Pero una vez que se le asigna valor,
éste ya no cambia, por eso se dice que la variable está ligada.
Se dice que dos términos unifican cuando existe una posible ligadura (asignación de valor) de las
variables tal que ambos términos son idénticos sustituyendo las variables por dichos valores. Por
ejemplo: a(X,3) y a(4,Z) unifican dando valores a las variables: X vale 4, Z vale 3. Obsérvese que
las variables de ambos términos entran en juego.
Por otra parte, no todas las variables están obligadas a quedar ligadas. Por ejemplo: h(X) y h(Y)
unifican aunque las variables X e Y no quedan ligadas. No obstante , ambas variables
permanecen unificadas entre sí. Si posteriormente ligamos X al valor j(3) (por ejemplo), entonces
automáticamente la variable Y tomará ese mismo valor. Lo que esta ocurriendo es que, al unificar
los términos dados, se impone la restricción de que X e Y deben tomar el mismo valor aunque en
ese preciso instante no se conozca dicho valor.
La unificación no debe confundirse con la asignación de los lenguajes imperativos puesto que
representa la igualdad lógica. Muchas veces unificamos variables con términos directamente y de
manera explícita (ya veremos como se hace esto), por ejemplo, X y 355. Esto provoca la
sensación de que estamos asignando valores a las variables al estilo imperativo.
Para saber si dos términos unifican podemos aplicar las siguientes normas:

• Una variable siempre unifica con un término, quedando ésta ligada a dicho término.
• Dos variables siempre unifican entre sí, además, cuando una de ellas se liga a un término,

todas las que unifican se ligan a dicho término.

• Para que dos términos unifiquen, deben tener el mismo functor y la misma aridad. Después

se comprueba que los argumentos unifican uno a uno manteniendo las ligaduras que se
produzcan en cada uno.

• Si dos términos no unifican, ninguna variable queda ligada.

Ejemplos paradigmáticos

• Una misma variable puede aparecer varias veces en los términos a unificar. Ejemplo:

k(Z,Z) y k(4,H). Por culpa del primer argumento, Z se liga al valor 4. Por culpa del segundo
argumento, Z y H unifican, pero como Z se liga a un valor, entonces H se liga a ese mismo
valor, que es 4.

• Recuerde que una variable no puede ligarse a dos valores distintos. Por ejemplo: k(Z,Z) y

k(4,3) no unifican, sin embargo k(Z,Z) y k(5,5) sí unifican.

• ¿ Sería capaz de decir a que valores se ligan las variables de este ejemplo ? a(b(j,K),c(X))

y a(b(W,c(X)),c(W)). Puede estar seguro de que unifican.

• Cuidado con las variables anónimas, recuerde que son todas distintas. Por ejemplo: k(_,_)

y k(3,4) unifican perfectamente.

Ejecutando cosas

Predicados y Objetivos

Los predicados son los elementos ejecutables en Prolog. En muchos sentidos se asemejan a los
procedimientos o funciones típicos de los lenguajes imperativos.
Una llamada concreta a un predicado, con unos argumentos concretos, se denomina objetivo (en
inglés, goal). Todos los objetivos tiene un resultado de éxito o fallo tras su ejecución indicando si
el predicado es cierto para los argumentos dados, o por el contrario, es falso.
Cuando un objetivo tiene éxito las variables libres que aparecen en los argumentos pueden
quedar ligadas. Estos son los valores que hacen cierto el predicado. Si el predicado falla, no
ocurren ligaduras en las variables libres.

Ejemplos

El caso básico es aquél que no contiene variables: son_hermanos('Juan','Maria'). Este objetivo
solamente puede tener una solución (verdadero o falso).
Si utilizamos una variable libre: son_hermanos('Juan',X), es posible que existan varios valores
para dicha variable que hacen cierto el objetivo. Por ejemplo para X = 'Maria', y para X = 'Luis'.
También es posible tener varias variables libres: son_hermanos(Y,Z). En este caso obtenemos
todas las combinaciones de ligaduras para las variables que hacen cierto el objetivo. Por ejemplo,
X = 'Juan' y Z = 'Maria' es una solución. X = 'Juan' y Z = 'Luis' es otra solución.

Secuencias de objetivos

Hasta ahora hemos visto como ejecutar objetivos simples, pero esto no resulta demasiado útil.
En Prolog los objetivos se pueden combinar mediante conectivas propias de la lógica de primer
orden: la conjunción, la disyunción y la negación.
La disyunción se utiliza bien poco y la negación requiere todo un capítulo para ser explicada. En
cambió la conjunción es la manera habitual de ejecutar secuencias de objetivos.
El operador de conjunción es la coma, por ejemplo: edad(luis,Y),edad(juan,Z),X>Z. Parece
sencillo, pero hay que tener en cuenta qué ocurre con las ligaduras de las variables:

• En primer lugar, hay que ser consciente de que los objetivos se ejecutan secuencialmente

por orden de escritura (es decir, de izquierda a derecha).

• Si un objetivo falla, los siguientes objetivos ya no se ejecutan. Además la conjunción, en

total, falla.

• Si un objetivo tiene éxito, algunas o todas sus variables quedan ligadas, y por tanto, dejan

de ser variables libres para el resto de objetivos en la secuencia.

• Si todos los objetivos tienen éxito, la conjunción tiene éxito y mantiene las ligaduras de los

objetivos que la componen.

Supongamos que la edad de Luis es 32 años, y la edad de Juan es 25:

• La ejecución del primer objetivo tiene éxito y liga la variable "Y", que antes estaba libre, al

valor 32.

• Llega el momento de ejecutar el segundo objetivo. Su variable "Z" también estaba libre,

pero el objetivo
  • Links de descarga
http://lwp-l.com/pdf12643

Comentarios de: Tutorial básico de programación en Prolog (0)


No hay comentarios
 

Comentar...

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios
Es necesario revisar y aceptar las políticas de privacidad