UTNianos

Versión completa: Duda ejercicio de logico (pdp)
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Necesito ayuda =(

Tengo esta base de conocimiento:

bebida(dulceDeLecheLatte,[base(cafe,100),leche(10,50)]).
bebida(frappuccinoFrutilla,[base(helado,80),jarabe(frutilla),jarabe(dulceDeLeche),leche(2,60)]).
bebida(irishCream,[base(cafe,90),jarabe(baileys),leche(3,50)]).
bebida(explosiva,[base(ron,90),base(vodka,100),jarabe(frutilla)]).
bebida(extrema,[base(cafe,100),base(helado,80),base(ron,90),leche(10,10),jarabe(chocolate)]).
bebida(light,[base(cafe,5),jarabe(frutilla)]).
bebida(cafecito,[base(cafe,10)]).
bebida(conTodo,[base(cafe,5),jarabe(frutilla),base(helado,80),base(mouse,90),leche(10,10),jarabe(chocolate),base(helado,80),base(mouse,90),leche(10,10),jarabe(chocola​te),base(helado,80),base(mouse,90),leche(10,10),jarabe(chocolate)]).
bebida(milkshake, [base(helado, 80), leche(5, 10)]).
bebida(cafeConLeche, [base(cafe, 5), leche(5, 10)]).

tieneAlcohol(baileys).
tieneAlcohol(tiaMaria).
tieneAlcohol(vodka).
tieneAlcohol(ron).


Este predicado (relaciona una bebida con sus ingredientes):

ingrediente(Bebida,Ingrediente):-
bebida(Bebida,Ingredientes),
member(Ingrediente,Ingredientes).

y tengo que hacer este punto:
-Saber si una bebida esAlcoholica/1 , es decir, si tiene algun componente que sea alcoholico.

A mi se me ocurrio hacer lo siguiente:

esAlcoholica(Bebida):-
baseOjarabe(Bebida).


baseOjarabe(Bebida):-
ingrediente(Bebida, jarabe(Nombre)),
tieneAlcohol(Nombre).

baseOjarabe(Bebida):-
ingrediente(Bebida,base(Nombre,_)),
tieneAlcohol(Nombre).

Esto compila y cuando pregunto por una bebida me dice efectivamente si es o no alcoholica, pero si consulto para que me de todas las bebidas que son alcoholicas me da esto:

| esAlcoholica(B).
B = irishCream ;
B = explosiva ;
B = explosiva ;
B = extrema ;
false.

el problema de esto es que despues tengo que utilizar el predicado esAlcoholica en otro predicado y me termina dando mal.
Alguna ayuda? creo que debe ser un problema de inversibilidad, pero no estoy del todo segura. =P
No entiendo cual es el problema, porque decis que no anda? Pareciera estar bien. Si con problema te referis a que te da dos veces la misma bebida es porque se genera dos veces con esa bebida, pero no se considera mal.

Saludos!
Bueno si eso esta bien paso al siguiente punto en el que tengo problemas, esto tambien esta en la base del conocimiento:

pedido(vero,frappuccinoFrutilla).
pedido(vero, light).
pedido(gus,irishCream).
pedido(gus,explosiva).
pedido(gus,extrema).
pedido(gus,frappuccinoFrutilla).
pedido(alf,conTodo).
pedido(franco,light).
pedido(franco,frappuccinoFrutilla).
pedido(franco,irishCream).
pedido(franco,explosiva).
pedido(franco,extrema).
pedido(franco,conTodo).
pedido(nico, frappuccinoFrutilla).
pedido(nico, dulceDeLecheLatte).
pedido(nico, light).

Definir tieneProblemitas/1 para saber quienes son los clientes que tienen problemitas, que son quienes pidieron alguna bebida con mas de 10 ingredientes, y tambien lo son quienes pidieron todas las bebidas alcoholicas del bar, pero los que pidieron algo light nunca tienen problemitas.

definido seria algo asi :

tieneProblemitas(Cliente):-
problemitasMasde10(),
problemitasConAlcohol().


problemitasMasde10():-
pidioBebidaCompleta(),
not(pidioAlgoLight()).

problemitasConAlcohol:-
pidioTodoLoAlcoholico(),
not(pidioAlgoLight()).

mi problema es con pidioTodoLoAlcoholico que me tiene que devolver quienes son los que pidieron todas las bebidas alcoholicas del bar, este una el predicado de esAlcoholica.
ayuda =(
Te lo resuelvo todo, con lo que recuerdo:

tieneProblemitas(Cliente):- pidioBebidaMasDe10(Cliente), not(pidioBebidaLight(Cliente)).
tieneProblemitas(Cliente):- pidioTodoAlcoholico(Cliente), not(pidioBebidaLight(Cliente)).

pidioBebidaMasDe10(Cliente):- pedido(Cliente,Bebida), bebida(Bebida,Ingredientes), length(Ingredientes,L), (L>10). // linkeo el cliente con los pedidos, linkeo el pedido con su lista
_____________________________________________________________________________________________________de ingredientes, saco la longitud de la lista y la guardo en L
_____________________________________________________________________________________________________y lo otro ya te darás cuenta

pidioTodoAlcoholico(Cliente):- forall(pedido(Cliente,Bebida),esAlcoholica(Bebida)). // me busca todos los pedidos para un cliente dado, y se fija que todos tengan alcohol

pidioBebidaLight(Cliente):- pedido(Cliente,light).


Queria hacerme un poco el loco poniendome a redefinir algunas cosas locas del primer post, pero mejor dejarlo asi =P
Mardoc hay un problema con tu resolucion en particular:

cuando dice en el enunciado : "y tambien lo son quienes pidieron todas las bebidas alcoholicas del bar", dice que efectivamente pidieron esas tres bebidas(irish cream, explosiva, extrema) pero no que todas las bebidas que pidieron son alcoholicas y aca asumis que todo lo que pidieron esAlcoholica.

pidioTodoAlcoholico(Cliente):- forall(pedido(Cliente,Bebida),esAlcoholica(Bebida)).


sigo necesitando ayuda con esto :/
bebidasAlcoholicasDelBar(Lista):- findall(X,(bebida(X,base(N,_)),tieneAlcohol(N)),Lista).

listaPedidosCliente(Cliente,L):-findall(Y,pedido(Cliente,Y),L).

pidioTodasLasBebidasAlcoholicas(Cliente):- listaPedidosCliente(Cliente,L), bebidasAlcoholicasDelBar(Ls), estanTodasLasAlcoholicas(L,Ls).

estanTodasLasAlcoholicas([],L).
estanTodasLasAlcoholicas([A|B],L):- member(A,L), estanTodasLasAlcoholicas(B,L).

tieneProblemitas(Cliente):- pidioBebidaMasDe10(Cliente), not(pidioBebidaLight(Cliente)).
tieneProblemitas(Cliente):- pidioTodasLasBebidasAlcoholicas(Cliente), not(pidioBebidaLight(Cliente)).
URLs de referencia