aboutsummaryrefslogtreecommitdiff
path: root/src/uk/ac/ox/cs/pagoda/rules/ExistentialToDisjunctive.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/uk/ac/ox/cs/pagoda/rules/ExistentialToDisjunctive.java')
-rw-r--r--src/uk/ac/ox/cs/pagoda/rules/ExistentialToDisjunctive.java77
1 files changed, 77 insertions, 0 deletions
diff --git a/src/uk/ac/ox/cs/pagoda/rules/ExistentialToDisjunctive.java b/src/uk/ac/ox/cs/pagoda/rules/ExistentialToDisjunctive.java
new file mode 100644
index 0000000..ebe0b7d
--- /dev/null
+++ b/src/uk/ac/ox/cs/pagoda/rules/ExistentialToDisjunctive.java
@@ -0,0 +1,77 @@
1package uk.ac.ox.cs.pagoda.rules;
2
3import java.util.Collection;
4import java.util.HashSet;
5import java.util.LinkedList;
6import java.util.Set;
7
8import org.semanticweb.HermiT.model.AtLeastConcept;
9import org.semanticweb.HermiT.model.Atom;
10import org.semanticweb.HermiT.model.AtomicRole;
11import org.semanticweb.HermiT.model.DLClause;
12import org.semanticweb.HermiT.model.DLPredicate;
13import org.semanticweb.owlapi.model.OWLObjectProperty;
14import org.semanticweb.owlapi.model.OWLOntology;
15import uk.ac.ox.cs.pagoda.constraints.BottomStrategy;
16
17public class ExistentialToDisjunctive extends UpperProgram {
18
19 Set<String> inverseFuncProperties = new HashSet<String>();
20
21 @Override
22 public void load(OWLOntology o, BottomStrategy bottomStrategy) {
23 super.load(o, bottomStrategy);
24 for (OWLObjectProperty prop: ontology.getObjectPropertiesInSignature(true))
25 if (!(ontology.getInverseFunctionalObjectPropertyAxioms(prop).isEmpty()))
26 inverseFuncProperties.add(prop.getIRI().toString());
27 ((RefinedOverApproxExist) m_approx).setInverseFuncProps(inverseFuncProperties);
28 }
29
30 @Override
31 protected void initApproximator() {
32 m_approx = new RefinedOverApproxExist();
33 }
34
35}
36
37class RefinedOverApproxExist implements Approximator {
38
39 Approximator approxExist = new OverApproxExist();
40 Set<String> inverseFuncProperties;
41
42 public void setInverseFuncProps(Set<String> set) {
43 inverseFuncProperties = set;
44 }
45
46 @Override
47 public Collection<DLClause> convert(DLClause clause, DLClause originalClause) {
48 DLPredicate p;
49 Collection<Atom> newHeadAtoms = new LinkedList<Atom>();
50 for (Atom headAtom: clause.getHeadAtoms())
51 newHeadAtoms.add(headAtom);
52
53 for (Atom headAtom: clause.getHeadAtoms()) {
54 p = headAtom.getDLPredicate();
55 if (isAtLeastOneOnInverseFuncProperties(p))
56 newHeadAtoms.add(headAtom);
57 }
58
59 if (newHeadAtoms.size() > clause.getHeadLength())
60 clause = DLClause.create(newHeadAtoms.toArray(new Atom[0]), clause.getBodyAtoms());
61
62 return approxExist.convert(clause, clause);
63 }
64
65 private boolean isAtLeastOneOnInverseFuncProperties(DLPredicate predicate) {
66 if (!(predicate instanceof AtLeastConcept))
67 return false;
68 AtLeastConcept atLeast = (AtLeastConcept) predicate;
69 if (!(atLeast.getOnRole() instanceof AtomicRole))
70 return false;
71
72 return atLeast.getNumber() == 1 && inverseFuncProperties.contains(((AtomicRole) atLeast.getOnRole()).getIRI());
73 }
74
75
76}
77