From 0c2726db44b562cbda9bfa87e76d829927c31ec8 Mon Sep 17 00:00:00 2001 From: RncLsn Date: Tue, 12 May 2015 18:48:56 +0100 Subject: Added classes for implementing new upper store (Limited Skolemisation). Started implementation of the new classes. --- .../rules/LimitedSkolemisationApproximator.java | 72 ++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 src/uk/ac/ox/cs/pagoda/rules/LimitedSkolemisationApproximator.java (limited to 'src/uk/ac/ox/cs/pagoda/rules/LimitedSkolemisationApproximator.java') diff --git a/src/uk/ac/ox/cs/pagoda/rules/LimitedSkolemisationApproximator.java b/src/uk/ac/ox/cs/pagoda/rules/LimitedSkolemisationApproximator.java new file mode 100644 index 0000000..284edd2 --- /dev/null +++ b/src/uk/ac/ox/cs/pagoda/rules/LimitedSkolemisationApproximator.java @@ -0,0 +1,72 @@ +package uk.ac.ox.cs.pagoda.rules; + +import org.semanticweb.HermiT.model.DLClause; +import uk.ac.ox.cs.pagoda.multistage.AnswerTupleID; + +import java.util.*; + +/** + * Approximates existential rules by a limited form of Skolemisation. + *

+ * Given a rule and a grounding substitution, + * it Skolemises the rule if + * all the terms in the substitution have depth less than a given depth, + * otherwise it approximates using an alternative TupleDependentApproximator. + * + * */ +public class LimitedSkolemisationApproximator implements TupleDependentApproximator { + + private final int maxTermDepth; + private final TupleDependentApproximator alternativeApproximator; + + private Map mapIndividualsToDepth; + + public LimitedSkolemisationApproximator(int maxTermDepth) { + this(maxTermDepth, new ExistConstantApproximator()); + } + + public LimitedSkolemisationApproximator(int maxTermDepth, TupleDependentApproximator alternativeApproximator) { + this.maxTermDepth = maxTermDepth; + this.alternativeApproximator = alternativeApproximator; + this.mapIndividualsToDepth = new HashMap<>(); + } + + @Override + public Collection convert(DLClause clause, DLClause originalClause, Collection violationTuples) { + switch (clause.getHeadLength()) { + case 1: + return overApprox(clause, originalClause, violationTuples); + case 0: + return Arrays.asList(clause); + default: + ArrayList result = new ArrayList<>(); + // TODO implement + return result; + } + + + } + + private Collection overApprox(DLClause clause, DLClause originalClause, Collection violationTuples) { + ArrayList result = new ArrayList<>(); + + for (AnswerTupleID violationTuple : violationTuples) + if (getDepth(violationTuple) > maxTermDepth) + result.addAll(alternativeApproximator.convert(clause, originalClause, null)); + else + result.add(getInstantiatedSkolemisation(clause, originalClause, violationTuple)); + + return result; + } + + + private DLClause getInstantiatedSkolemisation(DLClause clause, DLClause originalClause, AnswerTupleID violationTuple) { + // TODO implement + return null; + } + + private int getDepth(AnswerTupleID violationTuple) { + if (!mapIndividualsToDepth.containsKey(violationTuple)) return 0; + return mapIndividualsToDepth.get(violationTuple); + } +} -- cgit v1.2.3