/*------------------------------------------------*/ /* Attribute-Value Learning by LGG */ /*------------------------------------------------*/ /* (C) 1997 Zdravko Markov */ /*------------------------------------------------*/ /* Example format: example(ID, Class, [A=V,...]). */ /* Use: */ /* Create a set of rules: ?- lrn. */ /* Print rules: ?- listing(if). */ /*------------------------------------------------*/ ?- op(100,fx,if). ?- op(99,xfy,then). /*------------------------------------------------*/ lrn :- retractall(if _ then _), findall(example(N,C,E),example(N,C,E),L), lrn(L), !. lrn(L) :- del(example(N1,C,E1),L,L1), del(example(N2,C,E2),L1,L2), N2\=N1, lgg(E1,E2,H), model(H,M), \+ (member(X,M),example(X,C1,_),C1\=C), lrn([example((N1,N2),C,H)|L2]). lrn(L) :- writel(L), !. lgg(H1,H2,LGG) :- intersection(H1,H2,LGG). model(C,M) :- atom(C), C\=[], !, setof(N,H^L^W^(if H then C,example(N,W,L),covers(H,L)),M). model(H,M) :- findall(N,(example(N,_,L),covers(H,L)),M). covers(H1,H2) :- subset(H1,H2). /*------- List processing utilities ---------*/ intersection([],_,[]) :- !. intersection([X|T],L,[X|V]) :- member(X,L), !, intersection(T,L,V). intersection([_|T],L,V) :- intersection(T,L,V). subset([],_). subset([X|T],L) :- member(X,L), !, subset(T,L). del(X,[X|T],T). del(X,[Y|T],[Y|V]) :- del(X,T,V). writel([]) :- !. writel([example(ID,Class,List)|T]) :- write(example(ID,Class,List)),nl, assertz(if List then Class), writel(T).