prolog (2da parte)

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

Upload: xenos

Post on 06-Jan-2016

21 views

Category:

Documents


0 download

DESCRIPTION

Prolog (2da parte). Generate & Test. Árboles de derivación. Tratamiento de repeticiones. 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. - PowerPoint PPT Presentation

TRANSCRIPT

Prolog (2da parte)Prolog (2da parte)►Generate & Test. Generate & Test.

►Árboles de derivación.Árboles de derivación.►Tratamiento de repeticiones.Tratamiento de repeticiones.

Generar y TestearGenerar y Testear

La intuición es aprovechar el orden de La intuición es aprovechar el orden de evaluación de Prolog, para definir la evaluación de Prolog, para definir la siguiente estrategia para resolver siguiente estrategia para resolver problemas:problemas:

1) Generar todas las posibles 1) Generar todas las posibles respuestas.respuestas.

2) Filtrar las respuestas obtenidas en 1, 2) Filtrar las respuestas obtenidas en 1, obteniendo la respuesta buscada. obteniendo la respuesta buscada.

Esquema generalEsquema general

►Un predicado que utiliza generate & Un predicado que utiliza generate & test consta de dos partes:test consta de dos partes:

predicado(x) :- generate(x), test(X)predicado(x) :- generate(x), test(X)

►““generate” instanciará la variable x.generate” instanciará la variable x.►““test” verificará si x es o no una test” verificará si x es o no una

solución válida, puede asumir que la solución válida, puede asumir que la variable está instanciada.variable está instanciada.

Un generadorUn generador

El predicado El predicado entre(+X, +Y, -Z) entre(+X, +Y, -Z) devuelve devuelve todos los Z entre X e Y.todos los Z entre X e Y.

Pensarlo unos minutos…Pensarlo unos minutos…

entre(X,Y,X):- X=<Y.entre(X,Y,X):- X=<Y.

entre(X,Y,Z):- X<Y, W is X+1, entre(W,Y,Z).entre(X,Y,Z):- X<Y, W is X+1, entre(W,Y,Z).

EjercicioEjercicio

Generar los pares menores a X. Generar los pares menores a X.

Nuevamente unos minutos para pensarlo, Nuevamente unos minutos para pensarlo, con la siguiente ayudita:con la siguiente ayudita:

par(X):- 0 is X mod 2.par(X):- 0 is X mod 2.

paresMenoresA(X, Y) :- entre(0,X,Y), par(Y).paresMenoresA(X, Y) :- entre(0,X,Y), par(Y).

►entreentre es el encargado de ir generando es el encargado de ir generando todos los números menores a X, luego todos los números menores a X, luego parpar actúa como filtro. actúa como filtro.

Arboles de DerivaciónArboles de Derivación

[Ver Recorrido.ppt][Ver Recorrido.ppt]

Soluciones repetidas…Soluciones repetidas…usaJogging(pablo).usaJogging(pablo).

usaJogging(alejo).usaJogging(alejo).

programaBien(pablo).programaBien(pablo).

programaBien(diego).programaBien(diego).

programaBien(alejo).programaBien(alejo).

esWinner(pablo).esWinner(pablo).

esWinner(diego).esWinner(diego).

puedeSerGroso(X):- programaBien(X).puedeSerGroso(X):- programaBien(X).

puedeSerGroso(X):- esWinner(X).puedeSerGroso(X):- esWinner(X).

esGroso(X):- puedeSerGroso(X),usaJogging(X).esGroso(X):- puedeSerGroso(X),usaJogging(X).

ConsultaConsultaConsulta… Consulta… ? esGroso(X).? esGroso(X).

Pensar unos minutos qué respuestas daría y en Pensar unos minutos qué respuestas daría y en qué orden.qué orden.

Respuestas:Respuestas:X = pablo ;X = pablo ;X = alejo ;X = alejo ;X = pablo ;X = pablo ;NoNo

► Hay varias maneras de encarar el problema de Hay varias maneras de encarar el problema de soluciones repetidas.soluciones repetidas.

¿Cómo evitar repeticiones?¿Cómo evitar repeticiones?

1) Usar cláusulas excluyentes1) Usar cláusulas excluyentes

puedeSerGroso2(X):- programaBien (X).puedeSerGroso2(X):- programaBien (X).

puedeSerGroso2(X):- esWinner(X), puedeSerGroso2(X):- esWinner(X), notnot((programaBien(X)programaBien(X)))..

(¡OJO CON EL ORDEN! primero instanciamos los Winners y luego (¡OJO CON EL ORDEN! primero instanciamos los Winners y luego los filtramos)los filtramos)

esGroso2(X):-puedeSerGroso2(X),usaJogging(X).esGroso2(X):-puedeSerGroso2(X),usaJogging(X).

Probemos…Probemos…

? esGroso2(X).? esGroso2(X).

X = pablo ;X = pablo ;

X = alejo ;X = alejo ;

NoNo

El metapredicado “not”El metapredicado “not”

►notnot: el not es un metapredicado : el not es un metapredicado (recibe un predicado cómo (recibe un predicado cómo parámetro). parámetro).

►Falla si P tiene éxito. Falla si P tiene éxito. ►Tiene éxito si P falla. Tiene éxito si P falla. ►Pertenece al los aspectos extralógicos Pertenece al los aspectos extralógicos

del lenguaje.del lenguaje.

Otra forma de evitar Otra forma de evitar repeticionesrepeticiones

2) usando setOf y member2) usando setOf y member

setof(X, p(X), L)setof(X, p(X), L) devuelve en L todos devuelve en L todos los valores de X que cumplen con los valores de X que cumplen con el predicado p.el predicado p.

member(X, L)member(X, L) dice si X es miembro de L. dice si X es miembro de L.

esGroso3(X):-esGroso3(X):-setofsetof(Y, puedeSerGroso(Y), L)(Y, puedeSerGroso(Y), L),, member(X,L), member(X,L), usaJogging(X). usaJogging(X).

ÁrbolesÁrboles

Sea un árbol binario representado por: Sea un árbol binario representado por: ► nilnil► nodo(X, SI, SD) nodo(X, SI, SD) DadoDadoappend( [ ], L, L).append( [ ], L, L).append( [X|XS], L, [X|R]):-append(XS,L,R).append( [X|XS], L, [X|R]):-append(XS,L,R).

donde append(A,B,C) equivale a decir C = A++Bdonde append(A,B,C) equivale a decir C = A++B

Se pide:Se pide: Obtener una lista con todos los nodos Obtener una lista con todos los nodos

EjemploEjemplo

?- listaNodos(nodo(1,?- listaNodos(nodo(1,

nodo(2,nil,nil),nodo(2,nil,nil),

nodo(3,nil,nil)),nodo(3,nil,nil)),

L).L).

L = [1,2,3];L = [1,2,3];

No.No.

2 3

1

SoluciónSolución

Pensarla unos minutos (¡¡último ejercicio Pensarla unos minutos (¡¡último ejercicio de la clase!!)de la clase!!)

listaNodos(nil,[]).listaNodos(nil,[]).

listaNodos(nodo(V,SI,SD),[V|Y]):-listaNodos(nodo(V,SI,SD),[V|Y]):- listaNodos(SI, NI), listaNodos(SI, NI), listaNodos(SD, ND), listaNodos(SD, ND), append(NI,ND,Y). append(NI,ND,Y).