UTNianos

Versión completa: Ayuda Lógico TP
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Hola! Necesitaría una mano con esto:

bebida(frappuccinoFrutilla,[base(helado,80),jarabe(frutilla),jarabe(dulceDeLeche),leche(2,60)]).

me pide que arme una regla, tal que las calorias del jarabe sean 10.
Yo armé esto:
caloriasJarabe(Bebida,C1):-
C1 is 10,
bebida(Bebida,Lista),
member(jarabe(_),Lista).

el tema es que cuando lo consulto me devuelve esto:
33 ?- caloriasJarabe(frappuccinoFrutilla,X).
X = 10 ;
X = 10 .

y lo que quiero es que me devuelva X=20.

Muchas gracias! Creo que hay que usar recursividad pero no tengo idea como armarlo.
No entiendo que es lo que queres consultar, si pones C1 is 10 ya estas ligando X con el valor 10 por ende siempre va a devolver eso, lo segundo es que no entiendo de donde sacas el 20 y tmpoco entiendo que predicado qres hacer =P.
A ver, creo que como está planteado, jarabe es un agregado, no podes hacer caloriasJarabe(capuchino...)
Entiendo que lo que te pide es
calorías (Bebida,Calorías)
Por lo que la solución es
calorías ((jarabe(_),Calorías):- Calorías is 10.
Lo que necesito es que me de el total del jarabe, si aparece una vez, el jarabe es 10, si aparece dos veces en la composición de la bebida, el jarabe es 20, y así sucesivamente. Gracias por responder!
Ah, ya entendí
Entonces necesitas saber la cantidad de jarabe que tiene una bebida y multiplicarla por 10
Sería un findall(jarabe(_), Bebida, Lista), size(Lista,Cantidad), Calorías is Cantidad *10.

Corrijo, en donde dice Bebida en el findall, es la lista de ingredientes del trago

(Si no me equivoco)
Fíjate que en tu solución preguntas por cada vez que aparezca un jarabe(_) C1 "devuelve" 10, en ningun momento los acumulas
ya odin te lo dio como tiene que hacerse, acrdate que es inversible solo por derecha por el findall
ya la armé como me dijiste, y me sigue devolviendo X=10. probé que lista me hacía el findall, y me hace una lista con un solo elemento, algo así X = [jarabe(_G1745)].

Acá está el código:
caloriasJarabe(Bebida,Calorias):-
bebida(Bebida,Lista),
findall(jarabe(_),ingredientes(Lista),List),
length(List,Cantidad),
Calorias is Cantidad*10.
Ingredientes(Lista) no se como es que lo que definiste
Pero con que pases findall(jarabe(_), Lista,List) debería devolverte todos los jarabes, porque Lista ya son los ingredientes
Ojo que no está bien hacer C1 is 10, cuando querés ligar una variable directamente en lugar de C1 pones 10 y listo.

caloriasJarabe(Bebida,10)

Fijate en la página de pdep cómo se usa el is.

Acá:
https://4924d24e-a-62cb3a1a-s-sites.goog...edirects=0

o acá:
http://uqbar-wiki.org/index.php?title=Unificaci%C3%B3n_y_Pattern-Matching#Unificaci.C3.B3n

Espero haber ayudado. =)
No devuelve todos los jarabes con ninguno de los dos códigos, devuelve uno sólo o falso en algunos casos
Devuelve algo del estilo X=jarabe(_Getcetc)
Acá lo tenes resuelto:

bebida(frappuccinoFrutilla,[base(helado,80),jarabe(frutilla),jarabe(dulceDeLeche),leche(2,60)]).
estaJarabe(jarabe(Nombre),Lista):-
member(jarabe(Nombre),Lista).
caloriasJarabe(Bebida,Calorias):-
bebida(Bebida,Lista),
findall(Jarabe,estaJarabe(Jarabe,Lista),List),
length(List,Cantidad),
Calorias is Cantidad*10.



Acordate que en el findall tenes 3 parametros. El primero es la/las variables que vas a analizar, el segundo son los predicados que la involucran y en el tercero va la lista resultante.
En este caso la "variable" a analizar es el jarable, el predicado que usamos es el que analiza si el jarabe está en la lista. Luego nos devuelve una lista con todos los jarabes que están, y a eso le aplicamos lo restante.
OFFTOPIC: No se si se llama variables (ya me olvidé su correcto nombre).
El código funciona sólo si Lista llega ligada, debería quedar
estaJarabe(jarabe(Nombre),Lista):-
bebida(_,Lista),
member(jarabe(Nombre),Lista).
Ya lo pude solucionar! Les dejo como me quedó, quizas le sirva a alguien:

caloriasJarabe(Bebida,C3):-
bebida(Bebida,Lista),
ingredientes(Lista),
findall(Jarabe,member(jarabe(Jarabe),Lista),List),
length(List,Cantidad),
C3 is Cantidad*10.

Gracias!!
URLs de referencia