/* utility predicates */
min(X,Y,X) :- Y >= X, !.
min(X,Y,Y) :- X > Y.

/* all predicates in the tail are deterministic, so the prob. of the head is the prob. of the rule */
melhor_cor(tinto, C)   :- prato(carne), vitela(nao),  C is 0.9.
melhor_cor(tinto, C)   :- prato(ave), peru(sim),  C is 0.8.
melhor_cor(tinto, C)   :- molho(sim), tipo_molho(tomate), \+ prato(peixe),  C is 0.7.
melhor_cor(branco, C)  :- prato(carne), vitela(sim),  C is 0.6.
melhor_cor(branco, C)  :- prato(peixe),  C is 0.9.
melhor_cor(branco, C)  :- prato(ave), peru(nao),  C is 0.7.

melhor_docura(doce, C)  :- molho(sim), tipo_molho(doce),  C is 0.9.
melhor_docura(doce, C)  :- molho(sim), tipo_molho(tomate),  C is 0.5.
melhor_docura(seco, C)  :- molho(sim), tipo_molho(temperado),  C is 0.6.
melhor_docura(seco, C)  :- molho(nao),  C is 0.7.


/* the minimum prob. of 1 and MD is always MD, same for MC :) */
docura_escolhida(seco, C)  :- melhor_docura(seco,MD),  C is 0.8 * MD.
docura_escolhida(doce, C)  :- melhor_docura(doce,MD),  C is 0.8 * MD.
docura_escolhida(suave, C) :- melhor_docura(seco,MD), docura(doce),  C is 0.8 * MD.
docura_escolhida(suave, C) :- melhor_docura(doce,MD), docura(seco),  C is 0.8 * MD.
docura_escolhida(D, C)     :- prato(vegetariano), melhor_docura(D,MD),  C is 0.7 * MD.
docura_escolhida(D, C)     :- melhor_docura(D,MD), docura(D),  C is 1.0 * MD.

cor_escolhida(C, Cert) :- cor(C), melhor_cor(C,MC),  Cert is 1.0 * MC.
cor_escolhida(C, Cert) :- prato(vegetariano), cor(C),  Cert is 1.0.
cor_escolhida(tinto, C)  :- melhor_cor(tinto,MC),  C is 0.8 * MC.
cor_escolhida(branco, C) :- melhor_cor(branco,MC),  C is 0.8 * MC.


vinho(gamay, Cert)               :- cor_escolhida(tinto,C),  docura_escolhida(doce,D),   Cert is 0.9 * min(C,D).
vinho(chablis, Cert)             :- cor_escolhida(branco,C), docura_escolhida(seco,D),   Cert is 0.95 * min(C,D).
vinho(cabernet_sauvignon, Cert)  :- cor_escolhida(tinto,C),  docura_escolhida(seco,D),   Cert is 0.85 * min(C,D).
vinho(riesling, Cert)            :- cor_escolhida(branco,C), docura_escolhida(doce,D),   Cert is 0.9 * min(C,D).
vinho(sauvignon_branco, Cert)    :- cor_escolhida(branco,C), docura_escolhida(seco,D),   Cert is 0.8 * min(C,D).
vinho(chenin_blanc, Cert)        :- cor_escolhida(branco,C), docura_escolhida(doce,D),   Cert is 0.95 * min(C,D).
vinho(pinot_noir, Cert)          :- cor_escolhida(tinto,C),  docura_escolhida(suave,D),  Cert is 0.9 * min(C,D).
vinho(soave, Cert)               :- cor_escolhida(branco,C), docura_escolhida(suave,D),  Cert is 0.7 * min(C,D).
vinho(chardonay, Cert)           :- cor_escolhida(branco,C), docura_escolhida(suave,D),  Cert is 0.9 * min(C,D).
vinho(zinfandel, Cert)           :- cor_escolhida(tinto,C),  docura_escolhida(suave,D),  Cert is 0.85 * min(C,D).
