union([],L,L).
union([X|Y],L1,[X|Z]) :- not(member(X,L1)), union(Y,L1,Z).
union([X|Y],L1,Z) :- member(X,L1), union(Y,L1,Z).

inter([],_,[]).
inter([X|Y],L1,[X|Z]):- member(X,L1), inter(Y,L1,Z).
inter([_|Y],L1,Z):- inter(Y,L1,Z).

equipement(jean,[bottes,bonnet,pull]).
equipement(paul,[parapluie,sandales,kway,short,gants]).
equipement(jacques,[bob,moufles]).

temps(nord,[froid,pluie]).
temps(sud,[soleil]).
temps(est,[neige,froid]).
temps(ouest,[pluie,chaud]).

equipe(froid,[pull,bonnet,gants,echarpe]).
equipe(pluie,[parapluie,kway]).
equipe(soleil,[sandales,bob,short,lunettes]).
equipe(neige,[pull,moufles,gants]).
equipe(chaud,[sandales,short]).

mieuxadapte(R,P):-
  listeregion(R,L),
  listescore(L,S),
  max(S,T),!,
  verifier(L,T,P).

verifier(L,T,P):-
  equipement(P,L1),
  inter(L1,L,L2),
  length(L2,T1),
  T = T1.
  
listeregion(R,L):-
  temps(R,L1),
  liste1(L1,[],L).

liste1([],L,L).
liste1([X|Y],L1,L):-
 equipe(X,L2),
 union(L2,L1,L3),
 liste1(Y,L3,L).

listescore(L,L1) :-
  recperson([],L2),
  listescore1(L2,L,L1).

recperson(A,Z):- equipement(X,_), not(member(X,A)),!,recperson([X|A],Z).
recperson(A,A).

listescore1([],_,[]).
listescore1([X|Y],L,[(X,R)|Z]):- equipement(X,L1), inter(L,L1,L2), 
                                 length(L2,R), listescore1(Y,L,Z).


max(L,R):- max1(L,0,R).

max1([],A,A):-!.
max1([(_,Z)|Y],A,B):- Z > A, max1(Y,Z,B).
max1([_|Y],A,B):- max1(Y,A,B).
