aboutsummaryrefslogtreecommitdiff
path: root/src/uk/ac/ox/cs/pagoda/tracking/TrackingRuleEncoderDisjVar1.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/uk/ac/ox/cs/pagoda/tracking/TrackingRuleEncoderDisjVar1.java')
-rw-r--r--src/uk/ac/ox/cs/pagoda/tracking/TrackingRuleEncoderDisjVar1.java436
1 files changed, 436 insertions, 0 deletions
diff --git a/src/uk/ac/ox/cs/pagoda/tracking/TrackingRuleEncoderDisjVar1.java b/src/uk/ac/ox/cs/pagoda/tracking/TrackingRuleEncoderDisjVar1.java
new file mode 100644
index 0000000..8998051
--- /dev/null
+++ b/src/uk/ac/ox/cs/pagoda/tracking/TrackingRuleEncoderDisjVar1.java
@@ -0,0 +1,436 @@
1package uk.ac.ox.cs.pagoda.tracking;
2
3import java.util.Collection;
4import java.util.HashSet;
5import java.util.LinkedList;
6import java.util.Set;
7
8import org.semanticweb.HermiT.model.AnnotatedEquality;
9import org.semanticweb.HermiT.model.AtLeast;
10import org.semanticweb.HermiT.model.AtLeastConcept;
11import org.semanticweb.HermiT.model.Atom;
12import org.semanticweb.HermiT.model.AtomicConcept;
13import org.semanticweb.HermiT.model.AtomicNegationConcept;
14import org.semanticweb.HermiT.model.AtomicRole;
15import org.semanticweb.HermiT.model.DLClause;
16import org.semanticweb.HermiT.model.DLPredicate;
17import org.semanticweb.HermiT.model.Equality;
18import org.semanticweb.HermiT.model.Inequality;
19import org.semanticweb.HermiT.model.InverseRole;
20import org.semanticweb.HermiT.model.Variable;
21
22import uk.ac.ox.cs.pagoda.MyPrefixes;
23import uk.ac.ox.cs.pagoda.hermit.DLClauseHelper;
24import uk.ac.ox.cs.pagoda.multistage.Normalisation;
25import uk.ac.ox.cs.pagoda.reasoner.light.BasicQueryEngine;
26import uk.ac.ox.cs.pagoda.rules.OverApproxExist;
27import uk.ac.ox.cs.pagoda.rules.UpperDatalogProgram;
28import uk.ac.ox.cs.pagoda.util.Namespace;
29
30public class TrackingRuleEncoderDisjVar1 extends TrackingRuleEncoderWithGap {
31
32 public TrackingRuleEncoderDisjVar1(UpperDatalogProgram program, BasicQueryEngine store) {
33 super(program, store);
34 }
35
36 private Set<DLClause> disjunctiveRules = new HashSet<DLClause>();
37
38 @Override
39 public boolean encodingRules() {
40 if (super.encodingRules()) {
41 processDisjunctiveRules();
42 return true;
43 }
44 return false;
45 }
46
47 @Override
48 protected void encodingRule(DLClause clause) {
49 if (currentQuery.isBottom()) {
50// super.encodingRule(clause);
51 encodingBottomQueryClause(clause);
52 return ;
53 }
54
55 DLClause original = program.getCorrespondingClause(clause);
56 if (original.getHeadLength() <= 1) {
57 super.encodingRule(clause);
58 }
59 else {
60 if (!DLClauseHelper.hasSubsetBodyAtoms(clause, original))
61 super.encodingRule(clause);
62 addDisjunctiveRule(original);
63 }
64
65 }
66
67
68 private void processDisjunctiveRules() {
69 for (DLClause clause: disjunctiveRules)
70 encodingDisjunctiveRule(clause);
71 }
72
73 private Atom getAuxiliaryAtom(Atom headAtom) {
74 DLPredicate p = headAtom.getDLPredicate();
75 if (p instanceof AtLeast || p instanceof AtLeast) {
76 return Atom.create(generateAuxiliaryRule((AtLeast) p, true), headAtom.getArgument(0));
77 }
78 if (p instanceof AtomicConcept)
79 return Atom.create(generateAuxiliaryRule((AtomicConcept) p), headAtom.getArgument(0));
80 if (p instanceof AtomicRole)
81 return Atom.create(generateAuxiliaryRule((AtomicRole) p), headAtom.getArgument(0), headAtom.getArgument(1));
82 if (p instanceof Equality || p instanceof AnnotatedEquality)
83 return Atom.create(generateAuxiliaryRule(Equality.INSTANCE), headAtom.getArgument(0), headAtom.getArgument(1));
84 if (p instanceof Inequality)
85 return Atom.create(generateAuxiliaryRule((Inequality) p), headAtom.getArgument(0), headAtom.getArgument(1));
86
87 return null;
88 }
89
90 private Atom getTrackingAtom(Atom headAtom) {
91 DLPredicate p = headAtom.getDLPredicate();
92 if (p instanceof AtLeast) {
93 p = Normalisation.toAtLeastConcept((AtLeast) p);
94 return Atom.create(getTrackingDLPredicate(AtomicConcept.create(Normalisation.getAuxiliaryConcept4Disjunct((AtLeastConcept) p))), headAtom.getArgument(0));
95 }
96 if (p instanceof AtomicConcept)
97 return Atom.create(getTrackingDLPredicate((AtomicConcept) p), headAtom.getArgument(0));
98 if (p instanceof AtomicRole)
99 return Atom.create(getTrackingDLPredicate((AtomicRole) p), headAtom.getArgument(0), headAtom.getArgument(1));
100 if (p instanceof Equality || p instanceof AnnotatedEquality)
101 return Atom.create(getTrackingDLPredicate(Equality.INSTANCE), headAtom.getArgument(0), headAtom.getArgument(1));
102 if (p instanceof Inequality)
103 return Atom.create(getTrackingDLPredicate((Inequality) p), headAtom.getArgument(0), headAtom.getArgument(1));
104
105 return null;
106 }
107
108 private Atom getGapAtom(Atom headAtom) {
109 DLPredicate p = headAtom.getDLPredicate();
110 if (p instanceof AtLeast) {
111 p = Normalisation.toAtLeastConcept((AtLeast) p);
112 return Atom.create(getGapDLPredicate(AtomicConcept.create(Normalisation.getAuxiliaryConcept4Disjunct((AtLeastConcept) p))), headAtom.getArgument(0));
113 }
114 if (p instanceof AtomicConcept)
115 return Atom.create(getGapDLPredicate((AtomicConcept) p), headAtom.getArgument(0));
116 if (p instanceof AtomicRole)
117 return Atom.create(getGapDLPredicate((AtomicRole) p), headAtom.getArgument(0), headAtom.getArgument(1));
118 if (p instanceof Equality || p instanceof AnnotatedEquality)
119 return Atom.create(getGapDLPredicate(Equality.INSTANCE), headAtom.getArgument(0), headAtom.getArgument(1));
120 if (p instanceof Inequality)
121 return Atom.create(getGapDLPredicate((Inequality) p), headAtom.getArgument(0), headAtom.getArgument(1));
122
123 return null;
124 }
125
126 private void encodingDisjunctiveRule(DLClause clause) {
127 int headLength = clause.getHeadLength();
128
129 Atom[] auxAtoms = new Atom[headLength];
130 for (int i = 0; i < headLength; ++i)
131 auxAtoms[i] = getAuxiliaryAtom(clause.getHeadAtom(i));
132
133 Atom[] trackingAtoms = new Atom[headLength];
134 for (int i = 0; i < headLength; ++i)
135 trackingAtoms[i] = getTrackingAtom(clause.getHeadAtom(i));
136
137 Atom[] gapAtoms = new Atom[headLength];
138 for (int i = 0; i < headLength; ++i)
139 gapAtoms[i] = getGapAtom(clause.getHeadAtom(i));
140
141 Atom[] bodyAtoms = clause.getBodyAtoms();
142
143 LinkedList<Atom> newHeadAtoms = new LinkedList<Atom>();
144 DLPredicate selected = AtomicConcept.create(getSelectedPredicate());
145 newHeadAtoms.add(Atom.create(selected, getIndividual4GeneralRule(clause)));
146
147 for (Atom atom: bodyAtoms) {
148 Atom newAtom = Atom.create(
149 getTrackingDLPredicate(atom.getDLPredicate()),
150 DLClauseHelper.getArguments(atom));
151 newHeadAtoms.add(newAtom);
152 }
153
154 DLClause newClause;
155 int index;
156 for (int j = 0; j < headLength; ++j) {
157 Atom[] newBodyAtoms = new Atom[headLength * 2 + bodyAtoms.length];
158 index = 0;
159 for (int i = 0; i < headLength; ++i, ++index)
160 newBodyAtoms[index] = gapAtoms[i];
161 for (int i = 0; i < headLength; ++i, ++index)
162 if (i != j)
163 newBodyAtoms[index] = auxAtoms[i];
164 else
165 newBodyAtoms[index] = trackingAtoms[i];
166
167 for (int i = 0; i < bodyAtoms.length; ++i, ++index)
168 newBodyAtoms[index] = bodyAtoms[i];
169
170 for (Atom atom: newHeadAtoms) {
171 newClause = DLClause.create(new Atom[] {atom}, newBodyAtoms);
172 addTrackingClause(newClause);
173 }
174 }
175 }
176
177 private void addTrackingClause(DLClause clause) {
178 trackingClauses.add(clause);
179 }
180
181 private void addDisjunctiveRule(DLClause clause) {
182 disjunctiveRules.add(clause);
183 }
184
185 private DLPredicate getAuxPredicate(DLPredicate p) {
186 if (p instanceof AtLeastConcept) {
187 StringBuilder builder = new StringBuilder(
188 Normalisation.getAuxiliaryConcept4Disjunct((AtLeastConcept) p));
189 builder.append("_AUXa").append(currentQuery.getQueryID());
190 return AtomicConcept.create(builder.toString());
191 }
192
193 return getDLPredicate(p, "_AUXa" + currentQuery.getQueryID());
194 }
195
196 private DLPredicate getTrackingBottomDLPredicate(DLPredicate p) {
197 return getDLPredicate(p, getTrackingSuffix("0"));
198 }
199
200 private DLPredicate generateAuxiliaryRule(AtLeast p1, boolean withAux) {
201 AtLeastConcept p = Normalisation.toAtLeastConcept(p1);
202
203 int num = p.getNumber();
204 Variable[] Ys = new Variable[num];
205 if (num > 1)
206 for (int i = 0; i < num; ++i)
207 Ys[i] = Variable.create("Y" + (i + 1));
208 else
209 Ys[0] = Y;
210
211 Collection<Atom> expandedAtom = new LinkedList<Atom>();
212 Collection<Atom> representativeAtom = new LinkedList<Atom>();
213 if (p.getOnRole() instanceof AtomicRole) {
214 AtomicRole r = (AtomicRole) p.getOnRole();
215 for (int i = 0; i < num; ++i)
216 expandedAtom.add(Atom.create(r, X, Ys[i]));
217 representativeAtom.add(Atom.create(r, X, Ys[0]));
218 }
219 else {
220 AtomicRole r = ((InverseRole) p.getOnRole()).getInverseOf();
221 for (int i = 0; i < num; ++i)
222 expandedAtom.add(Atom.create(r, Ys[i], X));
223 representativeAtom.add(Atom.create(r, Ys[0], X));
224 }
225
226 if (num > 1) {
227 representativeAtom.add(Atom.create(Inequality.INSTANCE, Ys[0], Ys[1]));
228 }
229 for (int i = 0; i < num; ++i)
230 for (int j = i + 1; j < num; ++j)
231 expandedAtom.add(Atom.create(Inequality.INSTANCE, Ys[i], Ys[j]));
232
233 if (!p.getToConcept().equals(AtomicConcept.THING)) {
234 AtomicConcept c;
235 if (p.getToConcept() instanceof AtomicConcept)
236 c = (AtomicConcept) p.getToConcept();
237 else {
238 c = OverApproxExist.getNegationConcept(((AtomicNegationConcept) p.getToConcept()).getNegatedAtomicConcept());
239 }
240 for (int i = 0; i < num; ++i)
241 expandedAtom.add(Atom.create(c, Ys[i]));
242 representativeAtom.add(Atom.create(c, Ys[0]));
243 }
244
245 AtomicConcept ac = AtomicConcept.create(Normalisation.getAuxiliaryConcept4Disjunct(p));
246 DLPredicate trackingPredicate = getTrackingDLPredicate(ac);
247 DLPredicate gapPredicate = getGapDLPredicate(ac);
248 DLPredicate auxPredicate = withAux ? getAuxPredicate(p) : null;
249
250 for (Atom atom: representativeAtom) {
251 Atom[] bodyAtoms = new Atom[expandedAtom.size() + 1];
252 if (atom.getArity() == 1)
253 bodyAtoms[0] = Atom.create(getTrackingDLPredicate(atom.getDLPredicate()), atom.getArgument(0));
254 else
255 bodyAtoms[0] = Atom.create(getTrackingDLPredicate(atom.getDLPredicate()), atom.getArgument(0), atom.getArgument(1));
256 int i = 0;
257 for (Atom bodyAtom: expandedAtom)
258 bodyAtoms[++i] = bodyAtom;
259 addTrackingClause(DLClause.create(new Atom[] {Atom.create(trackingPredicate, X)}, bodyAtoms));
260
261 bodyAtoms = new Atom[expandedAtom.size() + 1];
262 if (atom.getArity() == 1)
263 bodyAtoms[0] = Atom.create(getGapDLPredicate(atom.getDLPredicate()), atom.getArgument(0));
264 else
265 bodyAtoms[0] = Atom.create(getGapDLPredicate(atom.getDLPredicate()), atom.getArgument(0), atom.getArgument(1));
266 i = 0;
267 for (Atom bodyAtom: expandedAtom)
268 bodyAtoms[++i] = bodyAtom;
269 addTrackingClause(DLClause.create(new Atom[] {Atom.create(gapPredicate, X)}, bodyAtoms));
270
271 if (withAux) {
272 bodyAtoms = new Atom[expandedAtom.size() + 1];
273 bodyAtoms[0] = getAuxiliaryAtom(atom);
274 i = 0;
275 for (Atom bodyAtom: expandedAtom)
276 bodyAtoms[++i] = bodyAtom;
277 addTrackingClause(DLClause.create(new Atom[] {Atom.create(auxPredicate, X)}, bodyAtoms));
278 }
279 }
280
281 return withAux ? auxPredicate : trackingPredicate;
282 }
283
284 private DLPredicate generateAuxiliaryRule(AtomicRole p) {
285 if (currentQuery.isBottom())
286 return getTrackingDLPredicate(p);
287
288 DLPredicate ret = getAuxPredicate(p);
289 Atom[] headAtom = new Atom[] {Atom.create(ret, X, Y)};
290
291 addTrackingClause(
292 DLClause.create(headAtom, new Atom[] {Atom.create(getTrackingDLPredicate(p), X, Y)}));
293 addTrackingClause(
294 DLClause.create(headAtom, new Atom[] {Atom.create(getTrackingBottomDLPredicate(p), X, Y)}));
295
296 return ret;
297 }
298
299 private Variable X = Variable.create("X"), Y = Variable.create("Y");
300
301 private DLPredicate generateAuxiliaryRule(AtomicConcept p) {
302 if (currentQuery.isBottom())
303 return getTrackingDLPredicate(p);
304
305 DLPredicate ret = getAuxPredicate(p);
306 Atom[] headAtom = new Atom[] {Atom.create(ret, X)};
307 addTrackingClause(
308 DLClause.create(headAtom,
309 new Atom[] { Atom.create(getTrackingDLPredicate(p), X)}));
310 addTrackingClause(
311 DLClause.create(headAtom,
312 new Atom[] { Atom.create(getTrackingBottomDLPredicate(p), X)}));
313
314 return ret;
315 }
316
317 private DLPredicate generateAuxiliaryRule(Equality instance) {
318 return generateAuxiliaryRule(AtomicRole.create(Namespace.EQUALITY));
319 }
320
321 private DLPredicate generateAuxiliaryRule(Inequality instance) {
322 return generateAuxiliaryRule(AtomicRole.create(Namespace.INEQUALITY));
323 }
324
325 @Override
326 public String getTrackingProgram() {
327 StringBuilder sb = getTrackingProgramBody();
328 if (currentQuery.isBottom())
329 sb.append(getBottomTrackingProgram());
330 sb.insert(0, MyPrefixes.PAGOdAPrefixes.prefixesText());
331 return sb.toString();
332 }
333
334 private String bottomTrackingProgram = null;
335
336 private String getBottomTrackingProgram() {
337 if (bottomTrackingProgram != null) return bottomTrackingProgram.replace("_tn", getTrackingPredicate(""));
338
339 String bottomSuffix = getTrackingSuffix("0");
340 LinkedList<DLClause> clauses = new LinkedList<DLClause>();
341 Variable X = Variable.create("X");
342 for (String concept: unaryPredicates)
343 clauses.add(DLClause.create(new Atom[] {Atom.create(AtomicConcept.create(concept + bottomSuffix) , X)},
344 new Atom[] {Atom.create(AtomicConcept.create(concept + "_tn"), X)}));
345 Variable Y = Variable.create("Y");
346 for (String role: binaryPredicates)
347 clauses.add(DLClause.create(new Atom[] {Atom.create(AtomicRole.create(role + bottomSuffix) , X, Y)},
348 new Atom[] {Atom.create(AtomicRole.create(role + "_tn"), X, Y) }));
349
350 StringBuilder builder = new StringBuilder(DLClauseHelper.toString(clauses));
351 bottomTrackingProgram = builder.toString();
352 return bottomTrackingProgram.replace("_tn", getTrackingPredicate(""));
353 }
354
355 private void encodingBottomQueryClause(DLClause clause) {
356 if (!clause.toString().contains("owl:Nothing"))
357 clause = program.getCorrespondingClause(clause);
358
359// Term t;
360// for (Atom tAtom: clause.getHeadAtoms()) {
361// for (int i = 0; i < tAtom.getArity(); ++i)
362// if ((t = tAtom.getArgument(i)) instanceof Individual)
363// if (((Individual) t).getIRI().startsWith(OverApproxExist.skolemisedIndividualPrefix))
364// clause = program.getCorrespondingClause(clause);
365// }
366
367 LinkedList<Atom> newHeadAtoms = new LinkedList<Atom>();
368 Atom selectAtom = Atom.create(selected, getIndividual4GeneralRule(program.getCorrespondingClause(clause)));
369
370 for (Atom atom: clause.getBodyAtoms()) {
371 atom = Atom.create(
372 getTrackingDLPredicate(atom.getDLPredicate()),
373 DLClauseHelper.getArguments(atom));
374 newHeadAtoms.add(atom);
375 }
376
377 DLClause newClause;
378
379 boolean botInHead = clause.getBodyLength() == 1 && clause.getBodyAtom(0).getDLPredicate().toString().contains("owl:Nothing");
380
381 DLPredicate[] trackingPredicates = new DLPredicate[clause.getHeadLength()];
382 DLPredicate[] predicates = new DLPredicate[clause.getHeadLength()];
383 int headIndex = 0;
384 DLPredicate trackingPredicate, p;
385 for (Atom headAtom: clause.getHeadAtoms()) {
386 if ((p = headAtom.getDLPredicate()) instanceof AtLeastConcept) {
387 trackingPredicate = generateAuxiliaryRule((AtLeastConcept) p, false);
388 p = AtomicConcept.create(Normalisation.getAuxiliaryConcept4Disjunct((AtLeastConcept) p));
389 trackingClauses.add(DLClause.create(
390 new Atom[] { Atom.create(getDLPredicate(p, getTrackingSuffix("0")), X) },
391 new Atom[] { Atom.create(trackingPredicate, X) }));
392 }
393 else
394 trackingPredicate = getTrackingDLPredicate(p);
395
396 trackingPredicates[headIndex] = trackingPredicate;
397 predicates[headIndex] = p;
398 ++headIndex;
399 }
400
401 headIndex = 0;
402 int headLength = clause.getHeadLength();
403 Atom[] gapAtoms = new Atom[headLength];
404 for (int i = 0; i < headLength; ++i)
405 gapAtoms[i] = getGapAtom(clause.getHeadAtom(i));
406// Atom.create(getGapDLPredicate(predicates[headIndex]), DLClauseHelper.getArguments(clause.getHeadAtom(i)));
407 int index, selectIndex;
408 for (Atom headAtom: clause.getHeadAtoms()) {
409 index = 0; selectIndex = 0;
410 Atom[] newBodyAtoms = new Atom[clause.getBodyLength() + 1 + headLength - 1 + (botInHead ? 0 : headLength)];
411 Atom[] selectBodyAtoms = new Atom[clause.getBodyLength() + 1 + (botInHead ? 0 : headLength)];
412 newBodyAtoms[index++] = selectBodyAtoms[selectIndex++] = Atom.create(trackingPredicates[headIndex], DLClauseHelper.getArguments(headAtom));
413
414 if (!botInHead) {
415 for (int i = 0; i < headLength; ++i)
416 newBodyAtoms[index++] = selectBodyAtoms[selectIndex++] = gapAtoms[i];
417 }
418
419 for (int i = 0; i < headLength; ++i)
420 if (i != headIndex) {
421 newBodyAtoms[index++] = Atom.create(getDLPredicate(predicates[i], getTrackingSuffix("0")), DLClauseHelper.getArguments(clause.getHeadAtom(i)));
422 }
423
424 for (int i = 0; i < clause.getBodyLength(); ++i)
425 newBodyAtoms[index++] = selectBodyAtoms[selectIndex++] = clause.getBodyAtom(i);
426
427 for (Atom atom: newHeadAtoms) {
428 newClause = DLClause.create(new Atom[] {atom}, newBodyAtoms);
429 trackingClauses.add(newClause);
430 }
431 trackingClauses.add(DLClause.create(new Atom[] {selectAtom}, selectBodyAtoms));
432 ++headIndex;
433 }
434 }
435
436}