% 1-
permiteEntrar(Casa, Mago):-
casa(Casa),
mago(Mago, _, _),
Casa \= slytherin.
permiteEntrar(slytherin, Mago):-
mago(Mago, Sangre, _),
Sangre \= impura.
% 2-
tieneCaracter(Mago, Casa):-
casa(Casa),
mago(Mago, _, Caracteristicas),
forall(caracteriza(Casa, C), member(C, Caracteristicas)).
% 3-
casaPosible(Mago, Casa):-
casa(Casa),
mago(Mago, _, _),
tieneCaracter(Mago, Casa),
permiteEntrar(Casa, Mago),
not(odia(Mago, Casa)).
% 5-
esMala(fueraDeCama, 50).
esMala(irA(Lugar), Puntos):- lugarProhibido(Lugar, Puntos).
esBuena(_, buenaAccion(Motivo, Puntos), Puntos).
esBuena(Mago, responder(_, Puntos, Profesor), PuntosFinales):-
alumnoFavorito(Profesor, Mago),
PuntosFinales is Puntos * 2.
esBuena(Mago, responder(_, Puntos, Profesor), PuntosFinales):-
alumnoOdiado(Profesor, Mago),
PuntosFinales is 0.
esBuena(Mago, responder(_, Puntos, Profesor), PuntosFinales):-
not(alumnoFavorito(Profesor, Mago)),
not(alumnoOdiado(Profesor, Mago)),
PuntosFinales is Puntos.
acciones(Mago, Acciones, Cantidad):-
findall(Accion, hizo(Mago, Accion), Acciones),
length(Acciones, Cantidad).
accionesMalas(Mago, Acciones, AccionesMalas, Cantidad):-
findall(Accion, (member(Accion, Acciones),
esMala(Accion, _)),
AccionesMalas),
length(AccionesMalas, Cantidad).
esBuenAlumno(Mago):-
mago(Mago, _, _),
acciones(Mago, Acciones, CantidadAcciones),
CantidadAcciones > 0,
accionesMalas(Mago, Acciones, _, CantidadAccionesMalas),
CantidadAccionesMalas < 1.
% 6-
puntosDeCasa(Casa, Total):-
casa(Casa),
esDe(Mago, Casa),
acciones(Mago, Acciones, _),
puntosMalas(Mago, Acciones, PuntosMalas),
puntosBuenas(Mago, Acciones, PuntosBuenas),
Total is PuntosBuenas - PuntosMalas.
puntosMalas(Mago, Acciones, Total):-
findall(Punto, (member(Accion, Acciones),
esMala(Accion, Punto)),
Puntos),
sumlist(Puntos, Total).
puntosBuenas(Mago, Acciones, Total):-
findall(Punto, (member(Accion, Acciones),
esBuena(Mago, Accion, Punto)),
Puntos),
sumlist(Puntos, Total).
% 7-
casaGanadora(Casa):-
puntosDeCasa(Casa, Total),
forall((puntosDeCasa(OtraCasa, OtroTotal), Casa \= OtraCasa), Total > OtroTotal).