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 package org.sat4j.minisat.constraints.cnf;
27
28 import java.io.Serializable;
29
30 import org.sat4j.core.VecInt;
31 import org.sat4j.minisat.core.Constr;
32 import org.sat4j.minisat.core.ILits;
33 import org.sat4j.minisat.core.UnitPropagationListener;
34 import org.sat4j.specs.IVecInt;
35
36
37
38
39
40 public class TernaryClauses implements Constr, Serializable {
41
42 private static final long serialVersionUID = 1L;
43
44 private final IVecInt stubs = new VecInt();
45
46 private final ILits voc;
47
48 private final int phead;
49
50 public TernaryClauses(ILits voc, int p) {
51 this.voc = voc;
52 this.phead = p;
53 }
54
55 public void addTernaryClause(int a, int b) {
56 stubs.push(a);
57 stubs.push(b);
58 }
59
60
61
62
63
64
65 public void remove() {
66
67 }
68
69
70
71
72
73
74
75 public boolean propagate(UnitPropagationListener s, int p) {
76 assert voc.isSatisfied(p);
77 assert voc.isFalsified(phead);
78 voc.watch(p, this);
79 for (int i = 0; i < stubs.size(); i += 2) {
80 int a = stubs.get(i);
81 int b = stubs.get(i + 1);
82 if (voc.isSatisfied(a) || voc.isSatisfied(b)) {
83 continue;
84 }
85 if (voc.isFalsified(a) && !s.enqueue(b, this)) {
86 return false;
87 } else if (voc.isFalsified(b) && !s.enqueue(a, this)) {
88 return false;
89 }
90 }
91 return true;
92 }
93
94
95
96
97
98
99 public boolean simplify() {
100 return false;
101 }
102
103
104
105
106
107
108 public void undo(int p) {
109 }
110
111
112
113
114
115
116 public void calcReason(int p, IVecInt outReason) {
117 assert voc.isFalsified(this.phead);
118 if (p == ILits.UNDEFINED) {
119 int i = 0;
120 while (!voc.isFalsified(stubs.get(i))
121 || !voc.isFalsified(stubs.get(i + 1))) {
122 i += 2;
123 }
124 outReason.push(this.phead ^ 1);
125 outReason.push(stubs.get(i) ^ 1);
126 outReason.push(stubs.get(i + 1) ^ 1);
127 } else {
128 outReason.push(this.phead ^ 1);
129 int i = 0;
130 while ((stubs.get(i) != p) || (!voc.isFalsified(stubs.get(i ^ 1)))) {
131 i++;
132 }
133 assert !voc.isFalsified(stubs.get(i));
134 outReason.push(stubs.get(i ^ 1) ^ 1);
135 assert voc.isFalsified(stubs.get(i ^ 1));
136 }
137
138 }
139
140
141
142
143
144
145 public boolean learnt() {
146 return false;
147 }
148
149
150
151
152
153
154 public void incActivity(double claInc) {
155 }
156
157
158
159
160
161
162 public double getActivity() {
163 return 0;
164 }
165
166
167
168
169
170
171 public boolean locked() {
172
173 return false;
174 }
175
176
177
178
179
180
181 public void setLearnt() {
182
183 }
184
185
186
187
188
189
190 public void register() {
191
192 }
193
194
195
196
197
198
199 public void rescaleBy(double d) {
200
201 }
202
203
204
205
206
207
208 public int size() {
209 return stubs.size();
210 }
211
212
213
214
215
216
217 public int get(int i) {
218 throw new UnsupportedOperationException();
219 }
220
221 public void assertConstraint(UnitPropagationListener s) {
222 throw new UnsupportedOperationException();
223 }
224 }