1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 package org.sat4j.tools.encoding;
30
31 import org.sat4j.core.ConstrGroup;
32 import org.sat4j.core.VecInt;
33 import org.sat4j.specs.ContradictionException;
34 import org.sat4j.specs.IConstr;
35 import org.sat4j.specs.ISolver;
36 import org.sat4j.specs.IVecInt;
37
38
39
40
41
42
43
44
45
46
47
48
49 public class Sequential extends EncodingStrategyAdapter {
50
51
52
53
54
55
56 @Override
57 public IConstr addAtMost(ISolver solver, IVecInt literals, int k)
58 throws ContradictionException {
59 ConstrGroup group = new ConstrGroup(false);
60 final int n = literals.size();
61
62 int s[][] = new int[n - 1][k];
63 for (int j = 0; j < k; j++) {
64 for (int i = 0; i < n - 1; i++) {
65 s[i][j] = solver.nextFreeVarId(true);
66 }
67 }
68 IVecInt clause = new VecInt();
69 clause.push(-literals.get(0));
70 clause.push(s[0][0]);
71 group.add(solver.addClause(clause));
72 clause.clear();
73 for (int j = 1; j < k; j++) {
74 clause.push(-s[0][j]);
75 group.add(solver.addClause(clause));
76 clause.clear();
77 }
78 clause.push(-literals.get(n - 1));
79 clause.push(-s[n - 2][k - 1]);
80 group.add(solver.addClause(clause));
81 clause.clear();
82 for (int i = 1; i < n - 1; i++) {
83 clause.push(-literals.get(i));
84 clause.push(s[i][0]);
85 group.add(solver.addClause(clause));
86 clause.clear();
87 clause.push(-s[i - 1][0]);
88 clause.push(s[i][0]);
89 group.add(solver.addClause(clause));
90 clause.clear();
91 for (int j = 1; j < k; j++) {
92 clause.push(-literals.get(i));
93 clause.push(-s[i - 1][j - 1]);
94 clause.push(s[i][j]);
95 group.add(solver.addClause(clause));
96 clause.clear();
97 clause.push(-s[i - 1][j]);
98 clause.push(s[i][j]);
99 group.add(solver.addClause(clause));
100 clause.clear();
101 }
102 clause.push(-literals.get(i));
103 clause.push(-s[i - 1][k - 1]);
104 group.add(solver.addClause(clause));
105 clause.clear();
106 }
107 return group;
108 }
109 }