succ  prec  indice 

Predicato "compute_gain/5"


*
% For a set of positive and negative examples Pxs and Nxs, compute the
% information gain of Clause over a clause which produces a split
% having Info, as it's "information value" on these examples.
compute_gain(Nxs, Pxs, Info, Clause, Gain) :-
        covered_examples(Clause, Pxs, Retained),
        length(Retained, R),
        ( R =:= 0 ->
              Gain = 0
        ; info_value(Clause, Pxs, Nxs, Info1),
          Gain is R * (Info - Info1)
        ).
% Compute the information matric for the set of positive and negative
% tuples which result from applying Clause to the examples Pxs and
% NXs. 
info_value(Clause, Pxs, Nxs, Value) :-
        tuples(Clause, Pxs, Ptuples),
        length(Ptuples, P),
        ( P =:= 0 ->
              Value = 0
        ; tuples(Clause, Nxs, Ntuples),
          length(Ntuples, N),
          Temp is P / (P + N),
          log(Temp, Temp1),
          Value is Temp1 * -1.442695
        ).


% Given a clause and a list of examples, construct the list of tuples
% for the clause.  A tuple is the binding of values to variables such
% that the clause can be used to prove the example.
tuples((A :- B), Xs, Tuples) :-
        variables_in((A :- B), Vars),
        variables_in(A, HeadVars),
        length(HeadVars, N1),
        length(Vars, N2),
        ( N1 =:= N2 ->
              %% shortcut - only need 1 proof if no new variables.
              findall(Vars, (member(A, Xs), \+(\+ B)), Tuples)
        ; findall(Vars, (member(A,Xs), call(B)), Tuples)
        ).
% Construct a list representing the set of variables in Term.
variables_in(A, Vs) :- 
        variables_in(A, [], Vs).
        
variables_in(A, V0, V) :-
        var(A), !, 
        ord_add_element(V0, A, V).
variables_in(A, V0, V) :-
        ground(A), !, V = V0. 
variables_in(Term, V0, V) :-
        functor(Term, _, N),
        variables_in_args(N, Term, V0, V).

variables_in_args(N, Term, V0, V) :-
        ( N =:= 0 ->
              V = V0
        ; arg(N, Term, Arg),
          variables_in(Arg, V0, V1),
          N1 is N-1,
          variables_in_args(N1, Term, V1, V)
        ).
*


 
 
 
 


 succ  prec  indice