diff --git a/src/main/java/models/terms/DependencyTerm.java b/src/main/java/models/terms/DependencyTerm.java index b9413b3..0261a6c 100644 --- a/src/main/java/models/terms/DependencyTerm.java +++ b/src/main/java/models/terms/DependencyTerm.java @@ -9,7 +9,6 @@ import exceptions.SyntaxException; import lombok.Getter; -import models.algebra.Symbol; @Getter public class DependencyTerm extends EvaluatableTerm{ @@ -18,6 +17,42 @@ private TreeMap> termPairs; + public DependencyTerm(EvaluatableTerm dependingTerm, List dependedTerms, List argumentTerms) { + super(-1, -1); + if (dependedTerms.size() != argumentTerms.size()) { + throw new SyntaxException("Args size must be odd."); + } + this.size = dependingTerm.getSize(); + int dependedOrder = dependedTerms.get(0).getOrder(); + int maxArgOrder = 0; + this.dependingTerm = dependingTerm; + this.termPairs = new TreeMap<>(); + addChild(dependingTerm); + for (int i = 0; i < dependedTerms.size(); i++) { + EvaluatableTerm dependedTerm = dependedTerms.get(i); + EvaluatableTerm argTerm = argumentTerms.get(i); + if (dependedTerm.getOrder() != dependedOrder) { + throw new SyntaxException("depended term's order not same"); + } + maxArgOrder = Math.max(maxArgOrder, argTerm.getOrder()); + termPairs.computeIfAbsent(dependedTerm, k -> TreeMultiset.create()).add(argTerm); + this.size += dependedTerm.getSize(); + this.size += argTerm.getSize(); + } + if (dependedOrder <= maxArgOrder) { + this.order = maxArgOrder; + } else { + this.order = dependedOrder - 1; + } + for (EvaluatableTerm dependedTerm : termPairs.keySet()) { + for (EvaluatableTerm argTerm : termPairs.get(dependedTerm)) { + addChild(dependedTerm); + addChild(argTerm); + } + } + } + + @Deprecated public DependencyTerm(EvaluatableTerm dependingTerm, List terms) { super(-1, -1); if (terms.size() % 2 != 0) {