UTNianos

Versión completa: Final Paradigmas 10/08/13
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Hola!

Les subo el final de Paradigmas que tomaron hoy. A mi me fue mal, pero me quedé en la corrección, así que pongo las respuestas que nos dieron. Estaría bueno si alguien quiere ampliar algunas un poco más (o si se quedó en la corrección y también anotó algo, por si le pifié en algún nombre...). Gracias!!

1)a). Si, funciona. Polimorfismo sin herencia.
b).
#EMPLEADO >> sueldo
^ categoria importePorHora * self horasTrabajadas
#CONTRATADO >> sueldo
^ horasPorDia * cantDias
#DEPLANTA >> sueldo
^ 200 * horasExtras

c) (Ver adjunto punto1c)

2)a) Vender tiene efecto y se usa para consultar
#CLIENTE
>> vender: producto
deuda := deuda + (producto importe + (1 - self descuento))
>> deuda
^ deuda
>> mayorDeudorLuegoDeVenderle: producto
^ (clientes asSortedCollection: [:a :b | a deuda > b deuda]) first
b) En funcional no se puede porque no hay efecto.

3)1)a) Si no están los paréntesis, no se puede componer.
1)b) minimoQueCumple::Ord a --> (b --> a) --> (b --> Bool) --> [b] --> b
2)a)
- minimoQueCumple (\(_,_,n2) -> n2) (\(_,n1,_) -> esNotaAprobada n1) listaDePrueba
- minimoQueCumple (\(_,n1,n2) -> promedio n1 n2) (\(_,n1,n2) -> esNotaAprobada n1 && esNotaAprobada n2) listaDePrueba

2)b) Es menos declarativa y menos abstracta.
3) Estas habría que mirarlas, porque las discutimos medio rápido, no quiero confundirlos. Así que cualquier comentario es bienvenido =)
Un comentario es que en el final pidieron que se tome el resultado de (N1+N2)/2 como un entero.
1. ?- mejorPromedio(andres,5).
True (porque en el findall busco el promedio de andres).
?- mejorPromedio(andres,Promedio).
Error (porque Promedio no va a estar ligado al momento de hacer P2 > Promedio).
?- mejorPromedio(Alumno,5).
Alumno = andres (como en la base sólo hay un Alumno que tiene Promedio 5, muestra ese resultado).
?- mejorPromedio(Alumno,Promedio).
Alumno = julia
Promedio = 6
3)2). Se puede hacer con un forall, todavía no lo armé, pero cuando lo tenga lo subo.
Buenas, alguien me puede explicar como serian los metodos del codigo 1)c)?

Muchas gracias!
Son lo mismo los métodos, no importan en realidad. El diagrama es la respuesta, hay una relacion de composición de "tipo de empleado" que Forma parte de Empleado.
Creo que "Tipo de Empleado" sería abstracto. Te queda algo asi como un strategy donde el contexto es el #EMPLEADO
Se que es un thread viejo, pero astoy estudiando para darla mañana. Para mi el 2.b se haria asi



segundo (_,a,_) = a
tercero (_,_,a) = a

nuevaFuncion (x:xs) |(esNotaAprobada.segundo) x = min (tercero x) (nuevaFuncion xs)
|otherwise = nuevaFuncion xs




No se si hace falta ponerle un



nuevaFuncion [] = 10



suponiendo que la nota maxima es 10
En el 2)b) yo diria que se puede saber quien es el mayor deudor luego de una venta, pero no podria acumular las deudas de los clientes por no existir efecto de lado. esta OK?
Puede ser que este mal la definicion de minimoQueCumple en el punto 3? la funcion le hace filter al xs de la lista, pero no filtra el primer x, deberia ser = (foldl (menorsegun f) x . filter criterio) (x:xs)...
(20-12-2013 17:19)fede333lago escribió: [ -> ]Puede ser que este mal la definicion de minimoQueCumple en el punto 3? la funcion le hace filter al xs de la lista, pero no filtra el primer x, deberia ser = (foldl (menorsegun f) x . filter criterio) (x:xs)...

A mi tmb me hace ruido... Pero creo que es que no entiendo como está escrito.
Está usando el minimoQuecumple para resolverlo, pero no cacho como...
Funciona asi por lo que veo: vos tenes la lista (x:xs), primero filtra xs por la funcion criterio (booleana), ahi devuelve una lista filtrada, eso lo compone con el foldl (el foldl siempre necesita una funcion, una semilla, y una lista, y le aplica esa funcion a la semilla y a cada elemento de la lista en cada paso, acumuladno el resultado en la semilla). El foldl entonces tiene de funcion a menor segun un criterio, y a esa funcion le pasa a x (la semilla) y a la lista filtrada, el tema es que ahi esta lo que yo digo, x no esta filtrado, solo lo demas. Espero que te haya servido la explicacion jajaja saludos!

Y la definicion con tipos tampoco me cierra, faltan tipos ahi...
(12-12-2013 15:24)facundoaita escribió: [ -> ]En el 2)b) yo diria que se puede saber quien es el mayor deudor luego de una venta, pero no podria acumular las deudas de los clientes por no existir efecto de lado. esta OK?

No, de hecho el efecto de lado sólo existe en el Paradigma de objetos y en ese caso, fijate que acumula las deudas porque las tiene en cuenta antes de re-asignarla al objeto(variable) deuda.

Ahora, respecto del punto 1 me pregunto si yo propongo la siguiente solución, sigue siendo válida? Porque la que según puso takuma1985 no funcionaria (o al menos no me cuadran los metodos sueldo de las clases Contratado y DePlanta) huh
(26-02-2014 23:10)reLlene escribió: [ -> ]
(12-12-2013 15:24)facundoaita escribió: [ -> ]En el 2)b) yo diria que se puede saber quien es el mayor deudor luego de una venta, pero no podria acumular las deudas de los clientes por no existir efecto de lado. esta OK?

No, de hecho el efecto de lado sólo existe en el Paradigma de objetos y en ese caso, fijate que acumula las deudas porque las tiene en cuenta antes de re-asignarla al objeto(variable) deuda.

Ahora, respecto del punto 1 me pregunto si yo propongo la siguiente solución, sigue siendo válida? Porque la que según puso takuma1985 no funcionaria (o al menos no me cuadran los metodos sueldo de las clases Contratado y DePlanta) huh

Ojo con la solución que estás proponiendo... estás queriendo asignar un objeto a otro objeto y no a una variable.


self tipoDeEmpleado := DePlanta new


la asignación va sólo a las variables:

tipoDeEmpleado := DePlanta new

o bien seteás el valor por accessor:


self tipoDeEmpleado: DePlanta new


Este es un error típico en los parciales, me acuerdo que a mí me lo corrigieron 1923891283 veces =D

Por el resto, está bien.
bárbaro!! i get it thumbup3 gracias Ichiluk
Buenas, perdon que me sume a este final pero tengo una duda existencial y el final que busco no esta, en un final se tomo este ejercicio:

En un programa Prolog se escribió el siguiente predicado:
esMenor(X,Y):-X<Y.
a. ¿Qué hace?
b. Este predicado permite que dado un número como segundo argumento, se obtengan
todos los números naturales menores que él. (V o F Justificar)
c. Si la afirmación anterior es verdadera, mostrar un ejemplo de consulta con 10 posibles
respuestas. En caso contrario, modificar el predicado para que la afirmarción del punto
anterior sea correcta.

Entiendo que seria falso dado que no tengo forma de ligar la variable X a ningun valor.

Ahora, como modifico esa expresion en logico para demostrar que sea correcta?

Gracias!!!
verito: tambien rindo mañana, fijate si te sirve esto.
Basicamente el problema es que X llega sin unificar con nada, tenes que generar posibles valores enteros para X. Buscando como joraca hacer esto (por no vi ninguna funcion isIntenger(X) o algo por el estilo llegue a esta pagina: http://stackoverflow.com/questions/19979...f-integer.
Ahi te dicen que podes usar la funcion between. Agregandola para generar valores de X hasta 10 quedo esto, funciona:
esMenor(X,Y):- between(1,10,X), X<Y.

Suerte
(28-02-2014 03:20)fede333lago escribió: [ -> ]verito: tambien rindo mañana, fijate si te sirve esto.
Basicamente el problema es que X llega sin unificar con nada, tenes que generar posibles valores enteros para X. Buscando como joraca hacer esto (por no vi ninguna funcion isIntenger(X) o algo por el estilo llegue a esta pagina: http://stackoverflow.com/questions/19979...f-integer.
Ahi te dicen que podes usar la funcion between. Agregandola para generar valores de X hasta 10 quedo esto, funciona:
esMenor(X,Y):- between(1,10,X), X<Y.

Suerte

Me parece que con un predicado recursivo no demasiado complicado pordrías relacionar un numero N con una lista de los numeros enteros de 0 hasta N. no les parece? yo te diria que el between no lo tires en el final.
Yo tiré esto para probar y "andó".



enterosHasta(1,[1]).
enterosHasta(N,[N|T]):-
N > 1,
X is N-1,
enterosHasta(X, T).

esMenor(X,Y):-
enterosHasta(Y,L),
member(X, L).




Obviamente no puede ser NUNCA totalmente inversible.

En stackoverflow en lugar de hacer una lista lo manejan con todos numeros menores como diferentes resultados.
Link a la fuente.


range(Low, Low, High).
range(Out,Low,High) :- NewLow is Low+1, NewLow =< High, range(Out, NewLow, High).


Pero el compilador chilla con unos warnings de "Singleton Value: High"... no es como lo haría yo igual.
URLs de referencia