Herramientas de usuario

Herramientas del sitio


introalg:taller09_1

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Ambos lados, revisión anteriorRevisión previa
Próxima revisión
Revisión previa
introalg:taller09_1 [2009/03/21 20:59] lauraintroalg:taller09_1 [2018/08/10 03:03] (actual) – editor externo 127.0.0.1
Línea 56: Línea 56:
  
  
-====Incorporando conocimiento====+====Incorporando conocimiento: hechos====
  
 Para proporcionar el conocimiento al intérprete, el proceso más habitual es escribir este conocimiento en un archivo, y luego darle el archivo al intérprete para que lo cargue en su memoria. Después, el intérprete va a tener el conocimiento en la memoria y podremos preguntarle sobre ese conocimiento. Para proporcionar el conocimiento al intérprete, el proceso más habitual es escribir este conocimiento en un archivo, y luego darle el archivo al intérprete para que lo cargue en su memoria. Después, el intérprete va a tener el conocimiento en la memoria y podremos preguntarle sobre ese conocimiento.
  
-Vamos a proporcionarle a nuestro intérprete algo de conocimiento. Prendemos nuestro editor y escribimos algo de conocimiento. Por ejemplo, vamos a decir que Sócrates es un hombre y que Sócrates es mortal. Lo escribimos como predicados, de la siguiente forma:+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:
 <code> <code>
 mortal(sócrates). mortal(sócrates).
Línea 133: Línea 133:
  
  
-====Inferencia de conocimiento====+====Inferencia de conocimiento: reglas====
  
 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", o mejor todavía, "si un X es hombre, entonces ese X es mortal", escrito de la siguiente forma: 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", o mejor todavía, "si un X es hombre, entonces ese X es mortal", escrito de la siguiente forma:
Línea 144: Línea 144:
 </code> </code>
  
-====Constantes, variablestérminosreglas y unificación====+Recién hemos introducido el uso de variables. Hasta ahora sólo habíamos usado **constantes**, que se escriben siempre en minúscula y pueden ser atómicas o complejas. Ejemplos de constantes atómicas (también llamados "átomos") serían ''sócrates'', ''platón'', ''aristóteles'', ''yo'' o ''llueve''Constantes complejas serían los predicados como ''hombre()''''mortal()''. Son complejas porque su significado está compuesto de más de una partepor ejemplo ''hombre(sócrates)''. Por el momento hemos visto constantes con solamente un argumentopero el número de argumentos es arbitrario. Así, podemos decir cosas como ''ama(pedro,maría).'' o ''paga(empleador,empleado,sueldo)''.
  
-Recién hemos introducido el uso de variables. Hasta ahora sólo habíamos usado **constantes**, que se escriben siempre en minúscula y pueden ser atómicas o complejas. Ejemplos de constantes atómicas serían ''sócrates'', ''platón''''aristóteles'', ''yo'' ''llueve''. Constantes complejas serían los predicados como ''hombre()'', ''mortal()''Son complejas porque su significado está compuesto de más de una parte, por ejemplo ''hombre(sócrates)''+Las **variables** se escriben siempre empezando por mayúscula (por ejemplo, ''X'', ''Equis'' ''Variable'', pero **nunca** ''x''''equis'' ''variable''y son simplemente huecos donde podemos poner cualquier cosaEso sí, con una restricción: si en una regla ponemos una cosa en una variable que se llama, por ejemplo, X, tenemos que poner la misma cosa siempre que aparezca la variable X en la misma regla. Es decir, __dentro de una misma regla__ no podemos poner una cosa en un lugar donde aparece X y otra cosa en otro lugar donde aparece X. La única excepción a esta regla es la variable comodín ''_'', que es un súper hueco: puede sustituirse por cualquier cosa, y esas cosas pueden ser distintas dentro de una misma regla
  
-Las **variables** se escriben siempre empezando por mayúscula (por ejemplo, ''X'', ''Equis'' o ''Variable'', pero **nunca** ''x'', ''equis'' o ''variable'') y son simplemente huecos donde podemos poner cualquier cosa. Eso sí, con una restricción: si en una regla ponemos una cosa en una variable que se llama, por ejemplo, X, tenemos que poner la misma cosa siempre que aparezca la variable X en la misma regla. Es decir, __dentro de una misma regla__ no podemos poner una cosa en un lugar donde aparece X y otra cosa en otro lugar donde aparece X. Al mecanismo por el que sustituimos una variable por un valor, con algunas restricciones, se le llama **unificación**. +Al mecanismo por el que sustituimos una variable por un valor, con algunas restricciones, se le llama **unificación**. La unificación es un mecanismo que se usa en muchos lenguajes de programación. En concreto en prolog, sigue las siguientes normas:
- +
-La unificación es un mecanismo que se usa en muchos lenguajes de programación. En concreto en prolog, sigue las siguientes normas:+
  
    - 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 156: 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).
  
 +===Pensando un poco más sobre variables y unificación===
 +
 +Supongamos que estamos trabajando con el siguiente conjunto de hechos (o base de conocimiento):
 +<code>
 +    wizard(ron).
 +    hasWand(ron).
 +    hasBroom(ron).
 +    quidditchPlayer(harry).
 +    wizard(X) :- hasBroom(X),hasWand(X).
 +    hasBroom(X) :- quidditchPlayer(X).
 +</code>
 +Cómo responde prolog a las siguientes preguntas?
 +  * wizard(ron).
 +  * witch(ron).
 +  * wizard(hermione).
 +  * witch(hermione).
 +  * wizard(harry).
 +
 +Y ahora, introduzcamos algún cambio:
 +<code>
 +  wizard(X) :- hasBroom(X),hasWand(_).
 +</code>
 +
 +Qué efectos tiene este cambio? Por qué?
 +
 +
 +====Desconocimiento: mensajes de alerta y de error====
 +
 +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:
 +<code>
 +?- ['ejemplo.pl'].
 +Warning: /Users/la/fen/introalg09/taller/prolog/ejemplo.pl:6:
 + Clauses of wizard/1 are not together in the source-file
 +Warning: /Users/la/fen/introalg09/taller/prolog/ejemplo.pl:7:
 + Clauses of hasBroom/1 are not together in the source-file
 +% ejemplo.pl compiled 0.00 sec, 0 bytes
 +true.
 +
 +?-
 +</code>
 +
 +En este caso, lo único que nos dice el intérprete es que las aserciones que hacen referencia a wizard no están todas juntas en el archivo "ejemplo.pl". Nos avisa porque cree que es más elegante tener todas las referencias a un mismo predicado juntas en la base de conocimiento, para que la base de conocimiento sea más ordenada.
 +<code>
 +Warning: /Users/la/fen/introalg09/taller/prolog/ejemplo.pl:2:
 + Redefined static procedure wizard/1
 +Warning: /Users/la/fen/introalg09/taller/prolog/ejemplo.pl:3:
 + Redefined static procedure hasWand/1
 +</code>
 +Acá el intérprete se queja porque había espacio en blanco delante del predicado, de la siguiente forma:
 +<code>
 +      wizard(ron).
 +hasWand(ron).
 +</code>
 +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, y por eso el intérprete nos lo marca como ERROR:
 +<code>
 +?- witch(hermione).
 +ERROR: toplevel: Undefined procedure: witch/1 (DWIM could not correct goal)
 +?- 
 +</code>
 +<code>
 +?- wizard(harry).
 +ERROR: wizard/1: Undefined procedure: hasWand/1
 +</code>
 +
 +A veces le exigimos operaciones demasiado complicadas al intérprete, la máquina no tiene suficiente capacidad y nos quedamos sin recursos, por ejemplo:
 +<code>
 +?- caballero(a).
 +ERROR: Out of local stack
 +</code>
 +Para salir de esta situación, el intérprete nos dá el siguiente mensaje:
 +<code>
 +Action (h for help) ? 
 +</code>
 +Si presionamos la tecla 'h', nos aparecen diferentes opciones:
 +<code>
 +Action (h for help) ? Options:
 +a:                 abort      b:                 break
 +c:                 continue   e:                 exit
 +g:                 goals      t:                 trace
 +h (?):             help
 +Action (h for help) ? 
 +</code>
 +Si presionamos la tecla 'a', salimos de la ejecución, si presionamos la tecla 'e', salimos del intérprete.
 +
 +El próximo día vamos a ver un poco más qué pasa con la opción 't', que nos permite ver los pasos por los que va pasando el intérprete. También vamos a entrar un poco más en detalle en funciones complejas, y vamos a ver más sistemáticamente las cuestiones de aridad de las funciones, que en prolog se expresan con barra y número: 'hasWand/1', 'a/0', etc.
  
 ====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://en.wikipedia.org/wiki/Unification|unificación]] de la wikipedia):   - Digan cuáles de estas expresiones unifican y cuáles no (de la página sobre [[http://en.wikipedia.org/wiki/Unification|unificación]] de la wikipedia):
     * A = A     * A = A
Línea 173: 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 "cuando llueve, me resfrío". Fíjense que para que el intérprete conteste ''true'' a la pregunta "yo me resfrío?", el antecedente de la implicación tiene que ser cierto...
 +  - 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:
 +<code>
 +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,lucía).
 +progenitor(pepa,blanca).
 +progenitor(pepa,mario).
 +progenitor(lucía,rosa).
 +progenitor(lucía,alba).
 +progenitor(blanca,inés).
 +progenitor(blanca,martín).
 +progenitor(irene,matías).
 +progenitor(armando,lucía).
 +progenitor(armando,blanca).
 +progenitor(armando,mario).
 +progenitor(julián,rosa).
 +progenitor(julián,alba).
 +progenitor(alejandro,inés).
 +progenitor(alejandro,martín).
 +progenitor(mario,matías).
 +</code>
 +Escriban reglas para expresar las relaciones ''padre, madre, abuelo, abuela, hermano, hermana, tío, tía, primo, prima'' y también ''hijo único''.  
 +
 +El libro [[http://www.learnprolognow.org/|Learn Prolog Now!]], de Patrick Blackburn, Johan Bos and Kristina Striegnitz tiene un montón de ejercicios muy bien explicados para practicar. Yo les recomiendo:
 +  * en la [[http://cs.union.edu/~striegnk/learn-prolog-now/html/node13.html#sec.l1.exercises|primera tanda de ejercicios]], el 1.4 y 1.5
 +  * en la [[http://cs.union.edu/~striegnk/learn-prolog-now/html/node21.html#sec.l2.exercises|segunda tanda de ejercicios]], todos!
 +
  
introalg/taller09_1.1237669187.txt.gz · Última modificación: 2018/08/10 03:03 (editor externo)