Donar $20 Donar $50 Donar $100 Donar mensualmente
 


Enviar respuesta 
 
Calificación:
  • 0 votos - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Buscar en el tema
[Lógico] Ayuda con ejercicio Prolog
Autor Mensaje
janopn Sin conexión
Campeon del cubo Rubik
Cuando no quieras sentir
****

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 113
Agradecimientos dados: 14
Agradecimientos: 32 en 27 posts
Registro en: May 2011
Mensaje: #1
[Lógico] Ayuda con ejercicio Prolog Trabajo practico Paradigmas de Programación
Estimados, buenas noches!

Mañana debo entregar un TP de lógico que adeudo y no me está saliendo el último punto, así que acudo a ustedes!
El TP sobre agentes y policías que realizan diferentes tareas. Cada tarea tiene su puntuación según sus atributos. El ejercicio pide encontrar al agente de mayor puntuación.

Cita:Hacer un predicado llamado agentePremiado/1 que permite deducir el agente que recibe el premio por tener la mejor puntuación. La puntuación de un agente es la sumatoria de los puntos de cada tarea que el agente realiza, que puede ser positiva o negativa. Se calcula de la siguiente manera:
vigilar: 5 puntos por cada negocio que vigila
ingerir: 10 puntos negativos por cada unidad de lo que ingiera. Las unidades ingeridas se calculan como tamaño x cantidad.
apresar: tantos puntos como la mitad de la recompensa.
asuntosInternos: el doble de la puntuación del agente al que investiga.

Los predicados con los que se cuentan a modo de ejemplo son:

Cita:%tareas:
% ingerir(descripcion, tamaño, cantidad)
% apresar(malviviente, recompensa)
% asuntosInternos(agenteInvestigado)
% vigilar(listaDeNegocios)

tarea(policiaCarlos, vigilar([pizzeria, heladeria]), quilmes).
tarea(agenteMiguel, asuntosInternos(vigilanteDelBarrio), avellaneda).
tarea(policiaJuan, ingerir(vino, 0.5, 5),lanus).
tarea(agenteMartin, apresar(policiaJuan50),avellaneda).

La ubicación se utilizó en otros puntos, no le den imporancia.

Bien, debería definir un predicado totalmente inversible que halle el agente o policía de mayor puntuación según los criterios de antes.
Llegué a construir lo siguiente, pero no funciona:


puntajeTotal([Cab|Cola],Puntos):- puntajeIndividual(Cab,Punto), Puntos is Puntos + Punto, puntajeTotal([Cola],Puntos).
puntajeIndividual(vigiliar(Lugares,_),Punto):- length(Lugares,Cantidad), Punto is 5*Cantidad.
puntajeIndividual(ingerir(_,Tam,Cant),Punto):- Punto is (Tam*Cant*(-1)).
puntajeIndividual(apresar(_,recompensa),Punto):- Punto is (recompensa / 2).
puntajeIndividual(asuntosInternos(Persona),Punto) :- puntaje(Persona,Puntos), Punto is (Puntos / 2).

puntaje(Persona, Puntos):- findall(Persona,tarea(Persona,Tarea,_),Tareas), puntajeTotal(Tareas,Puntos).

agentePremiado(Persona):- tarea(Persona,_,_), puntaje(Persona,Puntos), forall(puntaje(Cualquiera,Puntos2), Puntos >= Puntos2).


Simplemente me da False.

Cualquier tipo de ayuda es bienvenida.

Muchas gracias de antemano!
Otros adjuntos en este tema
.txt  tp2 - afirmativo.txt ( 5,15 KB / 34) por rihardmarius

~ All in all is all we are
03-11-2014 22:48
Envíale un email Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
Desert69 Sin conexión
Presidente del CEIT
Sin estado :( / "Anarquia...
********

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 2.399
Agradecimientos dados: 203
Agradecimientos: 297 en 186 posts
Registro en: Jun 2008
Mensaje: #2
RE: [Lógico] Ayuda con ejercicio Prolog
puntajesTotal tiene un error que puede ser un descuido o un error de conceptos fulerísimo.

Releé ese predicado acordándote de que estás en lógico, y que tus cláusulas son "relaciones de verdad".

El resto creo que está todo bien.. Creo.

¡Un abrazo!

[Imagen: a2.php]
[Imagen: 971aa6599664453c05cb3e42d58bbc0eo.jpg]
03-11-2014 23:34
Visita su sitio web Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
[-] Desert69 recibio 1 Gracias por este post
Imakuni (09-11-2014)
vegito Sin conexión
Empleado de Fotocopiadora
Sin estado :(
**

Otra
Otra

Mensajes: 30
Agradecimientos dados: 0
Agradecimientos: 1 en 1 posts
Registro en: Nov 2014
Mensaje: #3
RE: [Lógico] Ayuda con ejercicio Prolog
(03-11-2014 23:34)Desert69 escribió:  puntajesTotal tiene un error que puede ser un descuido o un error de conceptos fulerísimo.

Releé ese predicado acordándote de que estás en lógico, y que tus cláusulas son "relaciones de verdad".

El resto creo que está todo bien.. Creo.

¡Un abrazo!

y si en vez de usar frases de agrandado le decis que está mal y punto?
ni que fueras profesor...
03-11-2014 23:54
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
[-] vegito recibio 1 Gracias por este post
Desert69 (04-11-2014)
janopn Sin conexión
Campeon del cubo Rubik
Cuando no quieras sentir
****

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 113
Agradecimientos dados: 14
Agradecimientos: 32 en 27 posts
Registro en: May 2011
Mensaje: #4
RE: [Lógico] Ayuda con ejercicio Prolog
Gracias a ambos por las respuestas!

La verdad es que en clase no hicimos ejercicios de sumatoría (no falté ninguna clase), y el único ejemplo de acumulación que ví es que el está en la wiki de PdeP.
Por lo que entendí se va acumulando en el parámetro del predicado, sirviendo tanto de ingreso como de egreso.
¿Me podrían dar una mano con el manejo de acumulaciones? (traté de evitar esto utilizando sumlist, pero no se me ocurrio manera de armar un predicado que me devuelva una lista de los puntajes).

Admito que es un error de conceptos, y muy grave posiblemente, pero no tengo ejemplos ni sustento más que el de la wiki, lo cito:

Cita:sumatoria([Cabeza|Cola], S):-
sumatoria(Cola,SCola), % Esto ya es casi todo el problema resuelto! Solo falta sumar la cabeza:
S is SCola + Cabeza.

Por lo que veo vuelve a llamar al predicado, pasando "SCola" y luego suma el valor actual (recibido) al que va a utilizar en el nuevo llamado.

Por eso agradecería una mano.. sé que colgué el TP, pero en los parciales no me fue mail hasta el momento y es una pena estar hasta las manos por un TP que colgué.

Gracias a todos! =)

~ All in all is all we are
04-11-2014 11:26
Envíale un email Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
Desert69 Sin conexión
Presidente del CEIT
Sin estado :( / "Anarquia...
********

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 2.399
Agradecimientos dados: 203
Agradecimientos: 297 en 186 posts
Registro en: Jun 2008
Mensaje: #5
RE: [Lógico] Ayuda con ejercicio Prolog
Fijate que el predicado ese que estás haciendo vos, la línea en la que "acumulás" dice "Puntos is Puntos + 1".

En los lenguajes más _imperativos_ estamos estúpidamente acostumbrados a decir "a := a + 1", que se debería leer como "en la variable a, asignar el resultado de sumarle 1 al valor actual de a".

Pero en lógico no damos órdenes: establecemos relaciones. "Puntos is Puntos + 1" significa "¿Existe algún valor de Puntos tal que sea igual al valor de Puntos + 1?". Tirando un poco más de los pelos la notación, podríamos decir que "Puntos is Puntos + 1" equivale más a la _ecuación matemática_ Puntos = Puntos + 1, o, en lenguaje matemático: x = x + 1.

Por eso Prolog te dice "false". ¿Existe algún valor tal que sea igual a su siguiente? No.


En el ejemplo que citás vos, fijate que usan una "variable temporal" para eso: la sumatoria S de una lista que se divide en Cabeza y Cola es la suma entre la Cabeza y la sumatoria SCola de la Cola.

(03-11-2014 23:54)vegito escribió:  y si en vez de usar frases de agrandado le decis que está mal y punto?
ni que fueras profesor...

Si algún día llego a ser profesor, de todos modos no voy a tener derecho para hacerme el agrandado y boludear a nadie.

Si le digo qué es lo que está mal y punto, va a ser más difícil que aprenda a encontrar él los problemas. Yo no quiero (y espero que él tampoco) que zafe un TP: me interesa que aprenda y entienda lo que pretenden que aprenda con ese TP.

Me parece que no está buscando que le resuelva la tarea, si no que le de una mano. Bueno, eso.


¡Un abrazo!

[Imagen: a2.php]
[Imagen: 971aa6599664453c05cb3e42d58bbc0eo.jpg]
(Este mensaje fue modificado por última vez en: 04-11-2014 11:53 por Desert69.)
04-11-2014 11:44
Visita su sitio web Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
[-] Desert69 recibio 1 Gracias por este post
janopn (04-11-2014)
janopn Sin conexión
Campeon del cubo Rubik
Cuando no quieras sentir
****

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 113
Agradecimientos dados: 14
Agradecimientos: 32 en 27 posts
Registro en: May 2011
Mensaje: #6
RE: [Lógico] Ayuda con ejercicio Prolog
Perfecto, entiendo tu punto.
En base a eso, quedó de la siguiente manera:


puntajeTotal([Cab|Cola],Puntos):- puntajeIndividual(Cab,Punto), puntajeTotal([Cola],Ptemp), Puntos is Ptemp + Punto.


El predicado recibe "Puntos", luego halla los puntos de la cabecera dentro de "Punto", los puntos totales de la cola dentro de "Ptemp" y finalmente establece Puntos como los puntos de toda la cola (Ptemp) + los puntos de la cabecera (Punto).

En base a estas modificaicones y arreglos menores.. Funciona!

El único problema es que en "agentePremiado", me devuelve infinitas veces al agente premiado. Lo halla bien, hice varias pruebas, pero si le doy ";", me sigue trayendo al mismo una y otra vez. Esto es un error?



puntajeTotal([Cab|Cola],Puntos):- puntajeIndividual(Cab,Punto), puntajeTotal(Cola,Ptemp), Puntos is (Ptemp + Punto).
puntajeTotal([],0).
puntajeIndividual(vigilar(Lugares),Punto):- length(Lugares,Cantidad), Punto is (5*Cantidad).
puntajeIndividual(ingerir(_,Tam,Cant),Punto):- Punto is (Tam*Cant*(-1)).
puntajeIndividual(apresar(_,Recompensa),Punto):- Punto is (Recompensa / 2).
puntajeIndividual(asuntosInternos(Persona),Punto) :- puntaje(Persona,Puntos), Punto is (Puntos / 2).

puntaje(Persona,Puntos):- tarea(Persona,_,_), findall(Tarea,tarea(Persona,Tarea,_),Tareas), puntajeTotal(Tareas,Puntos).

agentePremiado(Persona):- tarea(Persona,_,_), puntaje(Persona,Puntos), forall((puntaje(Cualquiera,Puntos2),Persona \= Cualquiera), Puntos >= Puntos2).




Nuevamente, muchísimas gracias por la atención y la ayuda =)

~ All in all is all we are
(Este mensaje fue modificado por última vez en: 04-11-2014 13:07 por janopn.)
04-11-2014 12:19
Envíale un email Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
Desert69 Sin conexión
Presidente del CEIT
Sin estado :( / "Anarquia...
********

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 2.399
Agradecimientos dados: 203
Agradecimientos: 297 en 186 posts
Registro en: Jun 2008
Mensaje: #7
RE: [Lógico] Ayuda con ejercicio Prolog
Si realmente es "infinitamente", puede que sea un problema. Fijate cuál de tus predicados tiene infinitas respuestas. Por ahí simplemente son muchísimas respuestas, pero no infinitas.

Si no, buscá alguna condición que puedas agregar para limitar la cantidad de respuestas.

[Imagen: a2.php]
[Imagen: 971aa6599664453c05cb3e42d58bbc0eo.jpg]
04-11-2014 13:56
Visita su sitio web Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
janopn Sin conexión
Campeon del cubo Rubik
Cuando no quieras sentir
****

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 113
Agradecimientos dados: 14
Agradecimientos: 32 en 27 posts
Registro en: May 2011
Mensaje: #8
RE: [Lógico] Ayuda con ejercicio Prolog
No son infinitos.. pero son muchos.
Me devuelve actualmente 9 veces al agente. Si agrego un predicado más de una tarea, me lo devuelve 17 veces.

Por más que sea incómodo, recuerdo que a veces estas cosas pasaban con lógico (resultados repetidos) y que no solían ser muy exigentes con eso, salvo que en el enunciado lo especifiquen.

Muchas gracias por las respuestas!

Podemos dar esto como resuelto.

~ All in all is all we are
04-11-2014 14:36
Envíale un email Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
rihardmarius Sin conexión
Secretario de la SAE
Por qué no me derivas el loga...
******

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 415
Agradecimientos dados: 100
Agradecimientos: 394 en 67 posts
Registro en: Oct 2011
Mensaje: #9
RE: [Lógico] Ayuda con ejercicio Prolog
creo que llegue un poco tarde pero yo subi muchos ejercicios de prolog resueltos en este post:

http://www.utnianos.com.ar/foro/tema-apo...-resueltas

Son las guias de ejercicios de la pagina de la catedra, las guias de trabajos practicos 2013 y 2014 mas algunos ejercicios que nos dejo mi profesora (Valeria Pennella).

-------------------------------------

En cuanto al que tenes que resolver te adjunto el que hice yo en su momento.


Archivo(s) adjuntos
.txt  tp2 - afirmativo.txt (Tamaño: 5,15 KB / Descargas: 34)

09-11-2014 00:08
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)



    This forum uses Lukasz Tkacz MyBB addons.