aboutsummaryrefslogtreecommitdiff
path: root/src/uk/ac/ox/cs/pagoda/tracking/TrackingRuleEncoderDisj.java
diff options
context:
space:
mode:
authoryzhou <yujiao.zhou@gmail.com>2015-04-21 10:34:27 +0100
committeryzhou <yujiao.zhou@gmail.com>2015-04-21 10:34:27 +0100
commit9ce65c5a963b03ee97fe9cb6c5aa65a3c04a80a8 (patch)
tree47511c0fb89dccff0db4b5990522e04f294d795b /src/uk/ac/ox/cs/pagoda/tracking/TrackingRuleEncoderDisj.java
parentb1ac207612ee8b045244253fb94b866104bc34f2 (diff)
downloadACQuA-9ce65c5a963b03ee97fe9cb6c5aa65a3c04a80a8.tar.gz
ACQuA-9ce65c5a963b03ee97fe9cb6c5aa65a3c04a80a8.zip
initial version
Diffstat (limited to 'src/uk/ac/ox/cs/pagoda/tracking/TrackingRuleEncoderDisj.java')
-rw-r--r--src/uk/ac/ox/cs/pagoda/tracking/TrackingRuleEncoderDisj.java178
1 files changed, 178 insertions, 0 deletions
diff --git a/src/uk/ac/ox/cs/pagoda/tracking/TrackingRuleEncoderDisj.java b/src/uk/ac/ox/cs/pagoda/tracking/TrackingRuleEncoderDisj.java
new file mode 100644
index 0000000..cee829f
--- /dev/null
+++ b/src/uk/ac/ox/cs/pagoda/tracking/TrackingRuleEncoderDisj.java
@@ -0,0 +1,178 @@
1package uk.ac.ox.cs.pagoda.tracking;
2
3import java.util.Collection;
4import java.util.Collections;
5import java.util.HashMap;
6import java.util.HashSet;
7import java.util.Iterator;
8import java.util.LinkedList;
9import java.util.Map;
10
11import org.semanticweb.HermiT.model.AnnotatedEquality;
12import org.semanticweb.HermiT.model.AtLeastConcept;
13import org.semanticweb.HermiT.model.Atom;
14import org.semanticweb.HermiT.model.AtomicConcept;
15import org.semanticweb.HermiT.model.AtomicRole;
16import org.semanticweb.HermiT.model.DLClause;
17import org.semanticweb.HermiT.model.DLPredicate;
18import org.semanticweb.HermiT.model.Equality;
19import org.semanticweb.HermiT.model.Individual;
20import org.semanticweb.HermiT.model.Inequality;
21
22import uk.ac.ox.cs.pagoda.hermit.DLClauseHelper;
23import uk.ac.ox.cs.pagoda.reasoner.light.BasicQueryEngine;
24import uk.ac.ox.cs.pagoda.rules.OverApproxExist;
25import uk.ac.ox.cs.pagoda.rules.UpperDatalogProgram;
26import uk.ac.ox.cs.pagoda.util.Namespace;
27
28public abstract class TrackingRuleEncoderDisj extends TrackingRuleEncoderWithGap {
29
30 public TrackingRuleEncoderDisj(UpperDatalogProgram program, BasicQueryEngine store) {
31 super(program, store);
32 }
33
34 protected Map<DLClause, Collection<DLClause>> disjunctiveRules = new HashMap<DLClause, Collection<DLClause>>();
35
36 /**
37 *
38 */
39 protected void processDisjunctiveRules() {
40 Map<Atom, Collection<DLClause>> auxiliaryAtoms = new HashMap<Atom, Collection<DLClause>>();
41 Map<Individual, Collection<DLClause>> skolemisedAtoms = new HashMap<Individual, Collection<DLClause>>();
42
43 for (Map.Entry<DLClause, Collection<DLClause>> entry: disjunctiveRules.entrySet()) {
44 DLClause original = entry.getKey();
45 Collection<DLClause> overClauses = entry.getValue();
46
47 int index = 0;
48 for (Iterator<DLClause> iter = overClauses.iterator(); iter.hasNext();) {
49 DLClause subClause = iter.next();
50 if (DLClauseHelper.hasSubsetBodyAtoms(subClause, original)) {
51 Atom headAtom = subClause.getHeadAtom(0);
52 if ((index = OverApproxExist.indexOfSkolemisedIndividual(headAtom)) != -1) {
53 Individual i = (Individual) headAtom.getArgument(index);
54 Collection<DLClause> clauses = skolemisedAtoms.get(i);
55 if (clauses == null) {
56 clauses = new HashSet<DLClause>();
57 skolemisedAtoms.put(i, clauses);
58 }
59 clauses.add(subClause);
60 }
61 else
62 auxiliaryAtoms.put(getAuxiliaryAtom(original, subClause.getHeadAtom(0)), Collections.singleton(subClause));
63 }
64 else
65 super.encodingRule(subClause);
66 }
67
68 for (Atom headAtom: original.getHeadAtoms())
69 if (headAtom.getDLPredicate() instanceof AtLeastConcept) {
70 AtLeastConcept alc = (AtLeastConcept) headAtom.getDLPredicate();
71 Collection<DLClause> clauses = new HashSet<DLClause>();
72 Individual[] individuals = new Individual[alc.getNumber()];
73 for (int i = 0; i < alc.getNumber(); ++i) {
74 individuals[i] = OverApproxExist.getNewIndividual(original, i);
75 clauses.addAll(skolemisedAtoms.get(individuals[i]));
76 }
77 auxiliaryAtoms.put(getAuxiliaryAtom(original, headAtom, individuals), clauses);
78 }
79
80 index = 0;
81 Atom[] auxAtoms = auxiliaryAtoms.keySet().toArray(new Atom[0]);
82 for (Atom atom: auxAtoms) {
83 for (DLClause subClause: auxiliaryAtoms.get(atom))
84 encodingDisjunctiveRule(subClause, index, auxAtoms);
85 index++;
86 }
87
88 auxiliaryAtoms.clear();
89 }
90 }
91
92 private Atom getAuxiliaryAtom(DLClause original, Atom headAtom, Individual... individuals) {
93 DLPredicate p = headAtom.getDLPredicate();
94 if (p instanceof AtLeastConcept) {
95// AtLeastConcept alc = (AtLeastConcept) p;
96// Individual[] individuals = new Individual[alc.getNumber()];
97// for (int i = 0; i < alc.getNumber(); ++i)
98// individuals[i] = OverApproxExist.getNewIndividual(original, i);
99 return Atom.create(generateAuxiliaryRule((AtLeastConcept) p, original, individuals), headAtom.getArgument(0));
100 }
101 if (p instanceof AtomicConcept)
102 return Atom.create(generateAuxiliaryRule((AtomicConcept) p), headAtom.getArgument(0));
103 if (p instanceof AtomicRole)
104 return Atom.create(generateAuxiliaryRule((AtomicRole) p), headAtom.getArgument(0), headAtom.getArgument(1));
105 if (p instanceof Equality || p instanceof AnnotatedEquality)
106 return Atom.create(generateAuxiliaryRule(Equality.INSTANCE), headAtom.getArgument(0), headAtom.getArgument(1));
107 if (p instanceof Inequality)
108 return Atom.create(generateAuxiliaryRule((Inequality) p), headAtom.getArgument(0), headAtom.getArgument(1));
109
110 return null;
111 }
112
113 private void encodingDisjunctiveRule(DLClause clause, int index, Atom[] auxAtoms) {
114 int validHeadLength = auxAtoms.length;
115 Atom headAtom = clause.getHeadAtom(0);
116 Atom[] bodyAtoms = clause.getBodyAtoms();
117
118 LinkedList<Atom> newHeadAtoms = new LinkedList<Atom>();
119 DLPredicate selected = AtomicConcept.create(getSelectedPredicate());
120 newHeadAtoms.add(Atom.create(selected, getIndividual4GeneralRule(clause)));
121
122 for (Atom atom: bodyAtoms) {
123 Atom newAtom = Atom.create(
124 getTrackingDLPredicate(atom.getDLPredicate()),
125 DLClauseHelper.getArguments(atom));
126 newHeadAtoms.add(newAtom);
127 }
128
129 DLClause newClause;
130 Atom[] newBodyAtoms = new Atom[bodyAtoms.length + validHeadLength + 1];
131
132 newBodyAtoms[0] = Atom.create(
133 getTrackingDLPredicate(headAtom.getDLPredicate()),
134 DLClauseHelper.getArguments(headAtom));
135
136 newBodyAtoms[1] = Atom.create(
137 getGapDLPredicate(headAtom.getDLPredicate()),
138 DLClauseHelper.getArguments(headAtom));
139
140 for (int i = 0; i < validHeadLength; ++i)
141 if (i != index)
142 newBodyAtoms[i + (i < index ? 2 : 1)] = auxAtoms[i];
143
144 for (int i = 0; i < bodyAtoms.length; ++i)
145 newBodyAtoms[i + validHeadLength + 1] = bodyAtoms[i];
146
147 for (Atom atom: newHeadAtoms) {
148 newClause = DLClause.create(new Atom[] {atom}, newBodyAtoms);
149 addTrackingClause(newClause);
150 }
151 }
152
153 protected void addTrackingClause(DLClause clause) {
154 trackingClauses.add(clause);
155 }
156
157 protected void addDisjunctiveRule(DLClause key, DLClause clause) {
158 Collection<DLClause> value = disjunctiveRules.get(key);
159 if (value == null) {
160 value = new LinkedList<DLClause>();
161 disjunctiveRules.put(key, value);
162 }
163 value.add(clause);
164 }
165
166 protected abstract DLPredicate generateAuxiliaryRule(AtLeastConcept p, DLClause original, Individual[] individuals);
167
168 protected abstract DLPredicate generateAuxiliaryRule(AtomicRole p);
169
170 protected abstract DLPredicate generateAuxiliaryRule(AtomicConcept p);
171
172 protected DLPredicate generateAuxiliaryRule(Equality instance) {
173 return generateAuxiliaryRule(AtomicRole.create(Namespace.EQUALITY));
174 }
175
176 protected abstract DLPredicate generateAuxiliaryRule(Inequality instance);
177
178}