Hola!
Supongamos que tenemos la siguiente base de conocimientos en Prolog:
% tiene(Persona, Ropa)
% remera(Color)
% sombrero(NivelDeMagia, Color)
tiene(ana, remera(blanco)).
tiene(ana, remera(rojo)).
tiene(ana, sombrero(2, blanco)).
tiene(juan, remera(rojo)).
tiene(juan, sombrero(1, negro)).
Queremos saber si alguien ganó, que sucede cuando tiene más sombreros blancos que negros. En el ejemplo, Ana es la única que ganó, porque tiene 1 sombrero blanco y 0 negros.
Mi intento fue generar, por un lado, los sombreros blancos y los negros a través de findall/3, contarlos usando length/2 y luego comparar ambos números:
gano(Alguien) :-
tiene(Alguien, _),
findall(_, tiene(Alguien, sombrero(_, blanco)), Blanco),
length(Blanco, CantidadBlanco),
findall(_, tiene(Alguien, sombrero(_, negro)), Negro),
length(Negro, CantidadNegro),
CantidadBlanco > CantidadNegro.
Este código funciona (al preguntar gano(Alguien) contesta Ana y luego da false), pero me da la impresión que no estoy haciendo un buen uso de findall.
Porque estoy usando _ en el primer parámetro, y ahí necesitaría una variable.
¿A alguien se le ocurre cómo arreglarlo? O quizás usar otro predicado como forall/2 o member/2 para conseguir el resultado.
Gracias!!
Saludos