% http://www.cs.kuleuven.be/~dtai/events/ASP-competition/Benchmarks/MaxClique.shtml % adapted by Neng-Fa Zhou :-include(base). solve(As):- assert_facts(As), findall(N,node(N),Ns), map(Ns,Vars,Map), % defined in base.pl Vars :: 0..1, gen_cs(Ns,Map), Card #= sum(Vars), maxof(labeling([ffc],Vars),Card), output(Ns,Vars), abolish_all. gen_cs([],_). gen_cs([N|Ns],Map):- gen_cs(N,Ns,Map), gen_cs(Ns,Map). % if two nodes are not connected, then they don't belong to the same clique gen_cs(_,[],_). gen_cs(N1,[N2|Ns],Map):- (edge(N1,N2);edge(N2,N1)),!, gen_cs(N1,Ns,Map). gen_cs(N1,[N2|Ns],Map):- map(N1,Var1,Map), map(N2,Var2,Map), Var1 #\= 1 #\/ Var2 #\= 1, gen_cs(N1,Ns,Map). output([],_). output([N|Ns],[1|Vs]):-!, format("clique(~w). ",[N]), output(Ns,Vs). output([_|Ns],[_|Vs]):- output(Ns,Vs). test:- solve([node(1),node(2),node(3),node(4),node(5),node(6),edge(1,2),edge(1,5),edge(2,3),edge(2,5),edge(3,4),edge(4,5),edge(4,6)]).