aboutsummaryrefslogtreecommitdiff
path: root/src/uk/ac/ox/cs/pagoda/tracking/TrackingRuleEncoderDisj1.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/uk/ac/ox/cs/pagoda/tracking/TrackingRuleEncoderDisj1.java')
-rw-r--r--src/uk/ac/ox/cs/pagoda/tracking/TrackingRuleEncoderDisj1.java187
1 files changed, 187 insertions, 0 deletions
diff --git a/src/uk/ac/ox/cs/pagoda/tracking/TrackingRuleEncoderDisj1.java b/src/uk/ac/ox/cs/pagoda/tracking/TrackingRuleEncoderDisj1.java
new file mode 100644
index 0000000..e72ed96
--- /dev/null
+++ b/src/uk/ac/ox/cs/pagoda/tracking/TrackingRuleEncoderDisj1.java
@@ -0,0 +1,187 @@
1package uk.ac.ox.cs.pagoda.tracking;
2
3import java.util.LinkedList;
4
5import org.semanticweb.HermiT.model.AtLeastConcept;
6import org.semanticweb.HermiT.model.Atom;
7import org.semanticweb.HermiT.model.AtomicConcept;
8import org.semanticweb.HermiT.model.AtomicNegationConcept;
9import org.semanticweb.HermiT.model.AtomicRole;
10import org.semanticweb.HermiT.model.DLClause;
11import org.semanticweb.HermiT.model.DLPredicate;
12import org.semanticweb.HermiT.model.Individual;
13import org.semanticweb.HermiT.model.Inequality;
14import org.semanticweb.HermiT.model.InverseRole;
15import org.semanticweb.HermiT.model.Term;
16import org.semanticweb.HermiT.model.Variable;
17
18import uk.ac.ox.cs.pagoda.MyPrefixes;
19import uk.ac.ox.cs.pagoda.hermit.DLClauseHelper;
20import uk.ac.ox.cs.pagoda.multistage.Normalisation;
21import uk.ac.ox.cs.pagoda.reasoner.light.BasicQueryEngine;
22import uk.ac.ox.cs.pagoda.rules.OverApproxExist;
23import uk.ac.ox.cs.pagoda.rules.UpperDatalogProgram;
24
25public class TrackingRuleEncoderDisj1 extends TrackingRuleEncoderDisj {
26
27 public TrackingRuleEncoderDisj1(UpperDatalogProgram program, BasicQueryEngine store) {
28 super(program, store);
29 }
30
31 @Override
32 public boolean encodingRules() {
33 if (super.encodingRules()) {
34 processDisjunctiveRules();
35 return true;
36 }
37 return false;
38 }
39
40 @Override
41 protected void encodingRule(DLClause clause) {
42 if (currentQuery.isBottom()) {
43 super.encodingRule(clause);
44 return ;
45 }
46
47 DLClause original = program.getCorrespondingClause(clause);
48 if (original.getHeadLength() <= 1) {
49 super.encodingRule(clause);
50 }
51 else addDisjunctiveRule(original, clause);
52 }
53
54 private DLPredicate getAuxPredicate(DLPredicate p, Individual... individuals) {
55 if (p instanceof AtLeastConcept) {
56 StringBuilder builder = new StringBuilder(
57 Normalisation.getAuxiliaryConcept4Disjunct((AtLeastConcept) p, individuals));
58 builder.append("_AUXa").append(currentQuery.getQueryID());
59 return AtomicConcept.create(builder.toString());
60 }
61
62 return getDLPredicate(p, "_AUXa" + currentQuery.getQueryID());
63 }
64
65 private DLPredicate getTrackingBottomDLPredicate(DLPredicate p) {
66 return getDLPredicate(p, getTrackingSuffix("0"));
67 }
68
69 protected DLPredicate generateAuxiliaryRule(AtLeastConcept p, DLClause original, Individual[] individuals) {
70 DLPredicate ret = getAuxPredicate(p, individuals);
71 Atom[] headAtom = new Atom[] {Atom.create(ret, X)};
72
73 AtomicRole role = p.getOnRole() instanceof AtomicRole ?
74 (AtomicRole) p.getOnRole():
75 ((InverseRole) p.getOnRole()).getInverseOf();
76
77 AtomicConcept concept = p.getToConcept() instanceof AtomicConcept ?
78 (AtomicConcept) p.getToConcept() :
79 OverApproxExist.getNegationConcept(((AtomicNegationConcept) p.getToConcept()).getNegatedAtomicConcept());
80
81 Term[] roleArgs, conceptArg;
82 for (Individual i: individuals) {
83// Variable i = Variable.create("Y");
84 if (p.getOnRole() instanceof AtomicRole) {
85 roleArgs = new Term[] {X, i};
86 conceptArg = new Term[] {i};
87 }
88 else {
89 roleArgs = new Term[] {i, X};
90 conceptArg = new Term[] {i};
91 }
92
93 addTrackingClause(
94 DLClause.create(headAtom,
95 new Atom[] {Atom.create(getTrackingDLPredicate(role), roleArgs)}));
96
97 addTrackingClause(
98 DLClause.create(headAtom,
99 new Atom[] {Atom.create(getTrackingBottomDLPredicate(role), roleArgs)}));
100
101 Atom guard = Atom.create(role, roleArgs);
102
103 if (!concept.equals(AtomicConcept.THING)) {
104 addTrackingClause(
105 DLClause.create(headAtom,
106 new Atom[] {guard, Atom.create(getTrackingDLPredicate(concept), conceptArg)}));
107
108 addTrackingClause(
109 DLClause.create(headAtom,
110 new Atom[] {guard, Atom.create(getTrackingBottomDLPredicate(concept), conceptArg)}));
111 }
112 }
113
114 return ret;
115 }
116
117 protected DLPredicate generateAuxiliaryRule(AtomicRole p) {
118 DLPredicate ret = getAuxPredicate(p);
119 Atom[] headAtom = new Atom[] {Atom.create(ret, X, Y)};
120
121 addTrackingClause(
122 DLClause.create(headAtom, new Atom[] {Atom.create(getTrackingDLPredicate(p), X, Y)}));
123 addTrackingClause(
124 DLClause.create(headAtom, new Atom[] {Atom.create(getTrackingBottomDLPredicate(p), X, Y)}));
125
126 return ret;
127 }
128
129 private Variable X = Variable.create("X"), Y = Variable.create("Y");
130
131 protected DLPredicate generateAuxiliaryRule(AtomicConcept p) {
132 DLPredicate ret = getAuxPredicate(p);
133 Atom[] headAtom = new Atom[] {Atom.create(ret, X)};
134 addTrackingClause(
135 DLClause.create(headAtom,
136 new Atom[] { Atom.create(getTrackingDLPredicate(p), X)}));
137 addTrackingClause(
138 DLClause.create(headAtom,
139 new Atom[] { Atom.create(getTrackingBottomDLPredicate(p), X)}));
140
141 return ret;
142 }
143
144 protected DLPredicate generateAuxiliaryRule(Inequality instance) {
145 // TODO:
146 return null;
147 }
148
149 @Override
150 public boolean isAuxPredicate(String iri) {
151 return iri.contains("_AUXa");
152// if (iri.startsWith("<"))
153// return iri.endsWith("_AUXa" + currentQuery.getQueryID() + ">");
154// return iri.endsWith("_AUXa" + currentQuery.getQueryID());
155 }
156
157 @Override
158 public String getTrackingProgram() {
159 StringBuilder sb = getTrackingProgramBody();
160 if (currentQuery.isBottom())
161 sb.append(getBottomTrackingProgram());
162 sb.insert(0, MyPrefixes.PAGOdAPrefixes.prefixesText());
163 return sb.toString();
164 }
165
166 private String bottomTrackingProgram = null;
167
168 private String getBottomTrackingProgram() {
169 if (bottomTrackingProgram != null) return bottomTrackingProgram.replace("_tn", getTrackingPredicate(""));
170
171 String bottomSuffix = getTrackingSuffix("0");
172 LinkedList<DLClause> clauses = new LinkedList<DLClause>();
173 Variable X = Variable.create("X");
174 for (String concept: unaryPredicates)
175 clauses.add(DLClause.create(new Atom[] {Atom.create(AtomicConcept.create(concept + bottomSuffix) , X)},
176 new Atom[] {Atom.create(AtomicConcept.create(concept + "_tn"), X)}));
177 Variable Y = Variable.create("Y");
178 for (String role: binaryPredicates)
179 clauses.add(DLClause.create(new Atom[] {Atom.create(AtomicRole.create(role + bottomSuffix) , X, Y)},
180 new Atom[] {Atom.create(AtomicRole.create(role + "_tn"), X, Y) }));
181
182 StringBuilder builder = new StringBuilder(DLClauseHelper.toString(clauses));
183 bottomTrackingProgram = builder.toString();
184 return bottomTrackingProgram.replace("_tn", getTrackingPredicate(""));
185 }
186
187}