diff --git a/src/main/java/Main.java b/src/main/java/Main.java index 3637f9f..dd29488 100644 --- a/src/main/java/Main.java +++ b/src/main/java/Main.java @@ -54,7 +54,7 @@ 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) { + 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)); } @@ -67,7 +67,7 @@ MetaDynaimcDependencyTerm t1 = new MetaDynaimcDependencyTerm((ci, cd, mi, md, contex) -> new MetaResource(new Variable("x" + ci))); MetaDynaimcDependencyTerm t2 = new MetaDynaimcDependencyTerm(new MetaTermGenerator() { @Override - public MetaRDLTerm generate(int curIndex, int curDepth, int maxIndex, int maxDepth, Map context) { + public MetaRDLTerm generate(int curIndex, int curDepth, int maxIndex, int maxDepth, Map context) { if (curDepth == 0 && curIndex != 0 && curIndex % 2 == 0) { return new MetaDynaimcDependencyTerm(this); } diff --git a/src/main/java/models/terms/RDLTerm.java b/src/main/java/models/terms/RDLTerm.java index 50bb304..eb2a8e9 100644 --- a/src/main/java/models/terms/RDLTerm.java +++ b/src/main/java/models/terms/RDLTerm.java @@ -11,7 +11,7 @@ protected int size; protected RDLTerm(int order, int size) { - super(new Symbol("")); + super(new Symbol("", -1)); this.order = order; this.size = size; } diff --git a/src/main/java/models/terms/Resource.java b/src/main/java/models/terms/Resource.java index 2767346..8e0597c 100644 --- a/src/main/java/models/terms/Resource.java +++ b/src/main/java/models/terms/Resource.java @@ -1,8 +1,6 @@ package models.terms; import lombok.Getter; -import models.algebra.Symbol; -import models.algebra.Type; @Getter public class Resource extends EvaluatableTerm { @@ -45,7 +43,7 @@ return false; } var vari = (Resource) another; - return vari.getOrder() == getOrder() && vari.getName().equals(getName()) && vari.getType().equals(getType()); + return vari.getOrder() == getOrder() && vari.getName().equals(getName()); } @Override diff --git a/src/main/java/models/terms/meta/MetaDependency.java b/src/main/java/models/terms/meta/MetaDependency.java index e5798aa..c031e72 100644 --- a/src/main/java/models/terms/meta/MetaDependency.java +++ b/src/main/java/models/terms/meta/MetaDependency.java @@ -52,6 +52,9 @@ if (isDependencyTerm() && (! islinearRightNormalizedMatchedBy(another))) { return result; } + if (another.getChildren().size() != this.getChildren().size()) { + return result; + } result = dependingTermMatch(another, constraint); return dependedTermsMatch(another, result); } @@ -100,16 +103,16 @@ } @Override - protected RDLTerm substitute(Map binding, int depth) { + public RDLTerm substitute(Map binding, Map context) { RDLTerm dependingTerm = (RDLTerm) getChild(0); if (dependingTerm instanceof MetaRDLTerm) { - dependingTerm = ((MetaRDLTerm) dependingTerm).substitute(binding, depth + 1); + dependingTerm = ((MetaRDLTerm) dependingTerm).substitute(binding, context); } List dependedTerms = new ArrayList<>(); for (int i = 1; i < getChildren().size(); i++) { RDLTerm dependedTerm = (RDLTerm) getChild(i); if (dependedTerm instanceof MetaRDLTerm metaTerm) { - dependedTerm = metaTerm.substitute(binding, depth + 1); + dependedTerm = metaTerm.substitute(binding, context); } if (dependedTerm instanceof EvaluatableTerm te) { dependedTerms.add(te); diff --git a/src/main/java/models/terms/meta/MetaDependencyTerm.java b/src/main/java/models/terms/meta/MetaDependencyTerm.java index 4eb4fb8..8d6fd7b 100644 --- a/src/main/java/models/terms/meta/MetaDependencyTerm.java +++ b/src/main/java/models/terms/meta/MetaDependencyTerm.java @@ -127,20 +127,20 @@ } @Override - protected RDLTerm substitute(Map binding, int depth) { + public RDLTerm substitute(Map binding, Map context) { RDLTerm dependingTerm = (RDLTerm) getChild(0); if (dependingTerm instanceof MetaRDLTerm) { - dependingTerm = ((MetaRDLTerm) dependingTerm).substitute(binding, depth + 1); + dependingTerm = ((MetaRDLTerm) dependingTerm).substitute(binding, context); } List termPairs = new ArrayList<>(); for (int i = 0; i < (getChildren().size() - 1) / 2; i++) { RDLTerm dependedTerm = (RDLTerm) getChild(i * 2 + 1); RDLTerm argTerm = (RDLTerm) getChild(i * 2 + 2); if (dependedTerm instanceof MetaRDLTerm metaTerm) { - dependedTerm = metaTerm.substitute(binding, depth + 1); + dependedTerm = metaTerm.substitute(binding, context); } if (argTerm instanceof MetaRDLTerm metaTerm) { - argTerm = metaTerm.substitute(binding, depth + 1); + argTerm = metaTerm.substitute(binding, context); } termPairs.add((EvaluatableTerm) dependedTerm); termPairs.add((EvaluatableTerm) argTerm); diff --git a/src/main/java/models/terms/meta/MetaDynaimcDependencyTerm.java b/src/main/java/models/terms/meta/MetaDynaimcDependencyTerm.java index cbcbbef..8f2dbd6 100644 --- a/src/main/java/models/terms/meta/MetaDynaimcDependencyTerm.java +++ b/src/main/java/models/terms/meta/MetaDynaimcDependencyTerm.java @@ -10,6 +10,7 @@ import java.util.stream.Collectors; import java.util.stream.IntStream; +import exceptions.SubstituteFailedException; import exceptions.SyntaxException; import models.algebra.Variable; import models.terms.RDLTerm; @@ -38,17 +39,17 @@ } @Override - public MetaRDLTerm generate(int depth, Map context) { + public MetaRDLTerm generate(int depth, Map context) { // TODO 自動生成されたメソッド・スタブ return null; } - public MetaRDLTerm generate(int maxIndex, int maxDepth, Map context) { + public MetaRDLTerm generate(int maxIndex, int maxDepth, Map context) { return generate(1, maxIndex, maxDepth, context); } @Override - public MetaRDLTerm generate(int depth, int maxIndex, int maxDepth, Map context) { + public MetaRDLTerm generate(int depth, int maxIndex, int maxDepth, Map context) { if (maxIndex % 2 == 0 && maxIndex <= 2) return null; RDLTerm dependingTerm; List termPairs = new ArrayList<>(); @@ -98,9 +99,12 @@ } @Override - protected RDLTerm substitute(Map binding, int depth) { - // TODO 自動生成されたメソッド・スタブ - return null; + 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(0, maxIndex, maxDepth, context).substitute(binding, context); } diff --git a/src/main/java/models/terms/meta/MetaDynamicDependency.java b/src/main/java/models/terms/meta/MetaDynamicDependency.java index 9012848..569003a 100644 --- a/src/main/java/models/terms/meta/MetaDynamicDependency.java +++ b/src/main/java/models/terms/meta/MetaDynamicDependency.java @@ -8,6 +8,7 @@ import java.util.Set; import java.util.stream.Collectors; +import exceptions.SubstituteFailedException; import models.algebra.Expression; import models.algebra.Variable; import models.terms.RDLTerm; @@ -34,12 +35,12 @@ } @Override - public MetaRDLTerm generate(int depth, Map context) { + public MetaRDLTerm generate(int depth, Map context) { return null; } @Override - public MetaDependency generate(int depth, int maxIndex, int maxDepth, Map context) { + public MetaDependency generate(int depth, int maxIndex, int maxDepth, Map context) { if (maxIndex < 2) return null; RDLTerm dependingTerm = this.dependingTerm == null ? termGenerator.generate(0, depth, maxIndex, maxDepth, context) : this.dependingTerm; while (dependingTerm instanceof MetaDynamicTerm dynamicTerm) { @@ -70,9 +71,12 @@ } @Override - protected RDLTerm substitute(Map binding, int depth) { - - return null; + 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); } diff --git a/src/main/java/models/terms/meta/MetaDynamicTerm.java b/src/main/java/models/terms/meta/MetaDynamicTerm.java index d93fbdf..ef8d4ff 100644 --- a/src/main/java/models/terms/meta/MetaDynamicTerm.java +++ b/src/main/java/models/terms/meta/MetaDynamicTerm.java @@ -2,14 +2,12 @@ import java.util.Map; -import models.algebra.Variable; - public interface MetaDynamicTerm { - public MetaRDLTerm generate(int depth, Map context); - public MetaRDLTerm generate(int depth, int maxIndex, int maxDepth, Map context); + 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) { + default MetaRDLTerm generate(int maxIndex, int maxDepth, Map context) { return generate(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 0f23787..764fdb8 100644 --- a/src/main/java/models/terms/meta/MetaRDLTerm.java +++ b/src/main/java/models/terms/meta/MetaRDLTerm.java @@ -1,6 +1,7 @@ package models.terms.meta; import java.util.Collection; +import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; @@ -44,10 +45,10 @@ public RDLTerm substitute(Map binding) { - return substitute(binding, 0); + return substitute(binding, new HashMap<>()); } - abstract protected RDLTerm substitute(Map binding, int depth); + abstract public RDLTerm substitute(Map binding, Map context); public boolean checkTermType(Class clazz) { diff --git a/src/main/java/models/terms/meta/MetaTermGenerator.java b/src/main/java/models/terms/meta/MetaTermGenerator.java index 44a5c36..d86d5f5 100644 --- a/src/main/java/models/terms/meta/MetaTermGenerator.java +++ b/src/main/java/models/terms/meta/MetaTermGenerator.java @@ -2,11 +2,9 @@ import java.util.Map; -import models.algebra.Variable; - @FunctionalInterface public interface MetaTermGenerator { - MetaRDLTerm generate(int curIndex, int curDepth, int maxIndex, int maxDepth, Map context); + MetaRDLTerm generate(int curIndex, int curDepth, int maxIndex, int maxDepth, Map context); } diff --git a/src/main/java/models/terms/meta/MetaVariable.java b/src/main/java/models/terms/meta/MetaVariable.java index c43bd18..bef0d8c 100644 --- a/src/main/java/models/terms/meta/MetaVariable.java +++ b/src/main/java/models/terms/meta/MetaVariable.java @@ -102,7 +102,7 @@ } @Override - public RDLTerm substitute(Map binding, int depth) { + public RDLTerm substitute(Map binding, Map context) { if (binding.containsKey(variableName)) { return binding.get(variableName); } diff --git a/src/test/java/terms/meta/MetaDynamicDependencyTest.java b/src/test/java/terms/meta/MetaDynamicDependencyTest.java index a846094..441bd2d 100644 --- a/src/test/java/terms/meta/MetaDynamicDependencyTest.java +++ b/src/test/java/terms/meta/MetaDynamicDependencyTest.java @@ -24,9 +24,9 @@ Resource b = new Resource("b", 1); Resource c = new Resource("c", 1); Resource d = new Resource("d", 1); - Resource e = new Resource("d", 1); - Resource f = new Resource("d", 1); - Resource g = new Resource("d", 1); + Resource e = new Resource("e", 1); + Resource f = new Resource("f", 1); + Resource g = new Resource("g", 1); @Test void DynamicDependencyMatchTest() { @@ -38,7 +38,7 @@ Dependency d3 = new Dependency(d2, d, e); MetaDynamicDependency md2 = new MetaDynamicDependency(new MetaTermGenerator() { @Override - public MetaRDLTerm generate(int curIndex, int curDepth, int maxIndex, int maxDepth, Map context) { + public MetaRDLTerm generate(int curIndex, int curDepth, int maxIndex, int maxDepth, Map context) { if (curDepth != maxDepth && curIndex == 0) { return new MetaDynamicDependency(this); } @@ -46,7 +46,7 @@ } }); assertFalse(md2.isMatchedBy(d2).isEmpty()); - assertFalse(md2.isMatchedBy(d3).isEmpty()); + assertTrue(md2.isMatchedBy(d3).isEmpty()); MetaResource x = new MetaResource(new Variable("x")); MetaResource y = new MetaResource(new Variable("y")); @@ -63,4 +63,28 @@ assertEquals(constraint.iterator().next().getBinding(), binding); } + @Test + void DynamicSubstituteTest() { + MetaDynamicDependency md1 = new MetaDynamicDependency((ci, cd, mi, md, context) -> new MetaResource(new Variable("x" + ci))); + Dependency d1 = new Dependency(a, b, c, d); + MatchConstraint result = md1.isMatchedBy(d1).iterator().next(); + RDLTerm generated = md1.substitute(result.getBinding(), Map.of("maxIndex", 4, "maxDepth", 1)); + assertEquals(generated, d1); + + Dependency d2 = new Dependency(new Dependency(a, b), c); + Dependency d3 = new Dependency(d2, d, e); + MetaDynamicDependency md2 = 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 MetaDynamicDependency(this); + } + return new MetaResource(new Variable("x" + curDepth + "_" + curIndex)); + } + }); + result = md2.isMatchedBy(d2).iterator().next(); + generated = md2.substitute(result.getBinding(), Map.of("maxIndex", d2.getMaxIndex(), "maxDepth", d2.getMaxDepth())); + assertEquals(generated, d2); + } + }