title: Can you use clpfd to implement a coverage algorithm?
body: <p>Say I want to find the set of features/attributes that differentiate two classes in a simple matching manner can I use clpfd in prolog to do this?</p>
  
  <pre><code>c_s_mining(Features,Value):-
   Features = [F1,F2,F3,F4],
   Features ins 0..1,
   ExampleA = [A1,A2,A3,A4],
   ExampleB =[B1,B2,B3,B4],
   ExampleC =[C1,C2,C3,C4],
   A1 #=0, A2#=1,A3#=0,A4#=1,
   B1 #=0, B2#=1,B3#=0,B4#=1,
   C1 #=1, C2#=0,C3#=0,C4#=1,
  
   ExampleD =[D1,D2,D3,D4],
   ExampleE =[E1,E2,E3,E4],
   ExampleQ =[Q1,Q2,Q3,Q4],
   D1#=1,D2#=0,D3#=1,D4#=0,
   E1#=1,E2#=0,E3#=1,E4#=0,
   Q1#=0,Q2#=1,Q3#=1,Q4#=0,
  
   Positives =[ExampleA,ExampleB,ExampleC],
   Negatives = [ExampleD,ExampleE,ExampleQ],
   TP in 0..sup,
   FP in 0..sup,
   covers(Features,Positives,TP),
   covers(Features,Negatives,FP),
   Value  in inf..sup,
   Value #= TP-FP.
  
  
  covers(Features,Examples,Number_covered):-
     findall(*,(member(E,Examples),E=Features),Covers), length(Covers,Number_covered).
  </code></pre>
  
  <p>Each example is described by four binary features, and there are three positive examples (A,B,C) and three negative examples (D,E,Q).</p>
  
  <p>An example is covered by a set of selected features if they match.
  So for example if <code>Features</code> is unified with <code>[0,1,0,1]</code>, then this will match two positives and 0 negatives. </p>
  
  <p>I set <code>Value</code> to be equal to <code>TP</code> (true positives) - <code>TN</code> (true negatives). I want to maximise Value and find the corresponding set of features. </p>
  
  <p>I query <code>?-c_s_mining(Features,Value),labelling([max(Value)],[Value]).</code>
  The answer I expect is: <code>Features =[0,1,0,1], Value =2</code> but I get <code>Features =[_G1,_G2,_G3,G4],Value =0, G1 in 0..1, G2 in 0..1, G3 in 0..1, G4 in 0..1.</code></p>