/*----------------------------------------------------------*/ 
/*  Simple Bayes Classifier (SICStus Prolog 3)              */
 /*----------------------------------------------------------*/
 /*----------------------------------------------------------*/
 /*  Data: example(Id,Class,[A1=V1,...,An=Vn]).              */
 /*----------------------------------------------------------*/
 bayes(X,Class) :-
     setof(C,N^E^example(N,C,E),Cs),
     findall(C/P,(member(C,Cs),
                  cond_prob(X,C,PXC),
                  prob(C,PC),
                  P is PXC*PC),W),
     max(W,Class/_).

  cond_prob([],_,1).
 cond_prob([AV|L],C,P) :-
     findall(I,example(I,C,_),All),
     length(All,N),
     findall(I,(example(I,C,AVL),member(AV,AVL)),W),
     length(W,M),
     cond_prob(L,C,P1),
     P is P1*M/N.

  prob(C,PC) :- 
    findall(I,example(I,_,_),All),
     length(All,N),
     findall(I,example(I,C,_),W),
     length(W,M),
     PC is M/N.

      member(X,[X|_]). 
member(X,[_|T]) :-
      member(X,T).

  max([X],X) :- !.
 max([X/M|T],Y/N) :- 
     max(T,Z/K),
      (M>K,Y/N=X/M;Y/N=Z/K), !. 