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
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:
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.
Bien aun no lo conocemos bien pero ya tenemos una idea, a continuación se mostraran unos ejemplos de como funciona prolog.
Ejemplo.
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
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í.------>
Vamos a ir desarrollando mas conocimientos de Prolog.
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).
1.3.- REGLAS
Ahora queremos introducir la relación 'descendiente' que es lo inverso a la relación
Algunos puntos importantes de la discusión anterior son:
abuelo( X, Z):- progenitor(X, Y), progenitor(X, Z), hombre(X).
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.
- 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:
- 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
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
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)
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)
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:
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).
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.
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).
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
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