/*----------------------------------------------------------*/ /* Attribute-Value Clustering by LGG (Sicstus Prolog V2+) */ /*----------------------------------------------------------*/ /* (C) 1997 Zdravko Markov */ /*----------------------------------------------------------*/ cluster(E,Tree) :- cluster(E,[],Tree). cluster(E,CTree,Tree) :- min_lgg(E,LGG), !, cover(E,LGG,Cover,Rest), cluster([LGG|Rest],[[LGG|Cover]|CTree],Tree). cluster(_,Tree,Tree). min_lgg(E,C) :- findall(C/D,(pair(E,A,B),lgg(A,B,C,D)),All), min(All,C/_). cover([],_,[],[]). cover([X|T],LGG,[X|Cov],R) :- subsumes(LGG,X), !, cover(T,LGG,Cov,R). cover([X|T],LGG,Cov,[X|R]) :- cover(T,LGG,Cov,R). subsumes(T1,T2) :- \+(\+((numbervars(T2,0,_),T1=T2))). lgg([],[],[],0). lgg([X|T],[Y|L],[X|V],D) :- X==Y, !, lgg(T,L,V,D). lgg([_|T],[_|L],[_|V],D) :- lgg(T,L,V,D1), D is D1+1. member(X,[X|_]). member(X,[_|T]) :- member(X,T). min([X],X) :- !. min([X/M|T],Y/N) :- min(T,Z/K), (M