Ambos lados, revisión anteriorRevisión previaPróxima revisión | Revisión previa |
introalg:taller09_2 [2009/04/06 01:28] – laura | introalg:taller09_2 [2018/08/10 03:03] (actual) – editor externo 127.0.0.1 |
---|
====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> |
| y |
| <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. |
- ¿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... |