Hola que tal! voy a realizar la resolución del
Final-Paradigmas-2012-12-01
No garantizo que este bien resuelto y además también tengo un par de dudas, agradecería que colaboren
Saludos!
Ejercicio 1
tiene(juan, auto).
tiene(ana, moto).
tiene(juan, casa).
........... ...........
cantidadDeCosas(Persona, Cantidad):- findall(Cosa, tiene(Persona, Cosa), Cosas), length(Cosas, Cantidad).
1)
%teniendo en cuenta que solo hay esa 3 cláusulas del predicado tiene\2
?- CantidadDeCosas(juan, 2)
yes
?- CantidadDeCosas(juan, Cant)
Cant = 2
?- CantidadDeCosas(Persona, 2)
No
% Lo que esperaríamos acá es que diga Persona = Juan, pero al NO ser un predicado inservible puede comportarse de manera %diferente a la esperada, al no ligarse persona con un individuo antes del findall el predicado tiene\2 del findall matchea con %todas las personas y no con cada una por separado. Entonces el resultado de length(Cosas, Cantidad), Cantidad es 3 distinto de %2, entonces el resultado de CantidadDeCosas es False..
?- CantidadDeCosas(Persona, Cant)
Cant = 3
%Algo parecido, se comporta de manera extraña..
%Acá esperaríamos Persona = juan y Cant = 2, Persona = ana y Cant = 1..
%Al no estar ligada persona antes del findal obtiene la cantidad de todos y no de cada una..
2)
Se le puede implementar una mejora para que sea inversible, hacer que la persona llegue ligada al findall, agrego predicado tiene\2 antes del findall, queda asi:
CantidadDeCosas(Persona, Cantidad):- tiene(Persona, _), findall(Cosa, tiene(Persona, Cosa), Cosas), length(Cosas, Cantidad).
¿¿¿¿ ????
No sucedería ¿? que el tiene\2 antes del findall primero se liga con juan, luego se obtiene la cant de cosas que tiene, luego con ana y se obtiene la cantidad de cosas de ana... y luego devuelta con juan, es decir, tiene\2 recorre secuencialmente todos los predicados tiene\2 repitiendo al individuo y volviendo a calcular la cant de cosas de juan??
3)
Bueno esto lo imagine asi..
La inversibilidad es exclusiva del paradigma lógico, permite hacer múltiples consultas con un mismo predicado mientras que una función devuelve un solo valor, entonces para suplir la ausencia de inversibilidad y hacer el equivalente en el paradigma funcional voy a necesitar mas de una función
Realizo las siguientes modificaciones:
--personas::[persona]
--persona::(nombre, [cosas])
juan = ("juan", ["auto","casa"])
ana = ("ana", ["moto"])
personas = [juan, ana]
--cantidadDeCosas(juan, Cant)
cantDeCosasPersona (_, cosas) = length cosas
--cantidadDeCosas(juan, 2)
cantDeCosasCorrectaPersona unaPersona unaCant = cantDeCosasPersona unaPersona == unaCant
--cantidadDeCosas(Persona, 2)
listaDePersonasConCantCosasDeter personas unaCant = filter ((==unaCant).cantDeCosasPersonas) personas
--cantidadDeCosas(Persona, Cant)
listaDeCosasPersonas personas = [(fst unaPersona, cantDeCosasPersona unaPersona) | unaPersona <-- personas]
Ejercicio 2
1)
CON PLOMORFISMO
Hay polmorfismo porque hay objetos que entienden los mismos mensajes y un tercero los usa indistintamente..
#Zoo
>>TodosTusAnimalesSeAdaptanBien
^animales allSatisfy:[:unAnimal | unAnimal teAdaptasBien]
#Mono
>>TeAdaptasBien
^self comidaNutritiva
#Jirafa
>>TeAdaptasBien
^(peso>500) & self comidaNatural
#Leon
>>TeAdaptasBien
^self comidaNatural
SIN POLIMORFISMO
No hay polimorfismo porque hay objetos que entienden los mismos mensajes y un tercero que los usa PERO NO indistintamente, discrimina si son monos, jirafas o leones..... no le da igual..
#Zoo
>>TodosTusAnimalesSeAdaptanBien
^monos allSatisfy:[:unMono | unMono teAdaptasBien]
^jirafass allSatisfy:[:unaJirafa | unaJirafa teAdaptasBien]
^leones allSatisfy:[:unLeon | unLeon teAdaptasBien]
"el resto igual.."
"también podría usar un if preguntando que tipo de animal es hardcodeando un string o/y con mensajes con selectores distintos"
Con Polimorfismo
Ventajas: tienen que ver con manentibilidad y extensibilidad, por ej si queremos agregar un objeto nuevo solo basta con agregarle el el mensaje que entienden los otros objetos polimórficos, con su correspondiente comportamiento, sin tener que modificar en nada a ese tercero que lo usa. (sino habría polimorfismo *1)
Desventaja: la desventaja es que al no discriminar, tenes que pasar por todos los objetos, teniendo que tener el mensaje definido en todos los objetos para que no de error de que no entiende el msje (por lo menos msje con método vacío para que no de error sería una solución). Por ej si agregamos #CucarachasDeLaIndia no interesa al #Zoo saber si esta bien adaptada (es una cucaracha!!..) pero si o si tendríamos que definir el mensaje. (sino habría polimorfismo *2)
Sin Polimorfismo
Ventajas: (*2) Si agrego un nuevo animal lo puedo agregar independientemente sin tener la obligación de definirle un msje que sea denominador común de otros objetos..
Desventaja: (*1) para agregar un nuevo objeto a demás de "tocar" al nuevo hay que "tocar" a el/los que lo usa/n
2)
Lo que evita la duplicación de código es la HERENCIA
Para el caso de #OtroAnimal tiene código en común con #Jirafa, es decir tienen algún comportamiento similar
una posible solución sería:
"#OtroAnimal es subclase de la super clase #Jirafa"
#OtroAnimal
>>teAdaptasBien
^super teAdaptasBien & self vacunado
¿¿¿¿ ????
Creo que de esta manera hay un error conceptual porque estaría diciendo que otroAnimal es del tipo jirafa
entonces teniendo en cuenta mi duda otra solución sería:
#Jirafa y #otroAnnimal heredan de una clase común llamada #Animal con el msje teAdaptasBien y #otroAnimal también con el msje teAdaptasBien, pero en el caso de la clase #Jirafa tendría que tener algún mensaje o variable para que no sea una "caja vacía"
3)
%relaciona zoo con animal que tiene
%functores mono("comida"), jirafa("peso", "comida"), leon("comida")
tiene(zooBerlin, mono("banana")).
tiene(zooBerlin, jirafa(550, "mani")).
tiene(zooBerlin, leon("cebra")).
..... ... . . . ...
%un zoo es magnifico si todos sus animales les sucede que se adaptan bien
esMagnifico(Zoo):- forall(tiene(Zoo, Animal), seAdaptaBien(Animal)).
seAdaptaBien(mono(Comida)):- esNutritiva(Comida).
seAdaptaBien(jirafa(Peso, Comida)):- Peso>500, esBalanceada(Comida).
seAdaptaBien( leon(Comida)):- esNatural(Comida).
%el predicado polimórfico es seAdaptaBien\2 que puede tratar indistintamente a un mono, jirafa, leon y quien lo aprovecha es el %forall que no tiene que hacer distinciones sobre los tipos de animales
%Hay orden superior porque el forall recibe como parámetro 2 predicados
%La ventaja es que hay un predicado SeAdaptaBien\2 que puede ser usado en forma genérica (polimórfico) tanto para monos, %jirafas y leones y con un solo forall con ese predicado cumplimos el requerimiento
Ejercicio 3
1)
hacen los 3 lo mismo: dada una lista (col en objetos..) devuelve una lista igual hasta la mitad de los elementos
¿¿¿¿ ????
El índice en una lista de funcional, lógico y objetos comienzan todos en 0, o todos en 1, o algunos en 0 y otros en 1?
take 2 [4,5,6,7]
[4,5,6] o [4,5] ??
takelist([4,5,6,7], 2 [4,5,6]) true o false??
2)
- El método motodoLoco es para colecciones con subíndices
- funcionLoca:: [a] --> [a]
- predicadoLoco\2 relaciona 2 variables o incógnitas que pueden estar ligadas a individuos del tipo compuesto, en este caso listas con cualquier tipo de contenido
3)
datos:= #(1,2,3,4)
datos metodoLoco
--> (1,2)
datos:= #(a,b,c,d)
datos metodoLoco
--> (a,b)
>funcionLoca [(a,b),(b,c),(c,d),(d,e)]
[(a,b),(b,c)]
>funcionLoca [1,2,3,4]
[1,2]
?- predicadoLoco ([(a,b),(b,c),(c,d),(d,e)], 2, L)
L = [(a,b),(b,c)]
?- predicadoLoco ([1,2,3,4], 2, L)
L= [1,2]
4)
Creería que en funcionLoca y predicadoLoco\2 porque pueden recibir listas de cualquier tipo de datos o contenido, las pueden tratar indistintamente y eso sería la una ventaja..
¿¿¿¿ ????
NO ME CIERRA MUCHO ESTE PUNTO..
Bueno eso fue todo,
Les paso los ejercicios que me quede con dudas para haber si alguien los puede resolver
gracias, saludos!
---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----
EJECICIO 1
- pto 2
No sucedería ¿? que el tiene\2 antes del findall primero se liga con juan, luego se obtiene la cant de cosas que tiene, luego con ana y se obtiene la cantidad de cosas de ana... y luego devuelta con juan, es decir, tiene\2 recorre secuencialmente todos los predicados tiene\2 repitiendo al individuo y volviendo a calcular la cant de cosas de juan??
EJECICIO 2
- pto 2
Creo que de esta manera hay un error conceptual porque estaría diciendo que otroAnimal es del tipo jirafa
EJECICIO 3
- pto 1
El índice en una lista de funcional, lógico y objetos comienzan todos en 0, o todos en 1, o algunos en 0 y otros en 1?
take 2 [4,5,6,7]
[4,5,6] o [4,5] ??
takelist([4,5,6,7], 2 [4,5,6]) true o false??
- pto 4
No me cierra mucho..