domingo, 8 de junio de 2014

Programación En Prolog. CAP-1



INTRODUCCIÓN:

En las publicaciones anteriores estuvimos trabajando con conceptos básicos pero necesarios, de la misma forma como conociendo las formas en que debemos trabajar en el área de la Inteligencia artificial, como son métodos de búsqueda heuristica, métodos de sistemas de producción que al final descubrimos que son búsquedas las que se hacen, la solución con espacio de estados, técnicas de búsqueda ciega, son métodos formas de adentrarse al mundo la de Inteligencia Artificial, en esta ocasión veremos de igual forma la programación en Prolog, que es un lenguaje justamente donde aplicamos muchas de las reglas antes vistas, pero esta vez mas demostrativa, veremos conceptos básicos, como son hechos, reglas clausulas, que mas adelante las explicaremos mas a detalle.


PROLOG:
Que es Prolog: es un lenguaje de programación que se utiliza para resolver problemas en los que existen objetos y relaciones entre objetos.1

Historia
El lenguaje de programación Prolog se originó del trabajo hecho por Robert A. Kowalski en la
Universidad de Edinburgh y Alain Colmeraur en la Universidad de Aix-Marseille (Francia) en los años 70. ver mas --->2

Vamos a trabajar con Prolog

Para ello vamos a empezar este nuevo lenguaje con su debida instalación:

1.-Instalación de SWI-Prolog en Windows. 

Para descargar ir ala pagina.







Paso 1
La instalación inicia dando click derecho sobre el archivo de w32pl665.exe,  y lo ejecutamos como Administrador el cual instalará  SWI-Prolog en el directorio escogido. Luego de seguir los siguientes pasos:



Paso 2
Se aceptan los términos dando click en I Agree.



Paso 3
Se deja tal y cual como están seleccionados los componentes que deseamos instalar y cliqueamos next


Paso 3
Se escoge la ruta en la cual queremos que se guarde y damos next.


Paso 4
Nos muestra la extensión para los archivos de Prolog que es pl lo dejamos como esta y da click en Install.


Paso 5
Muestra la instalación


Paso 6
Una ves terminada la instalación presionamos en finished.


Nos pregunta si queremos ver el archivo para leer términos le decimos que No o como quieran. 

Este sera el entorno de Prolog donde se trabajara a partir de hoy no nos olvidaremos de esta interfaz.


Para continuar ahora debemos conocer quien es Prolog, como funciona y cada concepto que maneja....

2.-Entendiendo Prolog


Un programa de Prolog se compone de una parte de hechos y una parte de reglas. Cada hecho o regla se termina con un ,  punto( . ).


  • Un hecho es el modelo de los datos o situaciones elementales que se consideran ciertos, estos deben ser verdaderos.
Las reglas se utiliza en prolog para significar que un hecho depende de uno ó mas hechos. Son la representacion de las implicaciones lógicas del tipo p--->q (p implica q).
  • Una regla consiste en una cabeza y un cuerpo, unidos por el signo ":-".
  • La cabeza está por un único hecho.
  • El cuerpo puede ser uno ó mas hechos, separados por comas(","), que actúa como el "y" lógico.
  • Las reglas finalizan con un punto.
Los términos de prolog se clasifican en tres categorías: constantes, variables y términos compuestos.

Constantes se distingue de dos tipos:
  1. Números Este tipo de constantes se utilizan para representar tanto números  enteros como números   reales y poder realizar con ellos operaciones aritméticas
  2.  Átomos. Los  átomos (no confundir con las formulas atómicas de la LPO) se utilizan para dar nombre a objetos especıficos,  es decir, representan individuos concretos.

Variables
Las variables en prolog se representan  mediante cadenas formadas por letras, dígitos y el símbolo de subrayado. Pero debe forzosamente empezar con una letra mayúscula o por un símbolo de subrayado.

Términos Compuestos
Un término se constituye mediante un símbolo de función, seguido de cero a N argumentos entre paréntesis y separados por comas.

                                                        Operadores aritméticos
Prolog tiene predefinidos los operadores aritméticos más habituales, mediante los que se pueden formar expresiones aritméticas. A continuación se enumeran algunos de los más importantes:

X+Y suma de X e Y
X-Y X menos Y
X*Y producto de X por Y
X/Y cociente real de la división de X por Y
X//Y cociente entero de la división de X por Y
X mod Y resto de la división entera de X por Y
abs(X) valor absoluto de X
sqrt(X) raíz cuadrada de X
log(X) logaritmo neperiano de X

Bien aun no lo conocemos bien pero ya tenemos una idea, a continuación se mostraran unos ejemplos de como funciona prolog.

Ejemplo.
El hecho de que tomás es progenitor (padre o madre) de Roberto se puede representar en
Prolog como

             progenitor( tomas, roberto).

'progenitor' es el nombre de una relación, 'tomas' y 'roberto' son sus argumentos.

El siguiente árbol familiar:
Este programa consiste en 6 clausulas.

Paso x.- Primero abre un bloc de notas, escribe lo que a continuación se muestra o en tu caso lo que vayas a declarar.
Paso x-1.-Guarda el archivo editado con la extension ejemplo   xxxxx.pl     (.pl)


Lo descrito anteriormente en prolog, se entiende mejor como cuando realizamos una base de datos que para Prolog es base de conocimiento que ya tiene ¿ok?..
Vamos a preguntarle a Prolog que conocimiento tiene se realiza de la siguiente,  manera

Paso x-2.- Vamos a compilar el programa la parte que aparece numero 1 de la figura 1.2 le decimos que vamosa  compilar .---compile(nombredetuarchivo).   ┘ Enter

Preguntas realizadas y contestadas en Prolog.

A prolog entiende que le preguntamos de quien es el progenitor de patricia ok??
En nuestro lenguaje quedaría como ¿Roberto es progenitor de Patricia?  solo que para preguntarle a prolog lo hacemos  asi:
                     
                            1 ?- progenitor(roberto,patricia).  ┘ Enter

La respuesta de Prolog es true o false..

Algo así.------>
figura 1.2

Vamos a ir desarrollando mas conocimientos de Prolog.

1.2. Conjunciones de cláusulas.

Ahora queremos preguntar ¿quién es el abuelo de jaime?
El programa no incluye la relación 'abuelo', sin embargo podemos hacer la pregunta en
dos pasos:
1). Quién es el progenitor de jaime, asumimos que es algún Y.
2). Quién es el progenitor de este Y, asumimos que es algún X.

Esta pregunta de dos pasos se puede escribir en Prolog:


También podemos preguntar: ¿quiénes son los nietos de tomás?


Otra posible pregunta es: ¿tienen ana y patricia un progenitor común? lo podemos
definir con dos pasos :

1). Quién es el progenitor X de ana, y
2). Es éste X, progenitor de patricia ?


Ejercicios.
1. Asumiendo las relaciones definidas en el ejemplo, ¿qué contestará Prolog a las
siguientes preguntas?
a). ?- progenitor( jaime, X).


b). ?- progenitor( X, jaime).



c). ?- progenitor( pamela, X), progenitor( X, patricia).



d). ?- progenitor( pamela, X), progenitor( X, Y), progenitor(Y,jaime).




2. Formule en Prolog las siguientes preguntas acerca de la relación progenitor:

a). ¿ cómo se llama el progenitor de patricia ?


b). ¿ tiene elizabeth algún hijo ?


c). ¿ cómo se llama el abuelo de patricia ?






                                                                     1.3.- REGLAS

Ahora queremos introducir la relación 'descendiente' que es lo inverso a la relación
'progenitor'; una alternativa es introducir nuevamente una lista como ésta :

descendiente( elizabeth, tomas).
...
otra alternativa mas práctica es aprovechar el conocimiento de que la relación
'descendiente' es lo inverso de la relación 'progenitor'; este conocimiento puede
representarse con la sentencia lógica :
en Prolog esto se escribe :

descendiente( Y, X) :- progenitor( X, Y).





una vez añadida la regla al programa, preguntemos ahora lo siguiente:

?- descendiente( elizabeth, tomas).


Aumentaremos ahora otras relaciones familiares al programa. Las especificaciones
para la relación llamada 'madre' se pueden basar en la siguiente sentencia lógica:
Para todo X y Y,
X es la madre de Y si
X es un progenitor de Y y,
X es mujer.
en Prolog :

madre( X, Y) :- progenitor( X, Y), mujer( X).


la relación 'abuelo', se define en Prolog como:

abuelo( X, Z) :- progenitor( X, Y) , progenitor( Y, Z).


Enseguida definiremos la relación 'hermana'
Para toda X y Y,
X es hermana de Y si,
(1) ambas X y Y tienen el mismo progenitor
(2) X es mujer.
en Prolog
hermana( X, Y) :- progenitor( Z, X), progenitor( Z, Y), mujer( X ).


Ahora sí podemos preguntar
?- hermana( ana, patricia).


?- hermana( X, patricia).


la regla para definir a 'hermana' no menciona nada acerca de que X y Y no deben instanciarse con el mismo objeto, para corregir la regla debe aumen-tarse con la relación 'diferente( X, Y)' así:
hermana( X, Y) :- progenitor( Z, X), progenitor( Z, Y), mujer( X ), diferente( X, Y).


Algunos puntos importantes de la discusión anterior son: 


-Los programas Prolog se extienden añadiendo nuevas cláusulas.
-Las cláusulas son de tres tipos : hechos, reglas y preguntas.
-Los hechos declaran cosas que siempre son incondicionalmente verdaderas.
-Las reglas declaran cosas que son verdaderas dependiendo de una condición dada.
-Por medio de preguntas, el usuario puede preguntar al programa cuáles cosas son
verdaderas.
-Las cláusulas Prolog consisten de cabeza y cuerpo. El cuerpo es una lista de metas
(goals) separadas por comas.
-Los hechos son cláusulas con un cuerpo vacío.
-Las preguntas solamente tienen cuerpo.
-Las reglas tienen cuerpo y cabeza.
-Durante una sesión, una variable se puede sustituir por un objeto, decimos entonces
que la variable se ha instanciado.


Ejercicios

1.3. Traduzca las siguientes sentencias a reglas Prolog.
a). Cualquiera que tiene un hijo es feliz (introduzca la relación unaria llamada 'feliz').

feliz(X, Z):-progenitor(X, Z).


Una vez hecha la sentencia; verificamos quienes son los progenitores y vemos que es tomas, roberto y patricia.
ahora le preguntamos a Prolog si estas personas son felices y nos mostrara quienes son sus hijos:



Otra sentencia declarada en Prolog es esta.

feliz(X, Y):-progenitor(X, Z).


Y hacemos las mismas preguntas ¿es feliz tomas, roberto y patricia? en esta ocasión Prolog nos contestara con un false o true.

La última pregunta que le realizamos a Prolog tiene como respuesta false, y es correcto porque ana no tiene hijos.


b). Para todo X, si X tiene un hijo que tiene una hermana, entonces X tiene dos hijos
(introduzca la relación tiene-dos-hijos).

tiene-dos-hijos(W,Y) :- progenitor(W,Y),hermana(X,Y).


Preguntas en Prolog ¿tiene dos hijos tomas y roberto?



1.4. Defina la relación 'nieto' usando la relación 'progenitor'.
Recomendación: Será similar a la relación abuelo.

nieto(X, Y):- progenitor(Z, X),progenitor(Y,Z).



Contestando algunas preguntas en Prolog como por ejemplo ¿Quién es el nieto de tomas, pamela, roberto?.


1.5. Defina la relación tia( X, Y) en términos de las relaciones 'progenitor' y
'hermana'. Dibuje primero un diagrama para ésta relación.
tia(X, Y):- progenitor(Z,Y), hermana(X, Z).





Preguntas en Prolog ¿Quién es la tia de jaime, ana, patricia?



1.4. Reglas Re cursivas

Aumentaremos ahora la relación 'predecesor' al programa. Esta nueva relación la podemos definir en términos de la relación 'progenitor'. La definición completa se puede expresar con dos reglas: la primera define a los predecesores directos y la segunda a los predecesores indirectos; por ejemplo el padre es un predecesor directo y el abuelo es predecesor indirecto:

La primer regla se puede formular en Prolog así:
predecesor( X, Z) :- progenitor( X, Z).


La segunda regla se debe definir en términos de sí misma (recursiva) a fín de que
trabaje a cualquier nivel de profundidad:
en Prolog :
predecesor( X, Z) :- progenitor( X, Y) , predecesor( Y, Z).


Preguntaremos ahora, ¿quiénes son los predecesores de pamela?

  
Ejercicio

1.6. Considere la siguiente definición alternativa de predecesor:
predecesor( X, Z) :- progenitor( X, Z).
predecesor( X, Z) :- progenitor( Y, Z) , predecesor( X, Y).
¿es apropiada esta definición?

Podemos darnos cuenta de que son apropiadas las definiciones.

¿Puede usted dibujar un diagrama que corresponda con
esta definición?

predecesor( X, Z) :- progenitor( X, Z).

                                                                                                           
predecesor( X, Z) :- progenitor( Y, Z) , predecesor( X, Y).


1.5. Cómo contesta Prolog las preguntas

Una pregunta a Prolog siempre es una secuencia de una o más metas (goals). Para responder a una pregunta Prolog trata de satisfacer todas las metas. Satisfacer una meta significa demostrar que la meta es verdadera asumiendo que todas las relaciones que existen dentro del programa son verdaderas.
Un punto de vista apropiado para la interpretación de un programa Prolog en términos matemáticos es: Prolog acepta hechos y reglas como un conjunto de axiomas y las preguntas del usuario las acepta como un teorema posible, entonces Prolog trata de demostrar este teorema (es decir, demostrar que puede derivarse lógicamente de los axiomas). Ilustraremos este punto de vista con un ejemplo clásico Todos los hombres son mortales.
Socrates es un hombre. Un teorema que se sigue lógicamente de estos dos axiomas es Socrates es mortal.
El primer axioma puede reescribirse como Para todo X, si X es hombre, entonces X es mortal.

 El ejemplo completo puede escribirse en Prolog como mortal( X) :- hombre( X). hombre(socrates).



Se le puede preguntar a Prolog

?- mortal(socrates).




Un ejemplo mas complicado del programa familiar es

?- predecesor( tomas, patricia).


sabemos que progenitor(roberto, patricia) es un hecho; usando este hecho y la regla pr1 podremos concluir predecesor( roberto, patricia), este hecho es derivado, no puede encontrarse explícitamente en el programa pero sí puede derivarse de los hechos y reglas del programa.
Este paso de inferencia lo podemos representar así:
pr1
progenitor( roberto,patricia) ==> predecesor( roberto,patricia)
que puede leerse: de progenitor(roberto,patricia) se sigue predecesor( roberto, patricia)
por la regla pr1.
además, sabemos que progenitor(tomas,roberto) es un hecho. Usando este hecho y el hecho derivado predecesor(roberto,patricia) podemos concluir predecesor(tomas, patricia) por la regla pr2. Así, hemos demostrado que nuestra sentencia meta predecesor(tomas, patricia) es verdadera. Este proceso de inferencia de dos pasos lo podemos representar así:

pr1
progenitor( roberto,patricia) ==> predecesor( roberto,patricia)
progenitor( tomas, roberto) pr2
and predecesor( roberto, patricia) ==> predecesor( tomas,patricia)
Pero, ¿cómo encuentra Prolog las secuencias anteriores?

Prolog encuentra las secuencias en el orden inverso a como las hemos deducido. En lugar de comenzar con hechos simples, Prolog comienza con las metas y, usando reglas, sustituye las metas actuales con nuevas metas hasta que estas lleguen a ser hechos sencillos.
Prolog trata de satisfacer esta meta intentando encontrar una cláusula en el programa de
la cual pueda seguirse inmediatamente esta meta.
Las únicas cláusulas relevantes para este objetivo son pr1 y pr2. Decimos que las cabezas de estas reglas 'empatan' (match) la meta.

Pero las dos cláusulas pr1 y pr2 representan dos modos alternos de procedimiento. Prolog tratará con la que aparezca primero en el programa
predecesor( X, Z) :- progenitor(X, Z).
Como la meta es predecesor( tomas, patricia), las variables de la regla se instanciarán
como sigue:
X = tomas Z = patricia.
la meta original predecesor(tomas,patricia) se reemplaza ahora por la nueva meta:
progenitor( tomas, patricia)

este paso de usar una regla para transformar una meta en otra se puede ilustrar así:

No hay cláusula en el programa cuya cabeza empate la meta progenitor( tomas,
patricia), por lo tanto, esta meta falla.
Ahora Prolog dará vuelta atrás (proceso de backtraking) retornando a la meta original con objeto de intentar la otra alternativa para derivar la meta inicial predecesor( tomas, patricia), ésta es la regla pr2:
predecesor( X, Z) :- progenitor( X, Y) , predecesor( Y, Z).
ahora las variables X y Z quedarán instanciadas como
X = tomas Z = patricia
Pero Y no será instanciada aún. La meta objetivo predecesor( tomas, patricia) se reemplaza con dos metas
progenitor( tomas, Y) , predecesor( Y, patricia)
este paso de ejecución se muestra con la siguiente figura:



ahora Prolog tratará de satisfacer las dos metas en el orden en que están escritas (de
izquierda a derecha).

Ejercicios.

1.7. Trate de entender como Prolog deriva respuestas a las siguientes preguntas, usando el programa familiar. Dibuje tambien los diagramas de derivación correspondientes. Identifique los bactrakings que se encuentre:
a). ?- progenitor( pamela, roberto).
b). ?- madre( pamela, roberto).
c). ?- abuelo( pamela, ana).
d). ?- abuela(roberto, jaime). 


a). ?- progenitor( pamela, roberto). 


b). ?- madre( pamela, roberto).


c). ?- abuelo( pamela, ana).



 abuelo( X, Z):- progenitor(X, Y), progenitor(X, Z), hombre(X).

d). ?- abuela(roberto, jaime).

Abuela(X,Z):- progenitor(X,Y), progenitor(Y,Z), mujer(X).



Conclusión



1.-Se puede ver que el lenguaje Prolog está orientado a la Inteligencia Artificial, claro usando la programación lógica, ya que es muy fácil de programar, se puede escribir muy sencillamente, además,  cualquier usuario puede acceder a él si lo desea y sin ningún problema de entendimiento.
2.- Prolog Se parece mucho como cuando almacenamos una base de Datos, luego cuando le Preguntamos a Prolog. es como cuando hacemos consultas en MySQL  muy parecido no??  y ademas...
Utiliza pocos comando a comparación de otros lenguajes de programación.


Que tal hee jajaja!!!!!!!!

Referencias:

Upuntes de Prolog.
Autor: Edgar Altamirano Carmona
Universidad Autónoma de Guerrero.

http://www.gprolog.org/
http://www.swi-prolog.org/
http://www.cs.toronto.edu/~sheila/384/w11/simple-prolog-examples.html

BY: Israel Ayala

No hay comentarios:

Publicar un comentario