diff options
Diffstat (limited to 'src/uk/ac/ox/cs/pagoda/tracking/TrackingRuleEncoderDisj2.java')
| -rw-r--r-- | src/uk/ac/ox/cs/pagoda/tracking/TrackingRuleEncoderDisj2.java | 124 |
1 files changed, 124 insertions, 0 deletions
diff --git a/src/uk/ac/ox/cs/pagoda/tracking/TrackingRuleEncoderDisj2.java b/src/uk/ac/ox/cs/pagoda/tracking/TrackingRuleEncoderDisj2.java new file mode 100644 index 0000000..6cf239f --- /dev/null +++ b/src/uk/ac/ox/cs/pagoda/tracking/TrackingRuleEncoderDisj2.java | |||
| @@ -0,0 +1,124 @@ | |||
| 1 | package uk.ac.ox.cs.pagoda.tracking; | ||
| 2 | |||
| 3 | import org.semanticweb.HermiT.model.AtLeastConcept; | ||
| 4 | import org.semanticweb.HermiT.model.Atom; | ||
| 5 | import org.semanticweb.HermiT.model.AtomicConcept; | ||
| 6 | import org.semanticweb.HermiT.model.AtomicNegationConcept; | ||
| 7 | import org.semanticweb.HermiT.model.AtomicRole; | ||
| 8 | import org.semanticweb.HermiT.model.DLClause; | ||
| 9 | import org.semanticweb.HermiT.model.DLPredicate; | ||
| 10 | import org.semanticweb.HermiT.model.Individual; | ||
| 11 | import org.semanticweb.HermiT.model.Inequality; | ||
| 12 | import org.semanticweb.HermiT.model.InverseRole; | ||
| 13 | import org.semanticweb.HermiT.model.Term; | ||
| 14 | import org.semanticweb.HermiT.model.Variable; | ||
| 15 | |||
| 16 | import uk.ac.ox.cs.pagoda.MyPrefixes; | ||
| 17 | import uk.ac.ox.cs.pagoda.multistage.Normalisation; | ||
| 18 | import uk.ac.ox.cs.pagoda.query.QueryRecord; | ||
| 19 | import uk.ac.ox.cs.pagoda.reasoner.light.BasicQueryEngine; | ||
| 20 | import uk.ac.ox.cs.pagoda.rules.OverApproxExist; | ||
| 21 | import uk.ac.ox.cs.pagoda.rules.UpperDatalogProgram; | ||
| 22 | |||
| 23 | public class TrackingRuleEncoderDisj2 extends TrackingRuleEncoderDisj { | ||
| 24 | |||
| 25 | public TrackingRuleEncoderDisj2(UpperDatalogProgram program, BasicQueryEngine store) { | ||
| 26 | super(program, store); | ||
| 27 | } | ||
| 28 | |||
| 29 | @Override | ||
| 30 | public boolean encodingRules() { | ||
| 31 | if (ruleEncoded) return false; | ||
| 32 | ruleEncoded = true; | ||
| 33 | |||
| 34 | for (DLClause clause: program.getClauses()) { | ||
| 35 | encodingRule(clause); | ||
| 36 | } | ||
| 37 | |||
| 38 | if (disjunctiveRules.isEmpty()) | ||
| 39 | return true; | ||
| 40 | |||
| 41 | processDisjunctiveRules(); | ||
| 42 | return false; | ||
| 43 | } | ||
| 44 | |||
| 45 | @Override | ||
| 46 | protected DLPredicate generateAuxiliaryRule(AtomicConcept p) { | ||
| 47 | return getTrackingDLPredicate(p); | ||
| 48 | } | ||
| 49 | |||
| 50 | @Override | ||
| 51 | protected DLPredicate generateAuxiliaryRule(AtomicRole p) { | ||
| 52 | return getTrackingDLPredicate(p); | ||
| 53 | } | ||
| 54 | |||
| 55 | private Variable X = Variable.create("X"); | ||
| 56 | |||
| 57 | @Override | ||
| 58 | protected DLPredicate generateAuxiliaryRule(AtLeastConcept p, DLClause original, Individual[] individuals) { | ||
| 59 | DLPredicate ret = AtomicConcept.create(getTrackingPredicate(Normalisation.getAuxiliaryConcept4Disjunct((AtLeastConcept) p, individuals))); | ||
| 60 | Atom[] headAtom = new Atom[] {Atom.create(ret, X)}; | ||
| 61 | |||
| 62 | AtomicRole role = p.getOnRole() instanceof AtomicRole ? | ||
| 63 | (AtomicRole) p.getOnRole(): | ||
| 64 | ((InverseRole) p.getOnRole()).getInverseOf(); | ||
| 65 | |||
| 66 | AtomicConcept concept = p.getToConcept() instanceof AtomicConcept ? | ||
| 67 | (AtomicConcept) p.getToConcept() : | ||
| 68 | OverApproxExist.getNegationConcept(((AtomicNegationConcept) p.getToConcept()).getNegatedAtomicConcept()); | ||
| 69 | |||
| 70 | Term[] roleArgs, conceptArg; | ||
| 71 | for (Individual i: individuals) { | ||
| 72 | // Variable i = Variable.create("Y"); | ||
| 73 | if (p.getOnRole() instanceof AtomicRole) { | ||
| 74 | roleArgs = new Term[] {X, i}; | ||
| 75 | conceptArg = new Term[] {i}; | ||
| 76 | } | ||
| 77 | else { | ||
| 78 | roleArgs = new Term[] {i, X}; | ||
| 79 | conceptArg = new Term[] {i}; | ||
| 80 | } | ||
| 81 | |||
| 82 | addTrackingClause( | ||
| 83 | DLClause.create(headAtom, | ||
| 84 | new Atom[] {Atom.create(getTrackingDLPredicate(role), roleArgs)})); | ||
| 85 | |||
| 86 | Atom guard = Atom.create(role, roleArgs); | ||
| 87 | |||
| 88 | if (!concept.equals(AtomicConcept.THING)) { | ||
| 89 | addTrackingClause( | ||
| 90 | DLClause.create(headAtom, | ||
| 91 | new Atom[] {guard, Atom.create(getTrackingDLPredicate(concept), conceptArg)})); | ||
| 92 | } | ||
| 93 | } | ||
| 94 | |||
| 95 | return ret; | ||
| 96 | } | ||
| 97 | |||
| 98 | @Override | ||
| 99 | protected void encodingRule(DLClause clause) { | ||
| 100 | DLClause original = program.getCorrespondingClause(clause); | ||
| 101 | if (original.getHeadLength() <= 1) { | ||
| 102 | super.encodingRule(clause); | ||
| 103 | } | ||
| 104 | else addDisjunctiveRule(original, clause); | ||
| 105 | } | ||
| 106 | |||
| 107 | @Override | ||
| 108 | public String getTrackingProgram() { | ||
| 109 | StringBuilder sb = getTrackingProgramBody(); | ||
| 110 | sb.insert(0, MyPrefixes.PAGOdAPrefixes.prefixesText()); | ||
| 111 | return sb.toString(); | ||
| 112 | } | ||
| 113 | |||
| 114 | @Override | ||
| 115 | protected void encodingAtomicQuery(QueryRecord[] botQuerRecords) { | ||
| 116 | super.encodingAtomicQuery(botQuerRecords, true); | ||
| 117 | } | ||
| 118 | |||
| 119 | @Override | ||
| 120 | protected DLPredicate generateAuxiliaryRule(Inequality instance) { | ||
| 121 | // TODO Auto-generated method stub | ||
| 122 | return null; | ||
| 123 | } | ||
| 124 | } | ||
