La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Generate & Test. Árboles de derivación. Tratamiento de repeticiones.

Presentaciones similares


Presentación del tema: "Generate & Test. Árboles de derivación. Tratamiento de repeticiones."— Transcripción de la presentación:

1 Generate & Test. Árboles de derivación. Tratamiento de repeticiones.
Prolog (2da parte) Generate & Test. Árboles de derivación. Tratamiento de repeticiones.

2 Generar y Testear La intuición es aprovechar el orden de evaluación de Prolog, para definir la siguiente estrategia para resolver problemas: 1) Generar todas las posibles respuestas. 2) Filtrar las respuestas obtenidas en 1, obteniendo la respuesta buscada.

3 predicado(x) :- generate(x), test(X)
Esquema general Un predicado que utiliza generate & test consta de dos partes: predicado(x) :- generate(x), test(X) “generate” instanciará la variable x. “test” verificará si x es o no una solución válida, puede asumir que la variable está instanciada.

4 Un generador El predicado entre(+X, +Y, -Z) devuelve todos los Z entre X e Y. Pensarlo unos minutos… entre(X,Y,X):- X=<Y. entre(X,Y,Z):- X<Y, W is X+1, entre(W,Y,Z).

5 Ejercicio Generar los pares menores a X.
Nuevamente unos minutos para pensarlo, con la siguiente ayudita: par(X):- 0 is X mod 2. paresMenoresA(X, Y) :- entre(0,X,Y), par(Y). entre es el encargado de ir generando todos los números menores a X, luego par actúa como filtro.

6 Arboles de Derivación [Ver Recorrido.ppt]

7 Soluciones repetidas…
usaJogging(pablo). usaJogging(alejo). programaBien(pablo). programaBien(diego). programaBien(alejo). esWinner(pablo). esWinner(diego). puedeSerGroso(X):- programaBien(X). puedeSerGroso(X):- esWinner(X). esGroso(X):- puedeSerGroso(X),usaJogging(X).

8 Consulta Pensar unos minutos qué respuestas daría y en qué orden.
? esGroso(X). Pensar unos minutos qué respuestas daría y en qué orden. Respuestas: X = pablo ; X = alejo ; No Hay varias maneras de encarar el problema de soluciones repetidas.

9 ¿Cómo evitar repeticiones?
1) Usar cláusulas excluyentes puedeSerGroso2(X):- programaBien (X). puedeSerGroso2(X):- esWinner(X), not(programaBien(X)). (¡OJO CON EL ORDEN! primero instanciamos los Winners y luego los filtramos) esGroso2(X):-puedeSerGroso2(X),usaJogging(X).

10 Probemos… ? esGroso2(X). X = pablo ; X = alejo ; No

11 El metapredicado “not”
not: el not es un metapredicado (recibe un predicado cómo parámetro). Falla si P tiene éxito. Tiene éxito si P falla. Pertenece al los aspectos extralógicos del lenguaje.

12 Otra forma de evitar repeticiones
2) usando setOf y member setof(X, p(X), L) devuelve en L todos los valores de X que cumplen con el predicado p. member(X, L) dice si X es miembro de L. esGroso3(X):-setof(Y, puedeSerGroso(Y), L), member(X,L), usaJogging(X).

13 Árboles Sea un árbol binario representado por: nil nodo(X, SI, SD)
Dado append( [ ], L, L). append( [X|XS], L, [X|R]):-append(XS,L,R). donde append(A,B,C) equivale a decir C = A++B Se pide: Obtener una lista con todos los nodos

14 Ejemplo ?- listaNodos(nodo(1, nodo(2,nil,nil), nodo(3,nil,nil)), L).

15 Solución Pensarla unos minutos (¡¡último ejercicio de la clase!!)
listaNodos(nil,[]). listaNodos(nodo(V,SI,SD),[V|Y]): listaNodos(SI, NI), listaNodos(SD, ND), append(NI,ND,Y).


Descargar ppt "Generate & Test. Árboles de derivación. Tratamiento de repeticiones."

Presentaciones similares


Anuncios Google