diff --git a/src/models/DependencyTerm.java b/src/models/DependencyTerm.java index 87a35a0..3a437df 100644 --- a/src/models/DependencyTerm.java +++ b/src/models/DependencyTerm.java @@ -6,20 +6,22 @@ @Getter public class DependencyTerm extends EvaluatableTerm{ - private Dependency dependency; + private EvaluatableTerm dependingTerm; + private ResourceVariable dependedVariable; private EvaluatableTerm argumentTerm; public DependencyTerm(int order) { super(new Symbol(":", 3), order); } - public DependencyTerm(Dependency dependency, EvaluatableTerm argumentTerm) { - super(new Symbol(":", 3), dependency.getDependedVariable().getOrder() - 1); - this.dependency = dependency; + public DependencyTerm(EvaluatableTerm dependingTerm, ResourceVariable dependedVariable, EvaluatableTerm argumentTerm) { + super(new Symbol(":", 3), dependedVariable.getOrder() == argumentTerm.getOrder() ? dependedVariable.getOrder() : dependedVariable.getOrder() - 1); + this.dependingTerm = dependingTerm; + this.dependedVariable = dependedVariable; this.argumentTerm = argumentTerm; - this.addChild(dependency.getDependingTerm()); - this.addChild(dependency.getDependedVariable()); - this.addChild(argumentTerm); + addChild(dependingTerm); + addChild(dependedVariable); + addChild(argumentTerm); } @Override @@ -35,52 +37,38 @@ } @Override - public int getOrder() { - ResourceVariable variable = dependency.getDependedVariable(); - if(variable.getOrder() == argumentTerm.getOrder()) { - return variable.getOrder(); - } else { - return variable.getOrder() - 1; - } - } - - @Override public void selfLinearRightNormalize() { - EvaluatableTerm term = (EvaluatableTerm) dependency.getDependingTerm(); //depending term. a of [a : b -> c] - if(term instanceof ResourceVariable || term instanceof SetEvaluatableTerm) { + if(dependingTerm instanceof ResourceVariable || dependingTerm instanceof SetEvaluatableTerm) { argumentTerm.selfLinearRightNormalize(); return; } - DependencyTerm dependencyTerm = (DependencyTerm) term; + DependencyTerm dependencyTerm = (DependencyTerm) dependingTerm; if(! dependencyTerm.isLinearRightNormal()) { dependencyTerm.selfLinearRightNormalize(); } if(! isLinearRightNormal()) { - Dependency childDependency = dependencyTerm.getDependency(); EvaluatableTerm childArgumentTerm = dependencyTerm.getArgumentTerm(); - Dependency nextDependency = new Dependency(childArgumentTerm, dependency.getDependedVariable()); - DependencyTerm nextDependencyTerm = new DependencyTerm(nextDependency, argumentTerm); + DependencyTerm nextDependencyTerm = new DependencyTerm(childArgumentTerm, dependedVariable, argumentTerm); + this.dependingTerm = dependencyTerm.getDependingTerm(); + this.dependedVariable = dependencyTerm.getDependedVariable(); this.argumentTerm = nextDependencyTerm; - this.dependency = childDependency; this.setChild(3, nextDependencyTerm); - this.setChild(0, childDependency.getChild(0)); - this.setChild(1, childDependency.getChild(1)); + this.setChild(0, dependencyTerm.getDependingTerm()); + this.setChild(1, dependencyTerm.getDependedVariable()); } argumentTerm.selfLinearRightNormalize(); } private boolean isLinearRightNormal(int depth) { - EvaluatableTerm term = (EvaluatableTerm) dependency.getDependingTerm(); //depending term. a of [a : b -> c] - ResourceVariable variable = dependency.getDependedVariable(); - if(term instanceof ResourceVariable || term instanceof SetEvaluatableTerm) { - return term.getOrder() == variable.getOrder(); + if(dependingTerm instanceof ResourceVariable || dependingTerm instanceof SetEvaluatableTerm) { + return dependingTerm.getOrder() == dependedVariable.getOrder(); } - DependencyTerm dependencyTerm = (DependencyTerm) term; + DependencyTerm dependencyTerm = (DependencyTerm) dependingTerm; if( dependencyTerm.isLinearRightNormal(depth + 1) && - dependencyTerm.getDependency().getDependedVariable().getOrder() - 1 == variable.getOrder() && - dependencyTerm.getOrder() == variable.getOrder() && + dependencyTerm.getDependedVariable().getOrder() - 1 == dependedVariable.getOrder() && + dependencyTerm.getOrder() == dependedVariable.getOrder() && argumentTerm.getOrder() <= dependencyTerm.getOrder() && depth == 0 ) { @@ -88,8 +76,8 @@ } if( dependencyTerm.isLinearRightNormal(depth + 1) && - dependencyTerm.getDependency().getDependedVariable().getOrder() - 1 == variable.getOrder() && - dependencyTerm.getOrder() == variable.getOrder() && + dependencyTerm.getDependedVariable().getOrder() - 1 == dependedVariable.getOrder() && + dependencyTerm.getOrder() == dependedVariable.getOrder() && argumentTerm.getOrder() < dependencyTerm.getOrder() ) { return true; @@ -102,9 +90,9 @@ public String toString() { StringBuilder sb = new StringBuilder(); sb.append('['); - sb.append(dependency.getDependingTerm().toString()); + sb.append(getDependingTerm().toString()); sb.append(" : "); - sb.append(dependency.getDependedVariable().toString()); + sb.append(getDependedVariable().toString()); sb.append(" -> "); sb.append(argumentTerm.toString()); sb.append(']'); @@ -115,9 +103,9 @@ public String toStringWithOrder() { StringBuilder sb = new StringBuilder(); sb.append('['); - sb.append(dependency.getDependingTerm().toStringWithOrder()); + sb.append(getDependingTerm().toStringWithOrder()); sb.append(" : "); - sb.append(dependency.getDependedVariable().toStringWithOrder()); + sb.append(getDependedVariable().toStringWithOrder()); sb.append(" -> "); sb.append(argumentTerm.toStringWithOrder()); sb.append(']'); @@ -133,7 +121,9 @@ return false; } DependencyTerm term = (DependencyTerm) another; - return term.getDependency().equals(dependency) && term.getArgumentTerm().equals(argumentTerm); + return dependingTerm.equals(term.getDependingTerm()) && + dependedVariable.equals(term.getDependedVariable()) && + argumentTerm.equals(term.getArgumentTerm()); } @Override @@ -144,7 +134,8 @@ @Override public Object clone() { return new DependencyTerm( - (Dependency) dependency.clone(), + (EvaluatableTerm) dependingTerm.clone(), + (ResourceVariable) dependedVariable.clone(), (EvaluatableTerm) argumentTerm.clone() ); } diff --git a/src/models/EvaluatableTerm.java b/src/models/EvaluatableTerm.java index 5a80673..24d7e9e 100644 --- a/src/models/EvaluatableTerm.java +++ b/src/models/EvaluatableTerm.java @@ -1,5 +1,6 @@ package models; +import exceptions.IllegalTypeException; import models.algebra.Symbol; import models.algebra.Type; @@ -19,31 +20,39 @@ } public static DependencyTerm of(EvaluatableTerm term, ResourceVariable variable, EvaluatableTerm valueTerm) { - return new DependencyTerm(new Dependency(term, variable), valueTerm); + return new DependencyTerm(term, variable, valueTerm); } public static EvaluatableTerm of(EvaluatableTerm term, ResourceVariable variable, EvaluatableTerm valueTerm, int order) { if(variable.getOrder() == valueTerm.getOrder() && variable.getOrder() == order) { - return new DependencyTerm(new Dependency(term, variable), valueTerm); + return new DependencyTerm(term, variable, valueTerm); } else if(variable.getOrder() -1 == order) { - return new DependencyTerm(new Dependency(term, variable), valueTerm); + return new DependencyTerm(term, variable, valueTerm); } else { - return new SetEvaluatableTerm(new DependencyTerm(new Dependency(term, variable), valueTerm), order); + return new SetEvaluatableTerm(new DependencyTerm(term, variable, valueTerm), order); } } public static DependencyTerm of(Dependency dependency, EvaluatableTerm argumentTerm) { - return new DependencyTerm(dependency, argumentTerm); + RDLTerm term = dependency.getDependingTerm(); + if(! (term instanceof EvaluatableTerm)) { + throw new IllegalTypeException(); + } + return new DependencyTerm((EvaluatableTerm) term, dependency.getDependedVariable(), argumentTerm); } public static EvaluatableTerm of(Dependency dependency, EvaluatableTerm argumentTerm, int order) { + RDLTerm term = dependency.getDependingTerm(); + if(! (term instanceof EvaluatableTerm)) { + throw new IllegalTypeException(); + } ResourceVariable variable = dependency.getDependedVariable(); if(variable.getOrder() == argumentTerm.getOrder() && variable.getOrder() == order) { - return new DependencyTerm(dependency, argumentTerm); + return new DependencyTerm((EvaluatableTerm) term, variable, argumentTerm); } else if(variable.getOrder() - 1 == order) { - return new DependencyTerm(dependency, argumentTerm); + return new DependencyTerm((EvaluatableTerm) term, variable, argumentTerm); } else { - return new SetEvaluatableTerm(new DependencyTerm(dependency, argumentTerm), order); + return new SetEvaluatableTerm(new DependencyTerm((EvaluatableTerm) term, variable, argumentTerm), order); } }