UTNianos

Versión completa: Duda con TP de Lógico
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Mande al grupo de PdeP pero no me contestaron aun...asi que pregunto acá.



% Los beneficios son functores:confort(descripcion), confort(descripcion, caracteristica), dispersion(descripcion), economico(descripcion, monto).
gozaBeneficio(carl, confort(sillon)).
gozaBeneficio(lenny, confort(sillon)).
gozaBeneficio(lenny, confort(estacionamiento, techado)).
gozaBeneficio(carl, confort(estacionamiento, libre)).
gozaBeneficio(clark, confort(viajeSinTrafico)).
gozaBeneficio(clark, dispersion(fiestas)).
gozaBeneficio(burns, dispersion(fiestas)).
gozaBeneficio(lenny, economico(descuento, 500)).




Definir el predicado tipoDeBeneficioMasAprovechado/1, permite conocer el tipo de beneficio más aprovechado por los participantes de la logia.
?- tipoDeBeneficioMasAprovechado(Cual)
Cual = confort.


Tengo 2 preguntas:
1- Los beneficios son confort, dispersion, economico y NINGUNO mas? O tengo que asumir que se podrian agregar mas en un futuro?
2- En cualquiera de los 2 casos, alguna idea de como puedo ver cual es el confort que es mas aprovechado, es decir, el que se repite mas veces?

Por las dudas, el TP completo (es un parcial viejo): https://docs.google.com/document/d/1cf4e...=drive_web

Gracias de antemano.
1) Si, en este momento son esos. Podrías considerar armar algo más genérico, pero no te pueden decir nada si no lo hacés (salvo que la consigna sea hacerlo genérico).

2) Podés armar un predicado que sea verdadero cuando sea X beneficio, por ejemplo:

esDispersion(dispersion(_)).

Y armás una lista con todas las personas que tengan un beneficio (por ejemplo, dispersion) determinado, y despues comparás la cantidad de personas que tiene cada beneficio. Aquel beneficio que tenga más personas es el más aprovechado.

off: por ahí es medio rebuscada, es una solución de tantas otras que pueden diseñarse.
No es mejor


beneficio(confort(_),confort).
beneficio(confort(_,_),confort).
beneficio(dispersion(_),dispersion).
beneficio(economico(_,_), economico).

?
En mi grupo lo hicimos así:

tipoDeBeneficioMasAprovechado(Tipo):- aprovechamientoBeneficio(Tipo, Cantidad),
forall(aprovechamientoBeneficio(_,Cantidad2), Cantidad>=Cantidad2).

aprovechamientoBeneficio(Tipo, Cantidad):- tipoBeneficio(_,Tipo),
findall(Tipo, (gozaBeneficio(_,Beneficio), tipoBeneficio(Beneficio,Tipo)) , Beneficios),
length(Beneficios, Cantidad).

tipoBeneficio(economico(_,_), economico).
tipoBeneficio(confort(_), confort).
tipoBeneficio(confort(_,_), confort).
tipoBeneficio(dispersion(_), dispersion).
De hecho, lo es. Es por eso que decía que podían haber otras soluciones, pasa que estoy con la cabeza en otra cosa jajajaja. En conclusión, es mejor usar el predicado que definió Anirus!
(01-07-2013 21:40)rm1216 escribió: [ -> ]En mi grupo lo hicimos así:

tipoDeBeneficioMasAprovechado(Tipo):- aprovechamientoBeneficio(Tipo, Cantidad),
forall(aprovechamientoBeneficio(_,Cantidad2), Cantidad>=Cantidad2).

aprovechamientoBeneficio(Tipo, Cantidad):- tipoBeneficio(_,Tipo),
findall(Tipo, (gozaBeneficio(_,Beneficio), tipoBeneficio(Beneficio,Tipo)) , Beneficios),
length(Beneficios, Cantidad).

tipoBeneficio(economico(_,_), economico).
tipoBeneficio(confort(_), confort).
tipoBeneficio(confort(_,_), confort).
tipoBeneficio(dispersion(_), dispersion).

Off-topic:

No me acordaba que existía length xD
(01-07-2013 21:15)Anirus escribió: [ -> ]No es mejor


beneficio(confort(_),confort).
beneficio(confort(_,_),confort).
beneficio(dispersion(_),dispersion).
beneficio(economico(_,_), economico).

?

Existe alguna manera de sacar el nombre del functor por Pattern Matching?Porque si agregamos mas hechos/datos no funcionaria del todo bien...
Intente hacer algo generico para mi TP, pero me salian errores por todos lados. Me quede con:


nombreSistOp(windowsPhone, windowsPhone).
nombreSistOp(nokiaBelle, nokiaBelle).
nombreSistOp((android(_,_)),android).
nombreSistOp((symbian(_)),symbian).
nombreSistOp((iOS(_)),iOS).

Encontré algo =D
http://eden.rutgers.edu/~zhennany/cs314/handout4.pdf
functor(Functor, Nombre, Aridad)


tipoBeneficio(Beneficio,Tipo):-gozaBeneficio(_,Beneficio),functor(Beneficio,Tipo,_).


Que buena onda. Pero si los resolvemos sin usar functor/3 no nos bochan, no?
En mi clase ni en los apuntes vi ese predicado xD
(02-07-2013 16:28)Nikod11 escribió: [ -> ]Pero si los resolvemos sin usar functor/3 no nos bochan, no?

No. Salvo que el enunciado dijera que no se puede hacer de la forma en que lo hiciste y que hay que investigar cómo hacerlo genérico. Posiblemente la idea era que fuera de la forma en que lo hiciste para que vean cómo usar pattern matching con functores de distinta aridad.
Genial, mil gracias a todos. Quedo joya el 6
Me falta nada mas el punto 4, que es el siguiente. Si alguno tiene tiempo y lo puede ver le agradeceria muchisimo!

4) Definir el predicado masEnvidioso/1, permite conocer los nombres de las personas más envidiosas. (Nota: definirlo sin usar forall/2).



%Mi version con forall:
masEnvidioso(Persona):-
esUnaPersona(Persona), cuantosEnvidia(Persona, Cantidad),
forall((esUnaPersona(Otro), Otro \= Persona, cuantosEnvidia(Otro, OtraCantidad)), Cantidad > OtraCantidad).
cuantosEnvidia(Persona, Cantidad):-
esUnaPersona(Persona), sienteEnvidia(Persona, Lista), length(Lista, Cantidad).



Como veran, me salio, pero no sin el forall. En la lista de mails pusieron esto:

Cita:no es con recursividad.

Acordate de DeMorgan y trata de hacerlo con not =)

decir "Para todo X, se cumple Y" es lo mismo que decir "No existe X que No cumpla Y".

Miralo fijo, pensalo, y despues fijate como podes reemplazar el forall por el not =P

Pero no le puedo encontrar la vuelta.
Lo que te dijo es que en vez de meter "Para todos, Persona es más envidiosa" pongas "No existe OtraPersona más envidiosa que Persona".
Ahi esta, lo pude sacar. Mil gracias de nuevo!



masEnvidioso(Persona):-
esUnaPersona(Persona), cuantosEnvidia(Persona, Cantidad),
not((esUnaPersona(Persona2), cuantosEnvidia(Persona2, Cantidad2), Cantidad2 > Cantidad)).


(02-07-2013 16:41)Anirus escribió: [ -> ]
(02-07-2013 16:28)Nikod11 escribió: [ -> ]Pero si los resolvemos sin usar functor/3 no nos bochan, no?

No. Salvo que el enunciado dijera que no se puede hacer de la forma en que lo hiciste y que hay que investigar cómo hacerlo genérico. Posiblemente la idea era que fuera de la forma en que lo hiciste para que vean cómo usar pattern matching con functores de distinta aridad.

Ojo, no estoy seguro de que te acepten usar functor/3, eh. Tratá de no usarlo, o consultalo con tu ayudante si es que es para el TP (o con algún docente que ande por ahí si pensás usarlo en un final/parcial), porque, justamente por ser algo que no se ve en la cursada, tal vez querían evaluar cómo usabas alguna otra herramienta y con esto medio que no estás demostrando saber usar eso otro.


Consulte a su médico =)
Claro, obviamente que voy a usar lo que se de en la materia.

Sentey, para mi TP tenia que hacer algo parecido a "MasEnvidioso" y no me salia. Gracias por postear tu solucion!
URLs de referencia