UTNianos

Versión completa: [APORTE] Final de Paradigmas 18-07-15 (RESUELTO)
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Link del final:

https://docs.google.com/document/d/1czeo...oilgRs/pub

Resolución:

A)1)

Ver Diagrama de Clases.png
EDITO: Está mal el diagrama, por un error de copypaste repetí una clase, la cual yo llame ConNiebla
[attachment=11287]


#Día
>> temperaturaBase
^(tRef * 1.15 + tMod sqrt)/ tInf.

>>temperatura
^tipo temperatura: (self temperaturaBase).

#Nublado
>>temperatura: base
^base*cantNubes.

#Normal
>>temperatura: base
^base.

#ConNiebla
>>temperatura:base
^base – cantNiebla.

#Mes
>> temperaturaPromedio
^(días sum: [:dia | dia temperatura]) / (días size).

La solución aquí propuesta es mejor en términos de polimorfismo al crear nuevas clases para los tipos de días, delegando de esta manera el cálculo de la temperatura a cada tipo de día. Esto permite un mayor encapsulamiento para el cálculo de la temperatura.

2) En un principio si, ya que permite delegar el cálculo de la temperatura en cada uno de los tipos de día, aumentando así la declaratividad de la solución. En el caso que yo propuse la solución es mejorada utilizando composición, ya que, de esa manera, un día puede pasar de estar normal a estar nublado.

3) La solución propuesta por el ejercicio tiene poca declaratividad ya que (por ejemplo, en el caso de temperaturaPromedio) el código muestra más COMO se realiza el cálculo. En la solución que propuse yo, es más fácil entender QUE es lo que se quiere obtener simplificando el código en una sola línea. A nivel expresividad, la solución propuesta por el ejercicio utiliza términos como tot, cant, d, entre otros, que restan expresividad en la solución. Esos términos son eliminados en la nueva propuesta ya que no son necesarios y se ve mejorada la expresividad con términos más claros.

4) Si, lo permite.
nublado := Nublado new.
nublado inicializar.
unDia tipo:nublado.

B)1) primerMayorQue valor criterio = (>valor).head.filter criterio
f = primerMayorQue 40 even
g = primerMayorQue 38.5 elevada
h = primerMayorQue “perez” ((==’s’).last)

2) El concepto es orden superior. Al utilizar una función de orden superior como primerMayorQue (que utiliza las funciones como head, filter y (>)), se permite evitar la lógica repetida, simplificando la solución y delegando la lógica en una única función.

3) Se realizó directamente en el punto 1.

C)1) Deben existir los siguientes predicados en la base de conocimientos:
- trabajaPara/2: Debe ser inversible respecto de la Persona.
- esMafioso/1.
- encargo/3: Debe ser inversible respecto de la Persona.
- pareja/2.
- personaje/2.

2) Si, ya que se utiliza un mismo predicado para tratar los distintos tipos de encargos. De esta manera, si se agregan más encargos, no es necesario generar nuevos predicados para tratarlos.

3) Si, es posible.

cuidador(Personaje):-
encargo(_,Personaje,_),
forall(encargo(_,Personaje,Encargo), Encargo = cuidar(_)).



Cualquier duda pregunten!!
En el mes, te faltó dividir por días size, ya que esta pidiendo el promedio de las temperaturas
(30-07-2015 21:47)LAUS escribió: [ -> ]En el mes, te faltó dividir por días size, ya que esta pidiendo el promedio de las temperaturas

Eso me pasa por pasarlo rápido jajaja. Bien ahí, ya lo corregí. Alguna otra cosa más que le veas decime.
saca el spam pibe, nadie se le ocurriría entrar ahí, el resto se agradece
Buenas creo q en la solucion del punto 4 no pones como se cambia de normal a nublado, solo pones nublado
(25-09-2015 11:14)danila escribió: [ -> ]Buenas creo q en la solucion del punto 4 no pones como se cambia de normal a nublado, solo pones nublado

Claro que si lo hago. Le modifiqué el atributo tipo a un objeto de la clase Nublado, instanciándolo previamente (según el ejercicio antes el atributo tipo era un objeto de la clase Normal).

El objetivo de ese ejercicio es ver si sabes qué atributo hay que modificar para cambiar de Normal a Nublado. Ponele que está implícito que se instanció unDía y un objeto normal de la clase Normal y unDía tipo: normal. Agregar eso lo veo de más ya que lo que se pide es lo otro.

Resumiendo, la sentencia que hace el cambio es unDia tipo:nublado, pero también es necesario instanciar previamente un objeto de clase Nublado para hacer el cambio.

Saludos.
Gracias lo entendí =)
Agregaría lo siguiente, respecto al punto C)

1) Ser inversible,
o ser un hecho, como por ejemplo: enProblemas(butch).


2) En el 3° argumento del predicado encargo/3 se usan functores que denotan el polimorfismo dentro del Paradigma Lógico.
Y así se puedan usar los encargos indistintamente (éstos y otros agregados en un futuro).
encargo(_,_,cuidar(Cuidado))
encargo(_,_,buscar(Buscado,_))


3) Si, es posible usando forall/2 (predicado de orden superior)

cuidador(Personaje):- encargo(_,Personaje,_),
forall(encargo(_,Personaje,Encargo), esCuidado(Encargo)).


esCuidado(cuidar(_)) :- encargo(_,_,cuidar(_))


encargo(_,Personaje,_)
Actúa de predicado "generador", para que la variable "Personaje" ya entre ligada/unificado al forall.
Y el predicado ya queda inversible.
(09-12-2015 19:10)dalepapa escribió: [ -> ]3) Si, es posible usando forall/2 (predicado de orden superior)

cuidador(Personaje):- encargo(_,Personaje,_),
forall(encargo(_,Personaje,Encargo), esCuidado(Encargo)).


esCuidado(cuidar(_)) :- encargo(_,_,cuidar(_))


encargo(_,Personaje,_)
Actúa de predicado "generador", para que la variable "Personaje" ya entre ligada/unificado al forall.
Y el predicado ya queda inversible.

Creo que asi tambien funcionaria:


cuidador(Personaje):- encargo(_,Personaje,_), forall(encargo(_,Personaje,Encargo),encargoCuidado(Encargo)).

encargoCuidado(cuidar(_)).
(09-12-2015 19:10)dalepapa escribió: [ -> ]Agregaría lo siguiente, respecto al punto C)

1) Ser inversible,
o ser un hecho, como por ejemplo: enProblemas(butch).


2) En el 3° argumento del predicado encargo/3 se usan functores que denotan el polimorfismo dentro del Paradigma Lógico.
Y así se puedan usar los encargos indistintamente (éstos y otros agregados en un futuro).
encargo(_,_,cuidar(Cuidado))
encargo(_,_,buscar(Buscado,_))


3) Si, es posible usando forall/2 (predicado de orden superior)

cuidador(Personaje):- encargo(_,Personaje,_),
forall(encargo(_,Personaje,Encargo), esCuidado(Encargo)).


esCuidado(cuidar(_)) :- encargo(_,_,cuidar(_))


encargo(_,Personaje,_)
Actúa de predicado "generador", para que la variable "Personaje" ya entre ligada/unificado al forall.
Y el predicado ya queda inversible.

En realidad dijiste lo mismo con otras palabras, pero en el punto 1, no aclarás qué predicado decis que debe ser inversible.
Punto C)
Me refiero a que todos esos predicados anteriores....deben ser inversibles o deben ser hechos.
Buenas,
Subo el enunciado..por las dudas, que desaparezca en un futuro...

Saludos!
Gracias, muy bueno!

thumbup3
Hola, ¿Porque se utiliza una clase abstracta? ¿No puede heredar Normal, Nublado, Niebla de Dia directamente? Gracias por la ayuda.
URLs de referencia