UTNianos

Versión completa: [APORTE] [Paradigmas] Enunciado Final 15/02/2014
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Páginas: 1 2
Les dejo el final que tomaron hoy (15/2/14).

Suerte!
Gracias por el aporte ;)
Es final de paradigmas, no? Gracias por el aporte!
Yo lo resolví así: (diganme qué opinan o qué cambiarían, en algunos puntos tengo dudas y los dejo en negrita)

Punto 1:
a) ?-tiene(juan,B).
B=auto;
B=moto.
Porque auto y moto matchean y vuelven cierta la afirmación.
?-cuantosTiene(juan,B).
B=2.
Porque juan tiene auto y moto, findall crea una lista con estos, y es de largo 2.
?-envidia(moncho,juan).
True.
Porque juan tiene auto y moncho no, lo que vuelve verdadera a la regla.
?-tiene(A,3).
Devuelve FRUTA.
Porque el primer argumento no es inversible.
?-cuantosTiene(A,B).
A=juan, B=2;
A=pedro, B=1;
A=moncho, B=2.
?-envidia(A,B).
A=pedro,B=juan;
A=moncho,B=juan.

b)?tieneTodoLoQueTiene(A,B):- forall(tiene(B,X),tiene(A,X)).
(conceptos aplicados ??)


Punto 2:
a)Encapsulamiento:
iii)Porque la capsula está buscando dentro de la colección de estrellas que pertenece a la galaxia.
#Capsula
>>escaparA: unaGalaxia
self viajarA: (unaGalaxia buscarEstrellaHabitable) lugarHabitable.
^self.
#Galaxia
>>buscarEstrellaHabitable
^self estrellas do:[:estrella|estrella sosHabitable].

b)Polimorfismo:
ii)Porque las estrellas tratan indistintamente a los asteroides y planetas al mandarles el mensaje de sosHabitable, en cambio a las estrellas sólo les mandan mensaje las capsulas, asi que el mensaje podria llamarse de otra forma.
c)Errores:
iii)Porque no da errores y así funciona, si la galaxia no tuviera estrellas habitables, ya devuelve error. (???)
d)Declaritividad: iii) (???)

Punto 3:
a)En Haskell, mientras haya alguna estrella habitable, funcionaría, ya que al encontrar la primera habitable, se aplica el head, así que no recorre la lista entera de estrellas.
b)i)viajarA (combustible,posicion) unLugar = combustible - (distanciaA posicion unLugar).
ii)El concepto de asignacion destructiva y efecto de lado, que existen en el paradigma de objetos pero no en el funcional. Esto implica que el metodo realiza un cambio en el codigo despues de ser aplicado, cambiando atributos de un objeto (como en este caso, el combustible y la posicion de la capsula).

c)lugarHabitableDeEstrella galaxia = lugarHabitable (head (filter sosHabitable (estrellas galaxia)))
escaparA capsula galaxia= viajarA capsula (lugarHabitableDeEstrella galaxia)
Buenas, como va?
Pongo solo las que opino diferente, las demás pienso que están bien o me las saltee sin querer, ja.

1)a)
tiene(A,3).
false.
cuantosTiene(A,B).
B = 5.
envidia(A,B).
No sabria exactamente, por el tema del universo cerrado y que no están ligadas las varaibles que entran al not.

b)
tieneTodoLoQueTiene(A,B):- tiene(A,_),tiene(B,_),A\=B,forall(tiene(B,X),tiene(A,X)).

2)
c. errores
Creo que la afirmación de “un buen sistema nunca tira error” no esta bien, porque los errores pueden aparecer siempre, aunque sea un buen sistema.
Elegi la i) porque es verdad que si no hay estrellas habitables la capsula devuelve el objeto que lo llamo, osea self; asi como esta, sea que lo encuentre o no devuelve una instancia de la clase Capsula.

d. declaratividad
No creo que sea la iii) porque esta “preguntando” que si es verdadero, devuelva verdadero; no me gusta mucho eso.
Elegi la i) y pienso que se podría hacer algo asi:
#Estrella
>>sosHabitable
^(self lugaresHabitables) notEmpty
>>lugarHabitable (se podría cambiar el nombre por: primerLugarHabitable)
^(self lugaresHabitables) first
>> lugaresHabitables
lugares sellect:[:lugar|lugar sosHabitable]

3)
b) Yo devolvería la capsula, osea una tupla (combustible,posición), por ejemplo:
viajara (c,p) lugar = (c – distanciaA p lugar,p + distanciaA p lugar)

c) No entiendo bien la pregunta ¿?¿?¿?

Decime, por favor, que opinas porque este sábado rindo.
Saludos,
yo tambien rindo el sabado, asi que tambien tengo dudas. Pero las cosas q agregaste o modificaste (ahora q las repienso) quedan mejor asi, asi que concuerdo.
En el punto 3)c) te pide que agarres la funcion escaparA capsula galaxia que te dan definida en el punto 3 y la mejores, o sea, que la definas vos y quede mas declarativa.
Buenas, en el punto uno tenía varias dudas también y lo que hice es probar en Prolog y bueno acá pongo las respuestas.

Base de conocimiento:
tiene(juan,moto).
tiene(juan,auto).
tiene(pedro,moto).
tiene(moncho,bondi).
tiene(moncho,moto).

cuantosTiene(X,C):-
findall(Y,tiene(X,Y),L),
length(L,C).

envidia(A,B):-
tiene(B,X),
not(tiene(A,X)).


tieneTodoLoQueTieneElOtro(A,B):-
forall(tiene(A,X),tiene(B,X)).


tieneTodoLoQueTiene(A,B):-
tiene(A,_),
tiene(B,_),
A\=B,
forall(tiene(A,X),tiene(B,X)).


ࠎ1 ?- tiene(juan,B).
B = moto ;
B = auto.

2 ?- cuantosTiene(juan,B).
B = 2.

3 ?- envidia(moncho,juan).
true.

4 ?- tiene(A,3).
false.

5 ?- cuantosTiene(A,B).
B = 5.

6 ?- envidia(A,B).
false.

7 ?- tieneTodoLoQueTiene(A,B).
A = pedro,
B = juan ;
A = pedro,
B = juan ;
A = pedro,
B = moncho ;
A = pedro,
B = moncho ;
false.

Los conceptos que pondría en el predicado, serían los generadores (tiene(A,_) y tiene(B,_) para que sea inversible (para que A y B lleguen ligadas en el forall) y poder hacer la consulta existencial
tieneTodoLoQueTiene(A,B).


Saludos.
Gracias por la explicación del 3c.
Consulta sobre el primer punto: porque envidia (A,B) da falso? Se les ocurre algo?
(20-02-2014 16:21)matito escribió: [ -> ]Gracias por la explicación del 3c.
Consulta sobre el primer punto: porque envidia (A,B) da falso? Se les ocurre algo?

CREO, repito, creo, que envidia (A, B) da falso porque, si bien B es inversible (porque tiene un generador), A no lo es, por estar dentro del not (Acordate que la restriccion para que los predicados no sean inversibles son las comparaciones, las operaciones aritmeticas, el operador IS y el operador NOT).

Para que fuese inversible, deberia ser
envidia(A, B):- tiene(B, X), tiene(A, _), not(tiene(A,x)).
(y esta bien porque lo probé en prolog =) ).

lo que yo no entiendo muy bien es por qué cuantosTiene(A,B) devuelve 5. algun alma caritativa que me lo explique?
Lei, asi por arriba.
Aporto algunas cosas.

Una correccion, en el punto A.

envidia(moncho,juan).

No de simplemente true. Da: true;false.

La explicación es muy simple, teniendo:

Cita:envidia(A, B):- tiene(B, X),
not(tiene(A,X)).

Lo primero que hace es unificar B con juan, y X con auto, despues tiene(moncho, auto) da false y por ende el predicado es verdadero y da true. Pero el motor de prolog hace la combinacion de posibilidades, tocas ';' y te da los demas resultados posibles, como cuando haces tiene(juan,X). La otra posibilidad es unificar X con moto, y por ende nos queda:
Cita:envidia(moncho, juan):- tiene(juan, moto),
not(tiene(moncho,moto)).

Como moncho SI tiene moto, el predicado no se cumple y da false. Osea nos devuelve, "true;false."



(21-02-2014 13:25)Asfiaah escribió: [ -> ]lo que yo no entiendo muy bien es por qué cuantosTiene(A,B) devuelve 5. algun alma caritativa que me lo explique?

Es el mismo caso que comente antes, creo que en algun texto lo explican como "explosion combinatoria", aunque en este caso no hace mucha combinatoria.
El punto es que vos le estas diciendo, dame la lista de todas las cosas que son "tenidas" por alguien.
Si no me equivoco para el motor del prolog la evaluacion termina siendo equivalente a esto:

cuantosTiene(_, C):-
findall( Y, tiene(_, Y), L),
length(L,C).

Proque no hay ninguna clausula que referencie el valor de X (underscore aca). Con lo cual lo que estas haciendo es decir que C tiene que haber un X que lo tenga, pero X no me interesa que sea, si es juan, pedro, moncho o tenes un

tiene(juanCarlos(31,tachero,pibes(3)), auto).


Que es un caso que ya se mete con polimorfismo, pero puede dar una idea "didactica"


tiene(juan,auto).
tiene(juan,moto).
tiene(pepe,auto).
tiene(pepe,bici).
tiene(pepe,bondi).
tiene(moncho,moto).

tiene(juanCarlos(31,tachero,pibes(3)), auto).

cuantosTiene(X, C):-
findall( Y, tiene(X, Y), L),
length(L,C).

cuantosTieneAnonim(_, C):-
findall( Y, tiene(_, Y), L),
length(L,C).

envidia(A, B):- tiene(B, X),
not(tiene(A,X)).

tieneTodoLoQueTiene(A, B):-
forall(tiene(A,C), tiene(B,C)).




cuantosTieneAnonim(A,B).

cuantosTiene(A,B).

dan los dos B=7
buenisimo, gracias!
(21-02-2014 13:25)Asfiaah escribió: [ -> ]
(20-02-2014 16:21)matito escribió: [ -> ]Gracias por la explicación del 3c.
Consulta sobre el primer punto: porque envidia (A,B) da falso? Se les ocurre algo?

CREO, repito, creo, que envidia (A, B) da falso porque, si bien B es inversible (porque tiene un generador), A no lo es, por estar dentro del not (Acordate que la restriccion para que los predicados no sean inversibles son las comparaciones, las operaciones aritmeticas, el operador IS y el operador NOT).

Para que fuese inversible, deberia ser
envidia(A, B):- tiene(B, X), tiene(A, _), not(tiene(A,x)).
(y esta bien porque lo probé en prolog =) ).

lo que yo no entiendo muy bien es por qué cuantosTiene(A,B) devuelve 5. algun alma caritativa que me lo explique?

Sobre el tema de "envidia", es un tema lógico (cuac).
Uno lo lee y entiende que es lo que quiere decir, pero pensemos el predicado.
A envidia B si A tiene X y B no tiene X.
Osea, le estamos diciendo, Armame las combinaciones de los BX y de los A que no tienen X... ahora bien... quienes no tienen X no te lo dicen las reglas Confused osea, tus clausuras te dicen que Si tiene,
Por ejemplo, unifiquemos B con juan y X con auto, con queda un AND con los A que no tienen auto... Quienes son los que no tienen auto? osea, todo el resto del universo no tiene auto segun esta lógica, pero, en prolog el universo es solamente lo que tenes escrito ahi, que tiene sentido, con que unificaria A si no?
El tema es que en realidad lo que queres preguntar es:

"Las personas que tienen algo que no es un auto", pero prolog no "adivina" que tiene que elegir de "los que tienen algo" si no se lo decis.

Entonces vos das la solucion correcta, agregar tiene(A,_) antes de la expresion con el not, que significa, que A es alguien que tiene alguna cosa, que no importa cual sea, esos A los tiene que unificar y probar la expresion siguiente. En la expresion siguiente te va a agarrar a todos los A (tipos que tienen algo) posibles, y se va a fijar si hay una clausula tiene(A,X) y hacer el negativo de eso para el AND.

Obviamente si lo corregis y lo codeas lo que te va a dar es medio choto, porque por cada tiene de de los 2 que generan personas A y B se van a hacer todas las combinaciones posibles, dandote resultados repetidos y va a probar cosas sin sentido como la respuesta a envidia(juan,juan) (que igual va a dar false y no lo va a mostrar como respuesta, pero lo va a probar) que es una de las combinaciones posibles.
Entro por la ventana zarpado, eh.


Respecto a lo de envidia, leí así por arriba.

(21-02-2014 14:02)Cloud escribió: [ -> ]Una correccion, en el punto A.

envidia(moncho,juan).

No de simplemente true. Da: true;false.

La explicación es muy simple, teniendo:

Cita:envidia(A, B):- tiene(B, X),
not(tiene(A,X)).

Lo primero que hace es unificar B con juan, y X con auto, despues tiene(moncho, auto) da false y por ende el predicado es verdadero y da true. Pero el motor de prolog hace la combinacion de posibilidades, tocas ';' y te da los demas resultados posibles, como cuando haces tiene(juan,X). La otra posibilidad es unificar X con moto, y por ende nos queda:
Cita:envidia(moncho, juan):- tiene(juan, moto),
not(tiene(moncho,moto)).

Como moncho SI tiene moto, el predicado no se cumple y da false. Osea nos devuelve, "true;false."

MUCHO CUIDADO con esto. Separemos "paradigma" e "implementación", y quedémonos con las ideas importantes.

En cualquier consulta que se haga en lógico, la pregunta SIEMPRE es "¿Existe algún .... tal que ....?", y por eso todas las consultas devuelven true o false. "algún" en el sentido de "por lo menos un". Entonces, si envidia/2 está definido como:

[code="prolog"]envidia(A, B):- tiene(B, X),
not(tiene(A, X)).[/code]

La consulta "?- envidia(moncho, juan)." se leería como "¿Existe algún moncho tal que le tenga envidia a juan?". Y, si traducimos el significado de envidia, podemos decir que "A envidia a B (o 'La envidia relaciona a un A con un B', ponele) si B tiene algún X y, A no tiene a ese X". Como siempre, "algún" es "por lo menos uno": si existe un único X tal que B lo tenga y A no, alcanza. Que SWI Prolog termine tirando false cuando le preguntás si hay algún otro conjunto de valores para los que pasa eso, es anecdótico. Lo importante es que al menos uno hay. Por eso la respuesta es un gran "true".

Ligar las variables y mostrarte los conjuntos de valores que cumplen es otro extra, anecdótico.
Buenas, te cambie el título por uno más descriptivo.

Saludos!
(21-02-2014 19:41)Desert69 escribió: [ -> ]Entro por la ventana zarpado, eh.


Respecto a lo de envidia, leí así por arriba.

(21-02-2014 14:02)Cloud escribió: [ -> ]Una correccion, en el punto A.

envidia(moncho,juan).

No de simplemente true. Da: true;false.

La explicación es muy simple, teniendo:

Cita:envidia(A, B):- tiene(B, X),
not(tiene(A,X)).

Lo primero que hace es unificar B con juan, y X con auto, despues tiene(moncho, auto) da false y por ende el predicado es verdadero y da true. Pero el motor de prolog hace la combinacion de posibilidades, tocas ';' y te da los demas resultados posibles, como cuando haces tiene(juan,X). La otra posibilidad es unificar X con moto, y por ende nos queda:
Cita:envidia(moncho, juan):- tiene(juan, moto),
not(tiene(moncho,moto)).

Como moncho SI tiene moto, el predicado no se cumple y da false. Osea nos devuelve, "true;false."

MUCHO CUIDADO con esto. Separemos "paradigma" e "implementación", y quedémonos con las ideas importantes.

En cualquier consulta que se haga en lógico, la pregunta SIEMPRE es "¿Existe algún .... tal que ....?", y por eso todas las consultas devuelven true o false. "algún" en el sentido de "por lo menos un". Entonces, si envidia/2 está definido como:

[code="prolog"]envidia(A, B):- tiene(B, X),
not(tiene(A, X)).[/code]

La consulta "?- envidia(moncho, juan)." se leería como "¿Existe algún moncho tal que le tenga envidia a juan?". Y, si traducimos el significado de envidia, podemos decir que "A envidia a B (o 'La envidia relaciona a un A con un B', ponele) si B tiene algún X y, A no tiene a ese X". Como siempre, "algún" es "por lo menos uno": si existe un único X tal que B lo tenga y A no, alcanza. Que SWI Prolog termine tirando false cuando le preguntás si hay algún otro conjunto de valores para los que pasa eso, es anecdótico. Lo importante es que al menos uno hay. Por eso la respuesta es un gran "true".

Ligar las variables y mostrarte los conjuntos de valores que cumplen es otro extra, anecdótico.

En los finales te preguntan, "que devuelve la consulta?", y por algunas correcciones en las que estuve me parece que importa la forma en la que se implementa. Igual me parece que es cierto lo que decís, pero yo por las dudas en el examen aclararía el criterio que usé.
Páginas: 1 2
URLs de referencia