Seguimos buscando a Arshak. Ayudanos compartiendo!
Encuesta no oficial de docentes
Resultados de la encuesta no oficial de docentes
Probaste el SIGA Helper?

Donar $100 Donar $200 Donar $500 Donar mensualmente


Enviar respuesta 
 
Calificación:
  • 0 votos - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Buscar en el tema
Final PdeP 01/12/2012
Autor Mensaje
Charly_18 Sin conexión
Militante
Sin estado :(
***

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 65
Agradecimientos dados: 9
Agradecimientos: 5 en 1 posts
Registro en: Aug 2013
Mensaje: #1
Final PdeP 01/12/2012 Finales Paradigmas de Programación
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? Confused
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? Confused
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..
01-09-2013 21:46
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
Cloud Sin conexión
Empleado de Fotocopiadora
A punto de estallar.
**

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 42
Agradecimientos dados: 7
Agradecimientos: 7 en 5 posts
Registro en: May 2011
Mensaje: #2
RE: Final PdeP 01/12/2012
Hago una salvedad, que tomenla con pizas porque fue el tipo de razonamiento que hizo que me bochen por "pensar de mas"
Si tenes dos objetos que entienden el mismo mensaje son polimorficos respecto a ese mensaje, no deja de haber polimorfismo solamente porque desde el que los consume no lo aproveche.

Desde este punto de vista, les dije en un final que siempre hay polimorfismo en smalltalk porque todas las clases derivan de alguna superclase y tienen ciertos metodos, en el ejemplo que di yo fue NEW. Me dieron una sarasa asi, pero cada uno tenia metodos de "teadaptasbien" (con nombre diferente en cada animal) diferentes y me preguntaron si habia polimorfismo... les dije "si, todos los animales entienden new"... Clave un 2 like a Sr =P
(Este mensaje fue modificado por última vez en: 12-12-2013 16:21 por Cloud.)
12-12-2013 16:20
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
facundoaita Sin conexión
Militante
Sin estado :(
***

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 71
Agradecimientos dados: 73
Agradecimientos: 63 en 20 posts
Registro en: Sep 2011
Facebook Google+ LinkedIn Twitter YouTube
Mensaje: #3
RE: Final PdeP 01/12/2012
Me parece que lo mejor hubiese sido hacer una clase Tipo1, con el metodo de la jirafa, de ahi heredar a jirafa y a otroanimal (con el metodo que pusiste).
Es codear un poco mas, pero conceptualmente esta prolijo creo yo.

Cloud como les vas a contestar eso? si instancias de distintas clases entienden el mismo mensaje hay polimorfismo. Pero sin ir a lo macro. los animalitos que creaste entienden el mismo y unico mensaje que codeaste? entonces hay polimorfismo. Hiciste todo lo posible para que te bochen jajaja. Suerte para el proximo
13-12-2013 18:09
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
HernanAlbo Sin conexión
Militante
Sin estado :(
***

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 52
Agradecimientos dados: 7
Agradecimientos: 10 en 7 posts
Registro en: Mar 2012
Mensaje: #4
RE: Final PdeP 01/12/2012
me parece que la solucion a funcional es mejor asi

personas=[("juan",["auto","casa"]),("ana",["moto"])]

cantCosas per= length (cosas(busco per))

busco per= find ((per ==). nombrea) personas

find criterio = head . filter criterio

nombrea (n, _) = n
cosas (_, c) = c
18-12-2013 11:59
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
Buscar en el tema
Enviar respuesta 




Usuario(s) navegando en este tema: 1 invitado(s)