introalg:taller09_1
Diferencias
Muestra las diferencias entre dos versiones de la página.
Ambos lados, revisión anteriorRevisión previaPróxima revisión | Revisión previa | ||
introalg:taller09_1 [2009/03/21 12:55] – laura | introalg:taller09_1 [2018/08/10 03:03] (actual) – editor externo 127.0.0.1 | ||
---|---|---|---|
Línea 1: | Línea 1: | ||
+ | |||
+ | =====Introducción a la Programación Lógica===== | ||
+ | |||
+ | ====Qué es la programación declarativa? | ||
Este año vamos a ver aproximaciones distintas a la [[http:// | Este año vamos a ver aproximaciones distintas a la [[http:// | ||
+ | |||
+ | En el paradigma de la programación declarativa, | ||
+ | |||
+ | El interés de la programación declarativa radica en el hecho de que podemos obtener mucha más información de la que hemos declarado inicialmente, | ||
+ | |||
+ | En prolog podemos describir una familia declarando únicamente las relaciones entre padres e hijos y el sexo de cada miembro de la familia, y luego con reglas que describen cada relación familiar (padre, madre, primo, tío) en función de estas dos únicas fuentes de conocimiento. | ||
+ | |||
+ | También podemos describir las conexiones que existen entre ciudades, de a pares únicamente, | ||
+ | |||
+ | Algunas cosas para las que no es razonable usar prolog: para gestión de archivos, tratamiento masivo de datos, manipulación de texto mediante expresiones regulares, entre otros. | ||
+ | |||
+ | |||
+ | ====Iniciando prolog==== | ||
Empezamos con la [[http:// | Empezamos con la [[http:// | ||
Línea 20: | Línea 37: | ||
</ | </ | ||
- | El símbolo ''? | + | El símbolo ''? |
+ | |||
+ | El intérprete solamente contesta a cosas que sepa. Si nosotros no le proporcionamos ningún conocimiento extra, el intérprete sólo sabe algunas propiedades sobre números, por ejemplo, le podemos preguntar lo siguiente: | ||
+ | < | ||
+ | ?- 5 is 2+3. | ||
+ | true. | ||
+ | |||
+ | ?- | ||
+ | </ | ||
+ | |||
+ | Pero si le queremos | ||
+ | |||
+ | Cuando ya no queremos preguntar nada más al intérprete, | ||
+ | < | ||
+ | ?- halt. | ||
+ | computador: | ||
+ | </ | ||
+ | |||
+ | |||
+ | ====Incorporando conocimiento: | ||
Para proporcionar el conocimiento al intérprete, | Para proporcionar el conocimiento al intérprete, | ||
- | Vamos a proporcionarle a nuestro intérprete algo de conocimiento. Prendemos nuestro editor y escribimos algo de conocimiento, por ejemplo: | + | Vamos a proporcionarle a nuestro intérprete algo de conocimiento. Prendemos nuestro editor y escribimos algo de conocimiento. Por ejemplo, vamos a declarar un par de **hechos**: que Sócrates es un hombre y que Sócrates es mortal. Lo escribimos como predicados, de la siguiente forma: |
< | < | ||
mortal(sócrates). | mortal(sócrates). | ||
hombre(sócrates). | hombre(sócrates). | ||
</ | </ | ||
+ | |||
+ | NOTA: Fíjense que no usamos mayúsculas, | ||
Guardamos el archivo con un nombre cualquiera y la extensión '' | Guardamos el archivo con un nombre cualquiera y la extensión '' | ||
Línea 59: | Línea 97: | ||
</ | </ | ||
- | Podemos añadir información para que el intérprete tenga más conocimiento cargado en memoria editando el archivo ejemplo1.pl. Por ejemplo, añadimos las sigguientes | + | Podemos añadir información para que el intérprete tenga más conocimiento cargado en memoria editando el archivo ejemplo1.pl. Por ejemplo, añadimos las siguientes |
< | < | ||
hombre(platón). | hombre(platón). | ||
Línea 84: | Línea 122: | ||
?- | ?- | ||
</ | </ | ||
+ | |||
+ | Finalmente, y no menos importante, fíjense que todas las aserciones en prolog terminan en un punto. Si no terminan en un punto, el intérprete se queda esperando hasta que le ponemos el punto: | ||
+ | < | ||
+ | ?- hombre(platón) | ||
+ | | . | ||
+ | true. | ||
+ | |||
+ | ?- | ||
+ | </ | ||
+ | |||
+ | |||
+ | ====Inferencia de conocimiento: | ||
Ahora bien, si queremos añadir el conocimiento de que Platón y Aristóteles también son mortales, tendremos que declararlo en una aserción para cada caso? No podemos hacer algo más general? Sí, podemos usar **reglas** y **variables**. Podemos decir algo así como "si alguien es un hombre, ese alguien es mortal", | Ahora bien, si queremos añadir el conocimiento de que Platón y Aristóteles también son mortales, tendremos que declararlo en una aserción para cada caso? No podemos hacer algo más general? Sí, podemos usar **reglas** y **variables**. Podemos decir algo así como "si alguien es un hombre, ese alguien es mortal", | ||
Línea 94: | Línea 144: | ||
</ | </ | ||
- | Además, | + | Recién |
- | Las **variables** se escriben siempre | + | Las **variables** se escriben siempre |
- | La unificación es un mecanismo que se usa en muchos lenguajes de programación. En concreto en prolog, sigue las siguientes normas: | + | Al mecanismo por el que sustituimos una variable por un valor, con algunas restricciones, |
- una variable a la cual no se ha asignado todavía ningún valor se puede unificar con un átomo, un término o otra variable a la cual no se ha asignado valor. En muchos dialectos de prolog y en lógica de primer orden, una variable no se puede unificar con un término que la contiene. | - una variable a la cual no se ha asignado todavía ningún valor se puede unificar con un átomo, un término o otra variable a la cual no se ha asignado valor. En muchos dialectos de prolog y en lógica de primer orden, una variable no se puede unificar con un término que la contiene. | ||
Línea 104: | Línea 154: | ||
- un término se puede unificar con otro término si la función que los contiene es la misma, tiene la misma cantidad de argumentos y los argumentos se pueden unificar entre ellos (fíjense que esto es un procedimiento recursivo, ya que puede ser que los argumentos sean términos y que el procedimiento para unificación de términos tenga que aplicarse también a ellos). | - un término se puede unificar con otro término si la función que los contiene es la misma, tiene la misma cantidad de argumentos y los argumentos se pueden unificar entre ellos (fíjense que esto es un procedimiento recursivo, ya que puede ser que los argumentos sean términos y que el procedimiento para unificación de términos tenga que aplicarse también a ellos). | ||
- | Finalmente, y no menos importante, fíjense que todas las aserciones en prolog terminan en un punto. | + | ===Pensando |
- | Cuando ya no queremos preguntar nada más al intérprete, | + | Supongamos que estamos trabajando con el siguiente conjunto de hechos (o base de conocimiento): |
+ | < | ||
+ | wizard(ron). | ||
+ | hasWand(ron). | ||
+ | hasBroom(ron). | ||
+ | quidditchPlayer(harry). | ||
+ | wizard(X) :- hasBroom(X), | ||
+ | hasBroom(X) :- quidditchPlayer(X). | ||
+ | </ | ||
+ | Cómo responde prolog a las siguientes preguntas? | ||
+ | * wizard(ron). | ||
+ | * witch(ron). | ||
+ | * wizard(hermione). | ||
+ | * witch(hermione). | ||
+ | * wizard(harry). | ||
+ | |||
+ | Y ahora, introduzcamos algún cambio: | ||
+ | < | ||
+ | wizard(X) :- hasBroom(X), | ||
+ | </ | ||
+ | |||
+ | Qué efectos tiene este cambio? Por qué? | ||
+ | |||
+ | |||
+ | ====Desconocimiento: | ||
+ | |||
+ | El intérprete nos va a avisar cuando haya algún error o bien alguna cosa que le parece extraña en el archivo. Es importante leer los mensajes que nos dá el intérprete para interpretar qué está pasando en cada momento. Muchas veces se trata de cosas sin importancia: | ||
+ | < | ||
+ | ?- [' | ||
+ | Warning: / | ||
+ | Clauses of wizard/1 are not together in the source-file | ||
+ | Warning: / | ||
+ | Clauses of hasBroom/1 are not together in the source-file | ||
+ | % ejemplo.pl compiled 0.00 sec, 0 bytes | ||
+ | true. | ||
+ | |||
+ | ?- | ||
+ | </ | ||
+ | |||
+ | En este caso, lo único que nos dice el intérprete es que las aserciones que hacen referencia a wizard | ||
+ | < | ||
+ | Warning: / | ||
+ | Redefined static procedure wizard/1 | ||
+ | Warning: / | ||
+ | Redefined static procedure hasWand/1 | ||
+ | </ | ||
+ | Acá el intérprete | ||
+ | < | ||
+ | wizard(ron). | ||
+ | hasWand(ron). | ||
+ | </ | ||
+ | Algunas veces el intérprete se queja porque no le hemos definido los predicados que pretendemos usar, eso sí es grave, ya que no se puede realizar la interpretación, | ||
+ | < | ||
+ | ?- witch(hermione). | ||
+ | ERROR: toplevel: Undefined procedure: witch/1 (DWIM could not correct goal) | ||
+ | ?- | ||
+ | </ | ||
+ | < | ||
+ | ?- wizard(harry). | ||
+ | ERROR: wizard/1: Undefined procedure: hasWand/1 | ||
+ | </ | ||
+ | |||
+ | A veces le exigimos operaciones demasiado complicadas al intérprete, | ||
+ | < | ||
+ | ?- caballero(a). | ||
+ | ERROR: Out of local stack | ||
+ | </ | ||
+ | Para salir de esta situación, el intérprete nos dá el siguiente mensaje: | ||
+ | < | ||
+ | Action (h for help) ? | ||
+ | </ | ||
+ | Si presionamos la tecla 'h', nos aparecen diferentes opciones: | ||
+ | < | ||
+ | Action (h for help) ? Options: | ||
+ | a: | ||
+ | c: | ||
+ | g: | ||
+ | h (?): | ||
+ | Action (h for help) ? | ||
+ | </ | ||
+ | Si presionamos la tecla 'a', salimos de la ejecución, si presionamos la tecla ' | ||
- | Escribir conocimiento es declarar, de ahí programación declarativa TODO | + | El próximo día vamos a ver un poco más qué pasa con la opción ' |
====Ejercicios==== | ====Ejercicios==== | ||
- | - Expresen los miembros de una familia. | ||
- Digan cuáles de estas expresiones unifican y cuáles no (de la página sobre [[http:// | - Digan cuáles de estas expresiones unifican y cuáles no (de la página sobre [[http:// | ||
* A = A | * A = A | ||
Línea 126: | Línea 255: | ||
* A = f(A) | * A = f(A) | ||
* A = abc, xyz = X, A = X | * A = abc, xyz = X, A = X | ||
+ | - Implementen una regla que diga " | ||
+ | - Ahora un ratito de reflexión (sólo 10-15 mins, luego pasen al siguiente ejercicio). Recuerdan a los caballeros y pícaros? Traten de formalizar las oraciones que hablan de ellos y vean qué pasa. Vean qué cosas tienen que formalizar para la máquina, vean si anda, vean si la máquina puede lidiar con tanta complejidad... | ||
+ | - Expresen en reglas las relaciones entre los miembros de la familia que describimos aquí mediante hechos: | ||
+ | < | ||
+ | mujer(pepa). | ||
+ | mujer(lucía). | ||
+ | mujer(blanca). | ||
+ | mujer(rosa). | ||
+ | mujer(alba). | ||
+ | mujer(inés). | ||
+ | mujer(irene). | ||
+ | hombre(armando). | ||
+ | hombre(julián). | ||
+ | hombre(esteban). | ||
+ | hombre(mario). | ||
+ | hombre(alejandro). | ||
+ | hombre(martín). | ||
+ | hombre(matías). | ||
+ | progenitor(pepa, | ||
+ | progenitor(pepa, | ||
+ | progenitor(pepa, | ||
+ | progenitor(lucía, | ||
+ | progenitor(lucía, | ||
+ | progenitor(blanca, | ||
+ | progenitor(blanca, | ||
+ | progenitor(irene, | ||
+ | progenitor(armando, | ||
+ | progenitor(armando, | ||
+ | progenitor(armando, | ||
+ | progenitor(julián, | ||
+ | progenitor(julián, | ||
+ | progenitor(alejandro, | ||
+ | progenitor(alejandro, | ||
+ | progenitor(mario, | ||
+ | </ | ||
+ | Escriban reglas para expresar las relaciones '' | ||
+ | |||
+ | El libro [[http:// | ||
+ | * en la [[http:// | ||
+ | * en la [[http:// | ||
+ | |||
introalg/taller09_1.1237640131.txt.gz · Última modificación: 2018/08/10 03:03 (editor externo)