diff --git a/src/main/java/Main.java b/src/main/java/Main.java index 2da9d3a..e2e3a5d 100644 --- a/src/main/java/Main.java +++ b/src/main/java/Main.java @@ -1,23 +1,18 @@ import java.util.HashMap; +import java.util.List; import java.util.Map; -import com.google.common.collect.TreeMultimap; - import constants.Types; -import models.algebra.Constant; -import models.algebra.Expression; +import models.Position; import models.algebra.Type; import models.algebra.Variable; -import models.formulas.meta.MetaEquationFormula; import models.terms.Dependency; import models.terms.Resource; +import models.terms.meta.MatchConstraint; import models.terms.meta.MetaDynamicDependency; -import models.terms.meta.MetaDynamicDependencyTerm; import models.terms.meta.MetaEvaluatableTermVariable; import models.terms.meta.MetaRDLTerm; -import models.terms.meta.MetaResource; import models.terms.meta.MetaTermGenerator; -import utils.ExpressionUtils; public class Main { @@ -25,226 +20,53 @@ public static void main(String[] args) { // - sandbox(); - sandbox2(); - sandbox3(); - sandbox4(); - sandbox5(); - sandbox6(); + sandBox8(); + sandBox(); } - static void sandbox() { - Expression tmp = utils.ExpressionUtils.parse("x"); - System.out.println(tmp); - tmp = utils.ExpressionUtils.parse("(x + 5) * 3"); - Map nums = new HashMap<>(); - int a = utils.ExpressionUtils.getCoefficientAndConstantsFromExpression(tmp, nums, 1); - System.out.println(tmp); - System.out.println(a); - System.out.println(nums); - - int b = utils.ExpressionUtils.getConstantValue(new Constant("3")); - System.out.println(b); - } - - static void sandbox2() { - TreeMultimap tmp = TreeMultimap.create(); - tmp.put(1, 1); - tmp.put(1, 2); - tmp.put(1, 1); - tmp.put(1, 3); - System.out.println(tmp.get(1)); - } - - static void sandbox3() { - MetaDynamicDependency d1 = new MetaDynamicDependency((ci, cd, mi, md, context) -> new MetaResource(new Variable("x" + ci))); - MetaDynamicDependency d2 = new MetaDynamicDependency(new MetaTermGenerator() { - @Override - public MetaRDLTerm generate(int curIndex, int curDepth, int maxIndex, int maxDepth, Map context) { - if (curIndex == 0 && curDepth < maxDepth) return new MetaDynamicDependency(this); - else return new MetaResource(new Variable("x" + curIndex + "_" + curDepth)); - } - }); - d2.generate(0, 2, 2, null); - System.out.println(d2.generate(0, 2, 2, null)); - } - - static void sandbox4() { - MetaDynamicDependencyTerm t1 = new MetaDynamicDependencyTerm((ci, cd, mi, md, contex) -> new MetaResource(new Variable("x" + ci))); - MetaDynamicDependencyTerm t2 = new MetaDynamicDependencyTerm(new MetaTermGenerator() { - @Override - public MetaRDLTerm generate(int curIndex, int curDepth, int maxIndex, int maxDepth, Map context) { - if (curDepth == 0 && curIndex != 0 && curIndex % 2 == 0) { - return new MetaDynamicDependencyTerm(this); - } - return new MetaResource(new Variable("x" + curDepth + "_" + curIndex)); - } - }); - System.out.println(t1.generate(0, 5, 0, null)); - System.out.println(t2.generate(0, 3, 2, null)); - } - - static void sandbox5() { - MetaDynamicDependency md1 = new MetaDynamicDependency(new MetaTermGenerator() { - @Override - public MetaRDLTerm generate(int curIndex, int curDepth, int maxIndex, int maxDepth, Map context) { - int maxOrder = (Integer) context.get("maxOrder"); - if (curDepth < maxDepth && curIndex == 0) { - return new MetaDynamicDependency(this); - } - if (curIndex == 0) { - return new MetaEvaluatableTermVariable(new Variable("s"), new Constant("" + maxOrder)); - } - return new MetaEvaluatableTermVariable(new Variable("v" + curDepth), new Constant("" + (maxOrder - (maxDepth - curDepth)))); - }}); - System.out.println(md1.generate(2, 3, Map.of("maxOrder", 4)).toStringWithOrder()); - Dependency d1 = new Dependency(new Resource("s", 4), new Resource("t", 4)); - Dependency d2 = new Dependency(d1, new Resource("v3", 3)); - Dependency d3 = new Dependency(d2, new Resource("v2", 2)); - Dependency d4 = new Dependency(d3, new Resource("v1", 1)); - System.out.println(d3); - } - - - static void sandbox6() { - MetaDynamicDependency d1 = - new MetaDynamicDependency( - new MetaTermGenerator() { - @Override - public MetaRDLTerm generate(int curIndex, int curDepth, int maxIndex, int maxDepth, Map context) { - int i = maxDepth - curDepth; - context.put("" + curDepth, curIndex); - if (curDepth == maxDepth - 1 && curIndex == 0) { - return new MetaDynamicDependency( - new MetaTermGenerator() { - @Override - public MetaRDLTerm generate(int curIndex2, int curDepth2, int maxIndex2, int maxDepth2, Map context2) { - curIndex2 -= 2; - context2.put("" + curDepth2, curIndex2 + 1); - context2.put("depth", curDepth2); - return new MetaEvaluatableTermVariable(new Variable("v" + curDepth2 + "_" + curIndex2), new Variable("n")); - } - }, - new MetaEvaluatableTermVariable(new Variable("s"), new Variable("n")), - new MetaEvaluatableTermVariable(new Variable("t"), new Variable("n")) - ); - } else if (curIndex == 0) { - return new MetaDynamicDependency(this); - } - curIndex -= 1; - return new MetaEvaluatableTermVariable(new Variable("v" + curDepth + "_" + curIndex), ExpressionUtils.parse("n - " + i)); - } + static void sandBox8() { + MetaDynamicDependency md = new MetaDynamicDependency( + new MetaTermGenerator() { + @Override + public MetaRDLTerm generate(int curIndex, int curDepth, int maxIndex, int maxDepth, Map context) { + if (curDepth == maxDepth && curIndex == 0) { + return new MetaEvaluatableTermVariable(new Variable("se")); + } else if (curIndex == 0) { + return new MetaDynamicDependency(this); } - ); - Map context = new HashMap<>(); - var tmp = d1.generate(3, 5, context); - System.out.println(tmp); - System.out.println(context); - } - - void sandbox7() { - var d =new MetaEquationFormula( - new MetaDynamicDependencyTerm( - new MetaTermGenerator() { - @Override - public MetaRDLTerm generate(int curIndex, int curDepth, int maxIndex, int maxDepth, Map context) { - int i = maxDepth - curDepth; - maxIndex = (Integer) context.get("" + curDepth); - if (curDepth == maxDepth - 1 && curIndex == 0) { - return new MetaDynamicDependency( - new MetaTermGenerator() { - @Override - public MetaRDLTerm generate(int curIndex2, int curDepth2, int maxIndex2, int maxDepth2, Map context2) { - curIndex2 -= 3; - maxIndex2 = (Integer) context.get("" + curDepth2); - if (curIndex2 >= maxIndex2 * 2) { - return null; - } - if (curIndex2 % 2 == 0) { - return new MetaEvaluatableTermVariable(new Variable("v" + curDepth2 + "_" + curIndex2), new Variable("n")); - } - return new MetaEvaluatableTermVariable(new Variable("x" + curDepth2 + "_" + curIndex2), new Variable("n")); - } - }, - new MetaEvaluatableTermVariable(new Variable("s"), new Variable("n")), - new MetaEvaluatableTermVariable(new Variable("t"), new Variable("n")), - new MetaEvaluatableTermVariable(new Variable("u"), new Variable("m")) - ); - } - if (curIndex == 0) { - return new MetaDynamicDependency(this); - } - curIndex -= 1; - if (curIndex >= maxIndex * 2) { - return null; - } - if (curIndex % 2 == 0) { - return new MetaEvaluatableTermVariable(new Variable("v" + curDepth + "_" + curIndex), ExpressionUtils.parse("n - " + i)); - } - return new MetaEvaluatableTermVariable(new Variable("x" + curDepth + "_" + curIndex), ExpressionUtils.parse("n - " + i)); - } - } - ), - new MetaDynamicDependencyTerm( - new MetaTermGenerator() { - @Override - public MetaRDLTerm generate(int curIndex, int curDepth, int maxIndex, int maxDepth, Map context) { - int m = (Integer) context.get("m"); - int n = (Integer) context.get("n"); - int i = maxDepth - curDepth; - maxIndex = (Integer) context.get("" + curDepth); - if (curDepth == maxDepth - 1 && curIndex == 0) { - return new MetaDynamicDependency( - new MetaTermGenerator() { - @Override - public MetaRDLTerm generate(int curIndex2, int curDepth2, int maxIndex2, int maxDepth2, Map context2) { - curIndex2 -= 3; - maxIndex2 = (Integer) context.get("" + curDepth2); - if (curIndex2 >= maxIndex2 * 2) { - return null; - } - if (curIndex2 % 2 == 0) { - return new MetaEvaluatableTermVariable(new Variable("v" + curDepth2 + "_" + curIndex2), new Variable("n")); - } - return new MetaEvaluatableTermVariable(new Variable("x" + curDepth2 + "_" + curIndex2), new Variable("n")); - } - }, - new MetaEvaluatableTermVariable(new Variable("s"), new Variable("n")), - new MetaEvaluatableTermVariable(new Variable("t"), new Variable("n")), - new MetaEvaluatableTermVariable(new Variable("q"), new Variable("m")) - ); - } - if (curIndex == 0) { - return new MetaDynamicDependency(this); - } - curIndex -= 1; - if (n - i == m) { - if (curIndex == 0) { - return new MetaEvaluatableTermVariable(new Variable("q"), new Variable("m")); - } - if (curIndex == 1) { - return new MetaEvaluatableTermVariable(new Variable("u"), new Variable("m")); - } - curIndex -= 2; - if (curIndex >= maxIndex * 2) { - return null; - } - if (curIndex % 2 == 0) { - return new MetaEvaluatableTermVariable(new Variable("v" + curDepth + "_" + curIndex), ExpressionUtils.parse("n - " + i)); - } - return new MetaEvaluatableTermVariable(new Variable("x" + curDepth + "_" + curIndex), ExpressionUtils.parse("n - " + i)); - } - if (curIndex >= maxIndex * 2) { - return null; - } - if (curIndex % 2 == 0) { - return new MetaEvaluatableTermVariable(new Variable("v" + curDepth + "_" + curIndex), ExpressionUtils.parse("n - " + i)); - } - return new MetaEvaluatableTermVariable(new Variable("x" + curDepth + "_" + curIndex), ExpressionUtils.parse("n - " + i)); - } - } - ) + curIndex -= 1; + return new MetaEvaluatableTermVariable(new Variable("te" + curDepth + "_" + curIndex)); + } + } ); + MetaRDLTerm mt = md.generate(1, 2, 3, new HashMap<>()); + System.out.println(mt); + MetaRDLTerm mt2 = md.allGenerate(2, 3, new HashMap<>()); + System.out.println(mt2); + Resource a = new Resource("a", 1); + Resource b = new Resource("b", 1); + Resource c = new Resource("c", 1); + Resource d = new Resource("d", 1); + Resource e = new Resource("e", 1); + Resource f = new Resource("f", 1); + Resource g = new Resource("g", 1); + Dependency d1 = new Dependency(a, b); + Dependency d2 = new Dependency(d1, c, d); + System.out.println(md.isMatchedBy(d1)); + System.out.println(md.isMatchedBy(d2)); + Dependency d3 = new Dependency(d2, e, f, g); + MatchConstraint constraint = md.isMatchedBy(d3).iterator().next(); + System.out.println(md.isMatchedBy(d3)); + constraint.getContext().put("maxIndex", d3.getMaxIndex()); + constraint.getContext().put("maxDepth", d3.getMaxDepth()); +// System.out.println(md.substitute(constraint.getBinding(), constraint.getContext())); + } + + static void sandBox() { + Position pos = new Position(List.of(1, 2, 0, 2)); + System.out.println(pos); + String posString = pos.toString(); + System.out.println(Position.toPosition(posString).addPath(3)); } } diff --git a/src/main/java/inference/rewrite/Position.java b/src/main/java/inference/rewrite/Position.java deleted file mode 100644 index 61755b5..0000000 --- a/src/main/java/inference/rewrite/Position.java +++ /dev/null @@ -1,68 +0,0 @@ -package inference.rewrite; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -import lombok.Getter; - -public class Position { - - @Getter - private List paths; - - public Position(List paths) { - this.paths = Collections.unmodifiableList(paths); - } - - public Position() { - this.paths = Collections.unmodifiableList(List.of(0)); - } - - public Position addPath(int index) { - List nextPaths = new ArrayList<>(paths); - nextPaths.add(index); - return new Position(Collections.unmodifiableList(nextPaths)); - } - - public boolean startWith(Position pos) { - for (int i = 0; i < pos.size(); i++) { - if (getPath(i) != pos.getPath(i)) { - return false; - } - } - return true; - } - - public int size() { - return paths.size(); - } - - private int getPath(int index) { - if (index >= size()) { - return -1; - } - return paths.get(index); - } - - - @Override - public boolean equals(Object another) { - if (! (another instanceof Position)) { - return false; - } - Position position = (Position) another; - return paths.equals(position.getPaths()); - } - - @Override - public int hashCode() { - return this.paths.hashCode(); - } - - @Override - public String toString() { - return paths.toString(); - } - -} diff --git a/src/main/java/inference/rewrite/ResourceTree.java b/src/main/java/inference/rewrite/ResourceTree.java index cfe6929..7b2429d 100644 --- a/src/main/java/inference/rewrite/ResourceTree.java +++ b/src/main/java/inference/rewrite/ResourceTree.java @@ -8,6 +8,7 @@ import java.util.stream.Collectors; import lombok.Getter; +import models.Position; import models.terms.DependencyTerm; import models.terms.EvaluatableTerm; import models.terms.PrimedTerm; diff --git a/src/main/java/inference/rewrite/RewriteInferenceSystem.java b/src/main/java/inference/rewrite/RewriteInferenceSystem.java index 0f214b0..01adcbb 100644 --- a/src/main/java/inference/rewrite/RewriteInferenceSystem.java +++ b/src/main/java/inference/rewrite/RewriteInferenceSystem.java @@ -9,6 +9,7 @@ import java.util.Map; import java.util.Set; +import models.Position; import models.formulas.EquationFormula; import models.formulas.Formula; import models.formulas.Then; diff --git a/src/main/java/models/Position.java b/src/main/java/models/Position.java new file mode 100644 index 0000000..a1f908d --- /dev/null +++ b/src/main/java/models/Position.java @@ -0,0 +1,74 @@ +package models; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + +import lombok.Getter; + +public class Position { + + @Getter + private List paths; + + public Position(List paths) { + this.paths = Collections.unmodifiableList(paths); + } + + public Position() { + this.paths = Collections.unmodifiableList(List.of(0)); + } + + public Position addPath(int index) { + List nextPaths = new ArrayList<>(paths); + nextPaths.add(index); + return new Position(Collections.unmodifiableList(nextPaths)); + } + + public boolean startWith(Position pos) { + for (int i = 0; i < pos.size(); i++) { + if (getPath(i) != pos.getPath(i)) { + return false; + } + } + return true; + } + + public int size() { + return paths.size(); + } + + private int getPath(int index) { + if (index >= size()) { + return -1; + } + return paths.get(index); + } + + + @Override + public boolean equals(Object another) { + if (! (another instanceof Position)) { + return false; + } + Position position = (Position) another; + return paths.equals(position.getPaths()); + } + + @Override + public int hashCode() { + return this.paths.hashCode(); + } + + @Override + public String toString() { + return paths.stream().map(String::valueOf).collect(Collectors.joining(", ")); + } + + public static Position toPosition(String pathString) { + return new Position(Arrays.stream(pathString.split(", ")).map(Integer::parseInt).toList()); + } + +} diff --git a/src/main/java/models/terms/meta/MetaDependency.java b/src/main/java/models/terms/meta/MetaDependency.java index c749270..c3debd9 100644 --- a/src/main/java/models/terms/meta/MetaDependency.java +++ b/src/main/java/models/terms/meta/MetaDependency.java @@ -10,6 +10,7 @@ import exceptions.SubstituteFailedException; import exceptions.SyntaxException; +import models.Position; import models.algebra.Expression; import models.algebra.Variable; import models.terms.Dependency; @@ -44,7 +45,7 @@ } @Override - public Set isMatchedBy(RDLTerm another, MatchConstraint constraint) { + public Set isMatchedBy(RDLTerm another, MatchConstraint constraint, Position position) { Set result = new HashSet<>(); if (! another.getClass().isAssignableFrom(this.termType.getBaseTermClass())) { return result; @@ -55,16 +56,16 @@ if (another.getChildren().size() != this.getChildren().size()) { return result; } - result = dependingTermMatch(another, constraint); - return dependedTermsMatch(another, result); + result = dependingTermMatch(another, constraint, position); + return dependedTermsMatch(another, result, position); } - private Set dependingTermMatch(RDLTerm another, MatchConstraint constraint) { + private Set dependingTermMatch(RDLTerm another, MatchConstraint constraint, Position position) { RDLTerm dependingChild = (RDLTerm) this.getChild(0); RDLTerm anotherDependingChild = (RDLTerm) another.getChild(0); if (dependingChild instanceof MetaRDLTerm) { MetaRDLTerm metaChild = (MetaRDLTerm) dependingChild; - return metaChild.isMatchedBy(anotherDependingChild, constraint); + return metaChild.isMatchedBy(anotherDependingChild, constraint, position.addPath(0)); } else { if (dependingChild.equals(anotherDependingChild)) { return new HashSet<>(Set.of(constraint)); @@ -73,7 +74,7 @@ return new HashSet<>(); } - private Set dependedTermsMatch(RDLTerm another, Set constraint) { + private Set dependedTermsMatch(RDLTerm another, Set constraint, Position position) { Set result = new HashSet<>(); for (List perm : Permutation.permutation(another.getChildren().size() - 1)) { Set localResult = new HashSet<>(constraint); @@ -83,7 +84,7 @@ RDLTerm metaDependedTerm = (RDLTerm) getChild(metaTermIndex + 1); RDLTerm anotherDependedTerm = (RDLTerm) another.getChild(anotherTermIndex + 1); if (metaDependedTerm instanceof MetaRDLTerm metaTerm) { - localResult = metaTerm.isMatchedBy(anotherDependedTerm, localResult); + localResult = metaTerm.isMatchedBy(anotherDependedTerm, localResult, position.addPath(metaTermIndex + 1)); if (localResult.isEmpty()) { flg = false; break; diff --git a/src/main/java/models/terms/meta/MetaDependencyTerm.java b/src/main/java/models/terms/meta/MetaDependencyTerm.java index cd06b0d..781835a 100644 --- a/src/main/java/models/terms/meta/MetaDependencyTerm.java +++ b/src/main/java/models/terms/meta/MetaDependencyTerm.java @@ -1,5 +1,7 @@ package models.terms.meta; +import com.google.common.collect.TreeMultiset; + import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; @@ -10,10 +12,9 @@ import java.util.stream.Collectors; import java.util.stream.IntStream; -import com.google.common.collect.TreeMultiset; - import exceptions.SubstituteFailedException; import exceptions.SyntaxException; +import models.Position; import models.algebra.Variable; import models.terms.DependencyTerm; import models.terms.EvaluatableTerm; @@ -57,7 +58,7 @@ } @Override - public Set isMatchedBy(RDLTerm another, MatchConstraint constraint) { + public Set isMatchedBy(RDLTerm another, MatchConstraint constraint, Position position) { Set result = new HashSet<>(); if (! another.getClass().isAssignableFrom(this.termType.getBaseTermClass())) { return result; @@ -68,16 +69,16 @@ if (another.getChildren().size() != this.getChildren().size()) { return new HashSet<>(); } - result = dependingTermMatch(another, constraint); - return termPairsMatch((DependencyTerm) another, result); + result = dependingTermMatch(another, constraint, position); + return termPairsMatch((DependencyTerm) another, result, position); } - private Set dependingTermMatch(RDLTerm another, MatchConstraint constraint) { + private Set dependingTermMatch(RDLTerm another, MatchConstraint constraint, Position position) { RDLTerm dependingChild = (RDLTerm) this.getChild(0); RDLTerm anotherDependingChild = (RDLTerm) another.getChild(0); if (dependingChild instanceof MetaRDLTerm) { MetaRDLTerm metaChild = (MetaRDLTerm) dependingChild; - return metaChild.isMatchedBy(anotherDependingChild, constraint); + return metaChild.isMatchedBy(anotherDependingChild, constraint, position.addPath(0)); } else { if (dependingChild.equals(anotherDependingChild)) { return new HashSet<>(List.of(constraint)); @@ -86,7 +87,7 @@ return new HashSet<>(); } - private Set termPairsMatch(DependencyTerm another, Set constraint) { + private Set termPairsMatch(DependencyTerm another, Set constraint, Position position) { Set result = new HashSet<>(); for (List perm : Permutation.permutation((another.getChildren().size() - 1) / 2)) { Set localResult = new HashSet<>(constraint); @@ -98,7 +99,7 @@ RDLTerm metaArgTerm = (RDLTerm) getChild(2 * metaTermIndex + 2); RDLTerm anotherArgTerm = (RDLTerm) another.getChild(2 * anotherTermIndex + 2); if (metaDependedTerm instanceof MetaRDLTerm metaTerm) { - localResult = metaTerm.isMatchedBy(anotherDependedTerm, localResult); + localResult = metaTerm.isMatchedBy(anotherDependedTerm, localResult, position.addPath(2 * metaTermIndex + 1)); if (localResult.isEmpty()) { flg = false; break; @@ -110,7 +111,7 @@ } } if (metaArgTerm instanceof MetaRDLTerm metaTerm) { - localResult = metaTerm.isMatchedBy(anotherArgTerm, localResult); + localResult = metaTerm.isMatchedBy(anotherArgTerm, localResult, position.addPath(2 * metaTermIndex + 2)); if (localResult.isEmpty()) { flg = false; break; diff --git a/src/main/java/models/terms/meta/MetaDynamicDependency.java b/src/main/java/models/terms/meta/MetaDynamicDependency.java index dd45024..7d94d59 100644 --- a/src/main/java/models/terms/meta/MetaDynamicDependency.java +++ b/src/main/java/models/terms/meta/MetaDynamicDependency.java @@ -9,6 +9,7 @@ import java.util.stream.Collectors; import exceptions.SubstituteFailedException; +import models.Position; import models.algebra.Expression; import models.algebra.Variable; import models.terms.RDLTerm; @@ -40,11 +41,57 @@ } @Override + public Set isMatchedBy(RDLTerm another, MatchConstraint constraint, Position position) { + int maxIndex = another.getMaxIndex(); + Set result = new HashSet<>(); + constraint.getContext().put(position.toString(), maxIndex); + if (! (Boolean) constraint.getContext().getOrDefault("isDynamicStarted", false)) { + int maxDepth = another.getMaxDepth(); + constraint.getContext().put("isDynamicStarted", true); + for (int i = maxDepth; i >= 1; i--) { + MatchConstraint newConstraint = new MatchConstraint(constraint); + newConstraint.getContext().put("matchMaxDepth", i); + MetaRDLTerm metaDep = generate(position.size(), maxIndex, i, newConstraint.getContext()); + Set res = metaDep.isMatchedBy(another, newConstraint, position); + result.addAll(res); + } + } else { + int maxDepth = (Integer) constraint.getContext().get("matchMaxDepth"); + MetaRDLTerm metaDep = generate(position.size(), maxIndex, maxDepth, constraint.getContext()); + Set res = metaDep.isMatchedBy(another, constraint, position); + result.addAll(res); + } + return result; + } + + + @Override public MetaDependency generate(int depth, int maxIndex, int maxDepth, Map context) { if (maxIndex < 2) return null; + if (depth > maxDepth) return null; + RDLTerm dependingTerm = this.dependingTerm == null ? termGenerator.generate(0, depth, maxIndex, maxDepth, context) : this.dependingTerm; + List dependedTerms = new ArrayList<>(); + int staticSize = this.dependedTerms == null ? 0 : this.dependedTerms.size(); + for (int i = 0; i < Math.min(maxIndex - 1, staticSize); i++) { + dependedTerms.add(this.dependedTerms.get(i)); + } + for (int i = staticSize; i < maxIndex - 1; i++) { + RDLTerm generatedTerm = termGenerator.generate(i + 1, depth, maxIndex, maxDepth, context); + if (generatedTerm == null) { + break; + } + dependedTerms.add(generatedTerm); + } + return new MetaDependency(dependingTerm, dependedTerms); + } + + @Override + public MetaDependency allGenerate(int depth, int maxIndex, int maxDepth, Map context) { + if (maxIndex < 2) return null; + if (depth > maxDepth) return null; RDLTerm dependingTerm = this.dependingTerm == null ? termGenerator.generate(0, depth, maxIndex, maxDepth, context) : this.dependingTerm; while (dependingTerm instanceof MetaDynamicTerm dynamicTerm) { - dependingTerm = dynamicTerm.generate(depth + 1, maxIndex, maxDepth, context); + dependingTerm = dynamicTerm.allGenerate(depth + 1, maxIndex, maxDepth, context); } List dependedTerms = new ArrayList<>(); int staticSize = this.dependedTerms == null ? 0 : this.dependedTerms.size(); @@ -57,7 +104,7 @@ break; } while (generatedTerm instanceof MetaDynamicTerm dynamicTerm) { - generatedTerm = dynamicTerm.generate(depth + 1, maxIndex, maxDepth, context); + generatedTerm = dynamicTerm.allGenerate(depth + 1, maxIndex, maxDepth, context); } dependedTerms.add(generatedTerm); } @@ -66,30 +113,12 @@ @Override - public Set isMatchedBy(RDLTerm another, MatchConstraint constraint) { - int maxIndex = another.getMaxIndex(); - int maxDepth = another.getMaxDepth(); - Set result = new HashSet<>(); -// if (maxDepth == 1) { -// MetaRDLTerm metaDep = generate(maxIndex, maxDepth, constraint.getContext()); -// return metaDep.isMatchedBy(another, constraint); -// } - for (int i = maxDepth; i >= 1; i--) { - MatchConstraint newConstraint = new MatchConstraint(constraint); - MetaRDLTerm metaDep = generate(maxIndex, i, newConstraint.getContext()); - Set res = metaDep.isMatchedBy(another, newConstraint); - result.addAll(res); - } - return result; - } - - @Override public RDLTerm substitute(Map binding, Map context) { if (! context.containsKey("maxIndex")) throw new SubstituteFailedException(); if (! context.containsKey("maxDepth")) throw new SubstituteFailedException(); int maxIndex = (int) context.get("maxIndex"); int maxDepth = (int) context.get("maxDepth"); - return generate(maxIndex, maxDepth, context).substitute(binding, context); + return allGenerate(maxIndex, maxDepth, context).substitute(binding, context); } diff --git a/src/main/java/models/terms/meta/MetaDynamicTerm.java b/src/main/java/models/terms/meta/MetaDynamicTerm.java index ef8d4ff..cd23b11 100644 --- a/src/main/java/models/terms/meta/MetaDynamicTerm.java +++ b/src/main/java/models/terms/meta/MetaDynamicTerm.java @@ -7,8 +7,10 @@ public MetaRDLTerm generate(int depth, Map context); public MetaRDLTerm generate(int depth, int maxIndex, int maxDepth, Map context); - default MetaRDLTerm generate(int maxIndex, int maxDepth, Map context) { - return generate(1, maxIndex, maxDepth, context); + public MetaRDLTerm allGenerate(int depht, int maxIndex, int maxDepth, Map context); + + default MetaRDLTerm allGenerate(int maxIndex, int maxDepth, Map context) { + return allGenerate(1, maxIndex, maxDepth, context); } } diff --git a/src/main/java/models/terms/meta/MetaRDLTerm.java b/src/main/java/models/terms/meta/MetaRDLTerm.java index e1d4968..cbfc7eb 100644 --- a/src/main/java/models/terms/meta/MetaRDLTerm.java +++ b/src/main/java/models/terms/meta/MetaRDLTerm.java @@ -6,6 +6,7 @@ import java.util.Set; import lombok.Getter; +import models.Position; import models.algebra.Variable; import models.terms.Dependency; import models.terms.DependencyTerm; @@ -30,18 +31,30 @@ public Set isMatchedBy(RDLTerm another) { - return isMatchedBy(another, MatchConstraint.createDefault()); + return isMatchedBy(another, MatchConstraint.createDefault(), new Position()); } public Set isMatchedBy(RDLTerm another, Set constraints) { Set result = new HashSet<>(); for (MatchConstraint constraint : constraints) { - result.addAll(isMatchedBy(another, constraint)); + result.addAll(isMatchedBy(another, constraint, new Position())); } return result; } - public abstract Set isMatchedBy(RDLTerm another, MatchConstraint constraint); + public Set isMatchedBy(RDLTerm another, Set constraints, Position position) { + Set result = new HashSet<>(); + for (MatchConstraint constraint : constraints) { + result.addAll(isMatchedBy(another, constraint, position)); + } + return result; + } + + public Set isMatchedBy(RDLTerm another, MatchConstraint constraint) { + return isMatchedBy(another, constraint, new Position()); + } + + public abstract Set isMatchedBy(RDLTerm another, MatchConstraint constraint, Position position); public RDLTerm substitute(Map binding) { diff --git a/src/main/java/models/terms/meta/MetaVariable.java b/src/main/java/models/terms/meta/MetaVariable.java index 31edbfb..ae29897 100644 --- a/src/main/java/models/terms/meta/MetaVariable.java +++ b/src/main/java/models/terms/meta/MetaVariable.java @@ -9,6 +9,7 @@ import exceptions.SubstituteFailedException; import exceptions.TooManyVariablesException; import lombok.Getter; +import models.Position; import models.algebra.Expression; import models.algebra.Variable; import models.terms.LinearRightNormalizedType; @@ -75,7 +76,7 @@ } @Override - public Set isMatchedBy(RDLTerm another, MatchConstraint constraint) { + public Set isMatchedBy(RDLTerm another, MatchConstraint constraint, Position position) { Set result = new HashSet<>(); Map binding = constraint.getBinding(); Map orderConstraint = constraint.getOrderConstraint();