Herramientas de usuario

Herramientas del sitio


introalg:taller09_2

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_2 [2009/04/06 01:26] lauraintroalg:taller09_2 [2018/08/10 03:03] (actual) – editor externo 127.0.0.1
Línea 102: Línea 102:
 ====Vuelta atrás o Backtracking==== ====Vuelta atrás o Backtracking====
  
-Pero a veces sucede que cuando hacemos una pregunta al intérprete, éste nos dá responde ''true'', y, si le escribimos '';'' para que nos siga dando opciones, nos devuelve ''false''. Este comportamiento sigue la misma lógica que si le pedimos al intérprete los posibles valores de una variable, y nos los devuelve todos. Para resolver un objetivo, el intérprete explora todas las posibles opciones, es decir, trata de resolver todas las cláusulas que tengan al objetivo en la cabeza, que puede ser más de una. Cada una de estas posibilidades se denomina ''punto de elección''.+Pero a veces sucede que cuando hacemos una pregunta al intérprete, éste nos dá responde ''true'', y, si le escribimos '';'' para que nos siga dando opciones, nos devuelve ''false''. Este comportamiento sigue la misma lógica que si le pedimos al intérprete los posibles valores de una variable, y nos los devuelve todos. Para resolver un objetivo, el intérprete explora todas las posibles opciones, es decir, trata de resolver todas las cláusulas que tengan al objetivo en la cabeza, que puede ser más de una. Esta situación se puede entender como una disyunción: para satisfacer el objetivo, se puede hacer o bien satisfaciendo un subconjunto de objetivos (el cuerpo de una cláusula) o bien satisfaciendo otro subconjunto de objetivos (el cuerpo de otra cláusula). De hecho, es equivalente escribir dos cláusulas con la misma cabeza o escribir los cuerpos de esas dos cláusulas unidos por una disyunción en el cuerpo de una sola cláusula. Por ejemplo, serían equivalentes: 
 +<code> 
 +hasBroom(X) :- quidditchPlayer(X). 
 +wizard(X) :- hasBroom(X), hasWand(X). 
 +wizard(X) :- quidditchPlayer(X), hasWand(X). 
 +</code> 
 +
 +<code> 
 +hasBroom(X) :- quidditchPlayer(X). 
 +wizard(X) :- ( hasBroom(X), hasWand(X) ) ; 
 +             ( quidditchPlayer(X), hasWand(X) ). 
 +</code> 
 + 
 +Cada uno de estos puntos donde encontramos varias formas (o caminos) para que un predicado llegue a ser ''true'' o ''false'' se llaman ''punto de elección''.
  
 Cuando uno de los objetivos encontrados resulta ser falso, el intérprete vuelve para atrás hasta el punto de elección inmediatamente anterior, y busca otras reglas por las que sustituir el objetivo, y así hasta que agota todas las posibles reglas por las que sustituir el objetivo. El procedimiento de volver atrás se conoce como  [[http://es.wikipedia.org/wiki/Vuelta_Atr%C3%A1s|backtracking]], y consiste en deshacer todo lo ejecutado, situando el programa en el mismo estado en el que estaba justo antes de llegar al punto de elección. Entonces se toma el siguiente punto de elección que estaba pendiente y se repite de nuevo el proceso. Como resultado, el intérprete nos ofrece todos los resultados a los que fue llegando en esta exploración de los caminos a los que le llevan los puntos de elección. Cuando uno de los objetivos encontrados resulta ser falso, el intérprete vuelve para atrás hasta el punto de elección inmediatamente anterior, y busca otras reglas por las que sustituir el objetivo, y así hasta que agota todas las posibles reglas por las que sustituir el objetivo. El procedimiento de volver atrás se conoce como  [[http://es.wikipedia.org/wiki/Vuelta_Atr%C3%A1s|backtracking]], y consiste en deshacer todo lo ejecutado, situando el programa en el mismo estado en el que estaba justo antes de llegar al punto de elección. Entonces se toma el siguiente punto de elección que estaba pendiente y se repite de nuevo el proceso. Como resultado, el intérprete nos ofrece todos los resultados a los que fue llegando en esta exploración de los caminos a los que le llevan los puntos de elección.
Línea 215: Línea 228:
  
 En los ejercicios del día de hoy van a tener que proponer soluciones para algunos problemas que seguramente conocen bien. Si las soluciones que proponen no llegan a dar los resultados que esperaban, deben hacer dos cosas: En los ejercicios del día de hoy van a tener que proponer soluciones para algunos problemas que seguramente conocen bien. Si las soluciones que proponen no llegan a dar los resultados que esperaban, deben hacer dos cosas:
-  leer bien atentamente los mensajes de error o de advertencia que les da el intérprete. +  leer bien atentamente los mensajes de error o de advertencia que les da el intérprete. 
-  usar las herramientas que hemos visto en la clase para observar cómo está funcionando el intérprete, seguramente de una forma distinta a como ustedes están pensando.+  usar las herramientas que hemos visto en la clase para observar cómo está funcionando el intérprete, seguramente de una forma distinta a como ustedes están pensando.
  
 +Traten de aportar soluciones para los siguientes problemas:
  
   - Partiendo del [[http://www.cs.famaf.unc.edu.ar/wiki/doku.php?id=introalg:taller09_soluciones#familia|ejemplo de la familia]], ¿cómo tenemos que ampliarlo para expresar la relación "suegra" o "cuñado"? ¿y "abuelo materno"? ¿o "hermano mayor"?   - Partiendo del [[http://www.cs.famaf.unc.edu.ar/wiki/doku.php?id=introalg:taller09_soluciones#familia|ejemplo de la familia]], ¿cómo tenemos que ampliarlo para expresar la relación "suegra" o "cuñado"? ¿y "abuelo materno"? ¿o "hermano mayor"?
   - ¿Cómo sería un programa para recomendar amigos en una red social tipo //facebook//?   - ¿Cómo sería un programa para recomendar amigos en una red social tipo //facebook//?
   - ¿Cómo podemos hacer un programa **no muy largo** que, dado un animal, nos diga si es ovíparo o vivíparo, si vive en la tierra, en el agua o en el aire, si come carne o vegetales, etc.? Traten de usar generalizaciones del tipo ''si es mamífero, entonces...''. En esta aproximación, cómo tratarían excepciones como "delfín" o "guppi"?   - ¿Cómo podemos hacer un programa **no muy largo** que, dado un animal, nos diga si es ovíparo o vivíparo, si vive en la tierra, en el agua o en el aire, si come carne o vegetales, etc.? Traten de usar generalizaciones del tipo ''si es mamífero, entonces...''. En esta aproximación, cómo tratarían excepciones como "delfín" o "guppi"?
 +  - Tenemos una lista de las conexiones por tren entre pares de ciudades, por ejemplo ''conectadas(Tarragona,Barcelona). ''. ¿Cómo sería un programa que nos ayudara a saber si podemos llegar de una ciudad a otra, es decir, si existe una lista de conexiones que nos lleve de una ciudad a otra, o bien eso es imposible? Primero, traten de hacer un programa que nos diga si podemos llegar de una ciudad a otra directamente o bien en dos o en tres pasos...
introalg/taller09_2.1238981186.txt.gz · Última modificación: 2018/08/10 03:03 (editor externo)