UTNianos

Versión completa: [Lógico] Ayuda con ejercicio Prolog
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
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!
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!
(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...
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! =)
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!
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 =)
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.
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.
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.
URLs de referencia