diff --git a/src/Main.java b/src/Main.java deleted file mode 100644 index 19d505d..0000000 --- a/src/Main.java +++ /dev/null @@ -1,191 +0,0 @@ -import java.util.List; - -import inference.ProofSystem; -import inference.equivalence.SemanticEquivalenceProofSystem; -import inference.equivalence.SemanticEquivalenceRelation; -import inference.rewrite.RewriteInferenceSystem; -import lombok.SneakyThrows; -import models.algebra.Expression; -import models.algebra.Type; -import models.dataConstraintModel.DataConstraintModel; -import models.dataFlowModel.DataTransferModel; -import models.formulas.DependencyFormula; -import models.formulas.EquationFormula; -import models.formulas.InFormula; -import models.terms.Dependency; -import models.terms.DependencyTerm; -import models.terms.Resource; -import models.terms.ResourceConstant; -import models.terms.SetEvaluatableTerm; -import parser.Parser; -import parser.Parser.TokenStream; -import tests.Utils; - -public class Main { - - static TokenStream stream = new Parser.TokenStream(); - static Parser parser = new Parser(stream); - static DataTransferModel model = new DataTransferModel(); - - static Type INT = DataConstraintModel.typeInt; - - public static void main(String[] args) { -// sandbox1(); -// sandbox2(); -// sandbox3(); -// sandbox4(); -// ProofSystem.debug(); - sandbox6(); - } - - static void sandbox1() { - Resource A = new Resource("A", Utils.INT, 2); - Resource Ap = new Resource("A'", Utils.INT, 2); - Resource B = new Resource("B", Utils.INT, 2); - Resource Bp = new Resource("B'", Utils.INT, 2); - Resource C = new Resource("C", Utils.INT, 2); - Resource Cp = new Resource("C'", Utils.INT, 2); - Resource D = new Resource("D", Utils.INT, 2); - Resource E = new Resource("E", Utils.INT, 1); - Resource F = new Resource("F", Utils.INT, 1); - Resource G = new Resource("G", Utils.INT, 0); - DependencyTerm t1 = new DependencyTerm(A, B, C); - DependencyTerm t2 = new DependencyTerm(Ap, Bp, Cp); - EquationFormula assumptionFormula = new EquationFormula(t1, t2); - EquationFormula conclusionFormula = new EquationFormula( - new DependencyTerm(new DependencyTerm(new DependencyTerm(A, B, C), D, E), F, G), - new DependencyTerm(new DependencyTerm(new DependencyTerm(Ap, Bp, Cp), D, E), F, G) - ); - - SemanticEquivalenceProofSystem proofSystem = new SemanticEquivalenceProofSystem( - List.of(new SemanticEquivalenceRelation(assumptionFormula, 2)), - conclusionFormula - ); - SemanticEquivalenceProofSystem.debug(); - System.out.println(); - System.out.println(assumptionFormula); - System.out.println(conclusionFormula); -// System.out.println(conclusionFormula.linearRightNormalized()); - System.out.println(proofSystem.proof()); - } - - static void sandbox2() { - ProofSystem.debug(); - } - - static void sandbox3() { - Resource followee = new Resource("followee", INT, 2); - Resource fno = new Resource("fno", INT, 2); - ResourceConstant one = new ResourceConstant("1"); - ResourceConstant A = new ResourceConstant("A"); - ResourceConstant C = new ResourceConstant("C"); - Resource aid = new Resource("aid", INT, 1); - DependencyTerm t1 = new DependencyTerm(followee, fno, one); - Dependency d1 = new Dependency(t1, aid); - DependencyTerm t2 = new DependencyTerm(one, aid, A); - DependencyTerm t3 = new DependencyTerm(new SetEvaluatableTerm(fno), aid, A); - DependencyTerm t4 = new DependencyTerm(t1, aid, A); - - DependencyFormula f1 = new DependencyFormula(d1); - InFormula f2 = new InFormula(t2, t3); - EquationFormula f3 = new EquationFormula(t4, C); - DependencyFormula f4 = new DependencyFormula(new Dependency(new SetEvaluatableTerm(followee), aid)); - InFormula f5 = new InFormula(A, new SetEvaluatableTerm(aid)); - InFormula conclusion = new InFormula(C, new SetEvaluatableTerm(new SetEvaluatableTerm(followee))); - - System.out.println(f1); - System.out.println(f2); - System.out.println(f3); - System.out.println(conclusion); - System.out.println(); - boolean result = ProofSystem.check(List.of(f1, f2, f3, f4, f5), conclusion); - System.out.println(); - System.out.println(result); - } - - static void sandbox4() { - Resource X = new Resource("X", INT, 1); - Resource Y= new Resource("Y", INT, 1); - Resource U = new Resource("U", INT, 1); - Resource W = new Resource("W", INT, 1); - - EquationFormula f1 = new EquationFormula(X, Y); - DependencyFormula f2 = new DependencyFormula(X, U); - DependencyFormula f3 = new DependencyFormula(U, W); - DependencyTerm t1 = new DependencyTerm(X, U, U); - DependencyTerm t2 = new DependencyTerm(t1, W, W); - DependencyTerm t3 = new DependencyTerm(Y, U, U); - DependencyTerm t4 = new DependencyTerm(t3, W, W); -// EquationFormula f4 = new EquationFormula(t1, X); -// EquationFormula f4 = new EquationFormula(X, t1); -// EquationFormula f4 = new EquationFormula(t2, X); -// EquationFormula f4 = new EquationFormula(t3, Y); -// EquationFormula f4 = new EquationFormula(t4, Y); - EquationFormula f4 = new EquationFormula(t2, t4); -// DependencyFormula f4 = new DependencyFormula(Y, U); - System.out.println(f1 + ", " + f2 + ", " + f3); - boolean result = ProofSystem.check(List.of(f1, f2, f3), f4); - System.out.println(result); - } - - static void sandbox5() { - Resource a = new Resource("a", INT, 1); - Resource b = new Resource("b", INT, 1); - Resource c = new Resource("c", INT, 1); - Resource d = new Resource("d", INT, 1); - Resource e = new Resource("e", INT, 1); - Resource f = new Resource("f", INT, 1); - Resource x = new Resource("x", INT, 0); - Resource y = new Resource("y", INT, 0); - DependencyTerm t1 = new DependencyTerm(a, b, c, d, e); - DependencyTerm t2 = new DependencyTerm(t1, f, x); - EquationFormula fm = new EquationFormula(t2, y); - System.out.println(t1); - System.out.println(t2); - System.out.println(fm); - RewriteInferenceSystem tmp = new RewriteInferenceSystem(List.of(fm), null); - tmp.debug(); - tmp.inference(); - } - - static void sandbox6() { - Resource uid = new Resource("uid", INT, 1); - Resource org = new Resource("org", INT, 1); - Resource uadd = new Resource("uadd", INT, 1); - Resource cid = new Resource("cid", INT, 1); - Resource add = new Resource("add", INT, 1); - Resource addP = new Resource("add'", INT, 1); - Resource cidP = new Resource("cid'", INT, 1); - Resource orgP = new Resource("org'", INT, 1); - Resource uidP = new Resource("uid'", INT, 1); - Resource uaddP = new Resource("uadd'", INT, 1); - Resource x = new Resource("x", INT, 0); - Resource y = new Resource("y", INT, 0); - Resource z = new Resource("z", INT, 0); - - DependencyTerm t1 = new DependencyTerm(add, cid, org); - DependencyTerm t2 = new DependencyTerm(addP, cidP, orgP); - DependencyTerm t3 = new DependencyTerm(orgP, uidP, x); - DependencyTerm t4 = new DependencyTerm(add, cid, y); - DependencyTerm t5 = new DependencyTerm(uaddP, uidP, x); - - EquationFormula f1 = new EquationFormula(uadd, t1); - EquationFormula f2 = new EquationFormula(uaddP, t2); - EquationFormula f3 = new EquationFormula(t3, y); - EquationFormula f4 = new EquationFormula(t4, t5); - - RewriteInferenceSystem tmp = new RewriteInferenceSystem(List.of(f1, f2, f3), f4); - tmp.debug(); - tmp.inference(); - - } - - - @SneakyThrows - static Expression parse(String expr) { - stream.addLine(expr); - return parser.parseTerm(stream, model); - } - - -} diff --git a/src/exceptions/CoefficientNotOneException.java b/src/exceptions/CoefficientNotOneException.java deleted file mode 100644 index ddef07c..0000000 --- a/src/exceptions/CoefficientNotOneException.java +++ /dev/null @@ -1,13 +0,0 @@ -package exceptions; - -public class CoefficientNotOneException extends RuntimeException { - - public CoefficientNotOneException(String msg) { - super(msg); - } - - public CoefficientNotOneException() { - super("Coefficient is not 1."); - } - -} diff --git a/src/exceptions/IllegalTypeException.java b/src/exceptions/IllegalTypeException.java deleted file mode 100644 index ea73b66..0000000 --- a/src/exceptions/IllegalTypeException.java +++ /dev/null @@ -1,13 +0,0 @@ -package exceptions; - -public class IllegalTypeException extends RuntimeException { - - public IllegalTypeException() { - super("Term type is illegal"); - } - - public IllegalTypeException(String msg) { - super(msg); - } - -} diff --git a/src/exceptions/NonLinearExpressionException.java b/src/exceptions/NonLinearExpressionException.java deleted file mode 100644 index fc56963..0000000 --- a/src/exceptions/NonLinearExpressionException.java +++ /dev/null @@ -1,13 +0,0 @@ -package exceptions; - -public class NonLinearExpressionException extends RuntimeException { - - public NonLinearExpressionException() { - super("This Expression is not linear"); - } - - public NonLinearExpressionException(String msg) { - super(msg); - } - -} diff --git a/src/exceptions/SubstituteFailedException.java b/src/exceptions/SubstituteFailedException.java deleted file mode 100644 index de4a0e2..0000000 --- a/src/exceptions/SubstituteFailedException.java +++ /dev/null @@ -1,13 +0,0 @@ -package exceptions; - -public class SubstituteFailedException extends RuntimeException { - - public SubstituteFailedException(String msg) { - super(msg); - } - - public SubstituteFailedException() { - super("substitute failed"); - } - -} diff --git a/src/exceptions/TooManyVariablesException.java b/src/exceptions/TooManyVariablesException.java deleted file mode 100644 index 407ca30..0000000 --- a/src/exceptions/TooManyVariablesException.java +++ /dev/null @@ -1,13 +0,0 @@ -package exceptions; - -public class TooManyVariablesException extends RuntimeException { - - public TooManyVariablesException(String msg) { - super(msg); - } - - public TooManyVariablesException() { - super("Too many variables"); - } - -} diff --git a/src/inference/InferenceOrderConstraint.java b/src/inference/InferenceOrderConstraint.java deleted file mode 100644 index e74b9dc..0000000 --- a/src/inference/InferenceOrderConstraint.java +++ /dev/null @@ -1,105 +0,0 @@ -package inference; -import java.util.Map; - -import exceptions.IllegalTypeException; -import lombok.Getter; -import models.algebra.Constant; -import models.algebra.Expression; -import models.algebra.Variable; -import models.terms.meta.OrderConstraint; -import models.terms.meta.OrderVariableConstraint; - -@Getter -public class InferenceOrderConstraint { - - private final Variable leftSideHandVariable; - private final int leftSideHandConstant; - private final OrderConstraint operator; - private final Variable rightSideHandVariable; - private final int rightSideHandConstant; - - public InferenceOrderConstraint(Expression left, OrderConstraint operator, Expression right) { - if ((left instanceof Constant) && (right instanceof Constant)) { - throw new IllegalTypeException("Both left and right can't be Constant"); - } - if (left instanceof Constant) { - leftSideHandConstant = Integer.parseInt(((Constant) left).toString()); - leftSideHandVariable = null; - } else if (left instanceof Variable) { - leftSideHandConstant = -1; - leftSideHandVariable = (Variable) left; - } else { - throw new IllegalTypeException("Left must be Constant or Variable"); - } - - this.operator = operator; - - if (right instanceof Constant) { - rightSideHandConstant = Integer.parseInt(((Constant) right).toString()); - rightSideHandVariable = null; - } else if (right instanceof Variable) { - rightSideHandConstant = -1; - rightSideHandVariable = (Variable) right; - } else { - throw new IllegalTypeException("Right must be Constant or Variable"); - } - } - - public boolean check(Map orderConstraints) { - switch(this.operator) { - case EQ: - return getLeftValue(orderConstraints) == getRightValue(orderConstraints); - case GE: - return getLeftValue(orderConstraints) >= getRightValue(orderConstraints); - case GT: - return getLeftValue(orderConstraints) > getRightValue(orderConstraints); - case LE: - return getLeftValue(orderConstraints) <= getRightValue(orderConstraints); - case LT: - return getLeftValue(orderConstraints) < getRightValue(orderConstraints); - default: - return false; - } - } - - private int getLeftValue(Map orderConstraints) { - if (this.leftSideHandVariable != null) { - OrderVariableConstraint constraint = orderConstraints.get(this.leftSideHandVariable); - return constraint.getLower(); - } else { - return this.leftSideHandConstant; - } - } - - private int getRightValue(Map orderConstraints) { - if (this.rightSideHandVariable != null) { - OrderVariableConstraint constraint = orderConstraints.get(this.rightSideHandVariable); - return constraint.getLower(); - } else { - return this.rightSideHandConstant; - } - } - - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - if (this.leftSideHandVariable != null) { - sb.append(this.leftSideHandVariable.toString()); - } else { - sb.append(this.leftSideHandConstant); - } - sb.append(" "); - sb.append(operator.getOperator()); - sb.append(" "); - if (this.rightSideHandVariable != null) { - sb.append(this.rightSideHandVariable.toString()); - } else { - sb.append(this.rightSideHandConstant); - } - - return sb.toString(); - - } - -} diff --git a/src/inference/InferenceRule.java b/src/inference/InferenceRule.java deleted file mode 100644 index 1a3243b..0000000 --- a/src/inference/InferenceRule.java +++ /dev/null @@ -1,247 +0,0 @@ -package inference; - -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import exceptions.SubstituteFailedException; -import lombok.Getter; -import models.algebra.Variable; -import models.formulas.Formula; -import models.formulas.meta.MetaDependencyFormula; -import models.formulas.meta.MetaEquationFormula; -import models.formulas.meta.MetaFormula; -import models.terms.RDLTerm; -import models.terms.meta.OrderVariableConstraint; -import utils.Permutation; - -public class InferenceRule { - - @Getter - private final String name; - - @Getter - private final List assumptions; - @Getter - private final MetaFormula conclusion; - private final InferenceOrderConstraint defaultOrderConstraint; - - public InferenceRule(String name, List assumptions, MetaFormula conclusion, InferenceOrderConstraint constraint) { - this.name = name; - this.assumptions = assumptions; - this.conclusion = conclusion; - this.defaultOrderConstraint = constraint; - } - - public InferenceRule( List assumptions, MetaFormula conclusion, InferenceOrderConstraint constraint) { - this.name = "undefined"; - this.assumptions = assumptions; - this.conclusion = conclusion; - this.defaultOrderConstraint = constraint; - } - - public InferenceRule(String name, List assumptions, MetaFormula conclusion) { - this.assumptions = assumptions; - this.conclusion = conclusion; - this.name = name; - this.defaultOrderConstraint = null; - } - - public InferenceRule(List assumptions, MetaFormula conclusion) { - this.assumptions = assumptions; - this.conclusion = conclusion; - this.name = "undefined"; - this.defaultOrderConstraint = null; - } - - public boolean check(Collection assumptions, Formula conclusion) { - - if (this.assumptions.size() > assumptions.size()) { - return false; - } - - Map binding = new HashMap<>(); - Map orderConstraints = new HashMap<>(); - this.conclusion.isMatchedBy(conclusion, binding, orderConstraints); - Set givenAssumptions = new HashSet<>(assumptions); - - for (MetaFormula assumption : this.assumptions) { - boolean flg = false; - for (Formula given : givenAssumptions) { - Map tmpBinding = new HashMap<>(binding); - Map tmpOrderConstraints = new HashMap<>(orderConstraints); - if (assumption.isMatchedBy(given, tmpBinding, tmpOrderConstraints)) { - binding.putAll(tmpBinding); - orderConstraints.putAll(tmpOrderConstraints); - flg = true; - givenAssumptions.remove(given); - break; - } - } - if (!flg) { - return false; - } - } - - if (this.defaultOrderConstraint != null) { - return defaultOrderConstraint.check(orderConstraints); - } - - return true; - -// for(List assumption : permutation(assumptions, this.assumptions.size())) { -// if (check(assumption, conclusion)) { -// return true; -// } -// } -// return false; - } - - private boolean check(List assumptions, Formula conclusion) { - Map binding = new HashMap<>(); - Map orderConstraints = new HashMap<>(); - for (int i = 0; i < assumptions.size(); i++) { - if (! this.assumptions.get(i).isMatchedBy(assumptions.get(i), binding, orderConstraints)) { - return false; - } - } - if (! this.conclusion.isMatchedBy(conclusion, binding, orderConstraints)) { - return false; - } - if (this.defaultOrderConstraint != null) { - return defaultOrderConstraint.check(orderConstraints); - } - return true; - } - - - public Formula apply(List assumptions) { - if (assumptions.size() != getAssumptionSize()) { - return null; - } - Map binding = new HashMap<>(); - Map orderConstraint = new HashMap<>(); - for (int i = 0; i < getAssumptionSize(); i++) { - if (! this.assumptions.get(i).isMatchedBy(assumptions.get(i), binding, orderConstraint)) { - return null; - } - } - return conclusion.substitution(binding); - } - - public Set apply(List assumptions, Set existTerms) { - Set result = new HashSet<>(); - if (assumptions.size() != getAssumptionSize()) { - return null; - } - Map binding = new HashMap<>(); - Map orderConstraint = new HashMap<>(); - for (int i = 0; i < getAssumptionSize(); i++) { - if (! this.assumptions.get(i).isMatchedBy(assumptions.get(i), binding, orderConstraint)) { - return result; - } - } - try { - result.add(conclusion.substitution(binding)); - } catch (SubstituteFailedException e) { - - } - for (RDLTerm term : existTerms) { - Map localBinding = new HashMap<>(binding); - Map localOrderConstraint = new HashMap<>(orderConstraint); - if (conclusion instanceof MetaEquationFormula) { - MetaEquationFormula equation = (MetaEquationFormula) conclusion; - if (equation.getLeftSideHand().isMatchedBy(term, localBinding, localOrderConstraint)) { - result.add(conclusion.substitution(localBinding)); - } - } - else if (conclusion instanceof MetaDependencyFormula) { - MetaDependencyFormula dependency = (MetaDependencyFormula) conclusion; - if (dependency.getDependency().isMatchedBy(term, localBinding, localOrderConstraint)) { - result.add(conclusion.substitution(localBinding)); - } - } - } - - for (RDLTerm term : existTerms) { - Map localBinding = new HashMap<>(binding); - Map localOrderConstraint = new HashMap<>(orderConstraint); - if (conclusion instanceof MetaEquationFormula) { - MetaEquationFormula equation = (MetaEquationFormula) conclusion; - if (equation.getRightSideHand().isMatchedBy(term, localBinding, localOrderConstraint)) { - result.add(conclusion.substitution(localBinding)); - } - } - } - return result; - } - - public Formula apply(Collection assumptions) { - if (assumptions.size() != getAssumptionSize()) { - return null; - } - for (List assumptionList : Permutation.permutation(assumptions, assumptions.size())) { - boolean matchFailed = false; - for (int i = 0; i < getAssumptionSize(); i++) { - if (! this.assumptions.get(i).isMatchedBy(assumptionList.get(i))) { - matchFailed = true; - break; - } - } - if (matchFailed) { - continue; - } else { - return apply(assumptionList); - } - } - return null; - } - - - public int getAssumptionSize() { - return this.assumptions.size(); - } - - - public String toString() { - StringBuilder sb = new StringBuilder(); - if (defaultOrderConstraint != null) { - sb.append(defaultOrderConstraint); - sb.append(", "); - } - for (int i = 0; i < assumptions.size(); i++) { - sb.append(assumptions.get(i).toString()); - if (i != assumptions.size() - 1) { - sb.append(", "); - } - } - String assumpStr = sb.toString(); - String concluStr = conclusion.toString(); - String line = "-".repeat(Math.max(assumpStr.length(), concluStr.length())) + " (" + this.name + ")"; - sb = new StringBuilder(); - sb.append(assumpStr); - sb.append("\n"); - sb.append(line); - sb.append("\n"); - sb.append(concluStr); - return sb.toString(); - } - - @Override - public boolean equals(Object another) { - if (! (another instanceof InferenceRule)) { - return false; - } - InferenceRule anotherRule = (InferenceRule) another; - return getName().equals(anotherRule.getName()); - } - - @Override - public int hashCode() { - return getName().hashCode(); - } - -} diff --git a/src/inference/ProofSystem.java b/src/inference/ProofSystem.java deleted file mode 100644 index 8d1b7be..0000000 --- a/src/inference/ProofSystem.java +++ /dev/null @@ -1,783 +0,0 @@ -package inference; - -import java.util.ArrayDeque; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Deque; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Queue; -import java.util.Set; -import java.util.stream.Collectors; - -import models.algebra.Constant; -import models.algebra.Variable; -import models.formulas.DependencyFormula; -import models.formulas.EquationFormula; -import models.formulas.Formula; -import models.formulas.InFormula; -import models.formulas.meta.MetaDependencyFormula; -import models.formulas.meta.MetaEquationFormula; -import models.formulas.meta.MetaInFormula; -import models.terms.EvaluatableTerm; -import models.terms.RDLTerm; -import models.terms.meta.MetaEvaluatableTermVariable; -import models.terms.meta.MetaRDLTerm; -import models.terms.meta.MetaResource; -import models.terms.meta.OrderConstraint; -import utils.Product; - -public class ProofSystem { - - //======================Equality Axioms============================= - - private static final InferenceRule reflexivity = new InferenceRule( - "Reflexivity", - List.of(), - new MetaEquationFormula( - new MetaEvaluatableTermVariable(new Variable("te")), - new MetaEvaluatableTermVariable(new Variable("te")) - ) - ); - - private static final InferenceRule symmetry = new InferenceRule( - "Symmetry", - List.of( - new MetaEquationFormula( - new MetaEvaluatableTermVariable(new Variable("te")), - new MetaEvaluatableTermVariable(new Variable("se")) - ) - ), - new MetaEquationFormula( - new MetaEvaluatableTermVariable(new Variable("se")), - new MetaEvaluatableTermVariable(new Variable("te")) - ) - ); - - private static final InferenceRule transitivity = new InferenceRule( - "Transitivity", - List.of( - new MetaEquationFormula( - new MetaEvaluatableTermVariable(new Variable("se")), - new MetaEvaluatableTermVariable(new Variable("te")) - ), - new MetaEquationFormula( - new MetaEvaluatableTermVariable(new Variable("te")), - new MetaEvaluatableTermVariable(new Variable("ue")) - ) - ), - new MetaEquationFormula( - new MetaEvaluatableTermVariable(new Variable("se")), - new MetaEvaluatableTermVariable(new Variable("ue")) - ) - ); - - private static final InferenceRule rightSubstitution = new InferenceRule( - "Right Substitution", - List.of( - new MetaEquationFormula( - new MetaEvaluatableTermVariable(new Variable("te")), - new MetaEvaluatableTermVariable(new Variable("ue")) - ), - new MetaDependencyFormula( - new MetaEvaluatableTermVariable(new Variable("se")), - new MetaResource(new Variable("r")) - ), - new MetaInFormula( - new MetaEvaluatableTermVariable(new Variable("te")), - new MetaRDLTerm(new MetaResource(new Variable("r"))) - ) - ), - new MetaEquationFormula( - new MetaRDLTerm( - new MetaEvaluatableTermVariable(new Variable("se")), - new MetaResource(new Variable("r")), - new MetaEvaluatableTermVariable(new Variable("te")) - ), - new MetaRDLTerm( - new MetaEvaluatableTermVariable(new Variable("se")), - new MetaResource(new Variable("r")), - new MetaEvaluatableTermVariable(new Variable("ue")) - ) - ) - ); - - private static final InferenceRule leftSubstitution = new InferenceRule( - "Left Substitution", - List.of( - new MetaEquationFormula( - new MetaEvaluatableTermVariable(new Variable("se")), - new MetaEvaluatableTermVariable(new Variable("te")) - ), - new MetaDependencyFormula( - new MetaEvaluatableTermVariable(new Variable("se")), - new MetaResource(new Variable("r")) - ), - new MetaInFormula( - new MetaEvaluatableTermVariable(new Variable("ue")), - new MetaRDLTerm(new MetaResource(new Variable("r"))) - ) - ), - new MetaEquationFormula( - new MetaRDLTerm( - new MetaEvaluatableTermVariable(new Variable("se")), - new MetaResource(new Variable("r")), - new MetaEvaluatableTermVariable(new Variable("ue")) - ), - new MetaRDLTerm( - new MetaEvaluatableTermVariable(new Variable("te")), - new MetaResource(new Variable("r")), - new MetaEvaluatableTermVariable(new Variable("ue")) - ) - ) - ); - - private static final InferenceRule identity = new InferenceRule( - "Identity", - List.of( - new MetaInFormula( - new MetaEvaluatableTermVariable(new Variable("te")), - new MetaRDLTerm(new MetaResource(new Variable("r"))) - ) - ), - new MetaEquationFormula( - new MetaRDLTerm( - new MetaResource(new Variable("r")), - new MetaResource(new Variable("r")), - new MetaEvaluatableTermVariable(new Variable("te")) - ), - new MetaEvaluatableTermVariable(new Variable("te")) - ) - ); - - private static final InferenceRule mapComposition = new InferenceRule( - "Map Composition", - List.of( - new MetaDependencyFormula( - new MetaEvaluatableTermVariable(new Variable("se")), - new MetaResource(new Variable("r")) - ), - new MetaDependencyFormula( - new MetaResource(new Variable("r")), - new MetaResource(new Variable("p")) - ), - new MetaInFormula( - new MetaEvaluatableTermVariable(new Variable("te")), - new MetaRDLTerm(new MetaResource(new Variable("p"))) - ) - ), - new MetaEquationFormula( - new MetaRDLTerm( - new MetaEvaluatableTermVariable(new Variable("se")), - new MetaResource(new Variable("r")), - new MetaRDLTerm( - new MetaResource(new Variable("r")), - new MetaResource(new Variable("p")), - new MetaEvaluatableTermVariable(new Variable("te")) - ) - ), - new MetaRDLTerm( - new MetaEvaluatableTermVariable(new Variable("se")), - new MetaResource(new Variable("p")), - new MetaEvaluatableTermVariable(new Variable("te")) - ) - ) - ); - - private static final InferenceRule constantness = new InferenceRule( - "Constantness", - List.of( - new MetaInFormula( - new MetaEvaluatableTermVariable(new Variable("t1")), - new MetaRDLTerm(new MetaResource(new Variable("r1"), new Variable("m"))) - ) - ), - new MetaEquationFormula( - new MetaRDLTerm( - new MetaEvaluatableTermVariable(new Variable("se"), new Variable("n")), - new MetaResource(new Variable("r1"), new Variable("m")), - new MetaEvaluatableTermVariable(new Variable("t1")) - ), - new MetaEvaluatableTermVariable(new Variable("se"), new Variable("n")) - ), - new InferenceOrderConstraint(new Variable("n"), OrderConstraint.LT, new Variable("m")) - ); - - private static final InferenceRule rightNormalization = new InferenceRule( - "Right Normalization", - List.of( - new MetaDependencyFormula( - new MetaRDLTerm( - new MetaEvaluatableTermVariable(new Variable("te")), - new MetaResource(new Variable("r"), new Variable("n")) - ) - ), - new MetaDependencyFormula( - new MetaRDLTerm( - new MetaEvaluatableTermVariable(new Variable("se")), - new MetaResource(new Variable("q"), new Variable("n")) - ) - ) - ), - new MetaEquationFormula( - new MetaRDLTerm( - new MetaRDLTerm( - new MetaEvaluatableTermVariable(new Variable("te")), - new MetaResource(new Variable("r"), new Variable("n")), - new MetaEvaluatableTermVariable(new Variable("se")) - ), - new MetaResource(new Variable("q"), new Variable("n")), - new MetaEvaluatableTermVariable(new Variable("ue")) - ), - new MetaRDLTerm( - new MetaEvaluatableTermVariable(new Variable("te")), - new MetaResource(new Variable("r"), new Variable("n")), - new MetaRDLTerm( - new MetaEvaluatableTermVariable(new Variable("se")), - new MetaResource(new Variable("q"), new Variable("n")), - new MetaEvaluatableTermVariable(new Variable("ue")) - ) - ) - ), - new InferenceOrderConstraint(new Variable("n"), OrderConstraint.GT, new Constant("0")) - ); - - private static final InferenceRule pseudoConstantness = new InferenceRule( - "Pseudo-Constantness", - List.of( - new MetaDependencyFormula( - new MetaRDLTerm( - new MetaEvaluatableTermVariable(new Variable("te"), new Variable("n")), - new MetaResource(new Variable("r"), new Variable("n")) - ) - ) - ), - new MetaEquationFormula( - new MetaRDLTerm( - new MetaEvaluatableTermVariable(new Variable("te"), new Variable("n")), - new MetaResource(new Variable("r"), new Variable("n")), - new MetaResource(new Variable("r"), new Variable("n")) - ), - new MetaEvaluatableTermVariable(new Variable("te"), new Variable("n")) - ), - new InferenceOrderConstraint(new Variable("n"), OrderConstraint.GT, new Constant("0")) - ); - - //======================Dependency Axioms============================= - - private static final InferenceRule identityMapping = new InferenceRule( - "Identity Mapping", - List.of( - new MetaEquationFormula( - new MetaEvaluatableTermVariable(new Variable("te")), - new MetaResource(new Variable("r")) - ) - ), - new MetaDependencyFormula( - new MetaEvaluatableTermVariable(new Variable("te")), - new MetaResource(new Variable("r")) - ) - ); - - private static final InferenceRule compositeMapping = new InferenceRule( - "Composite Mapping", - List.of( - new MetaDependencyFormula( - new MetaEvaluatableTermVariable(new Variable("te")), - new MetaResource(new Variable("r")) - ), - new MetaDependencyFormula( - new MetaEvaluatableTermVariable(new Variable("r")), - new MetaResource(new Variable("q")) - ) - ), - new MetaDependencyFormula( - new MetaEvaluatableTermVariable(new Variable("te")), - new MetaResource(new Variable("q")) - ) - ); - - private static final InferenceRule constantMapping = new InferenceRule( - "Constant Mapping", - List.of(), - new MetaDependencyFormula( - new MetaEvaluatableTermVariable(new Variable("te"), new Variable("n")), - new MetaResource(new Variable("r"), new Variable("m")) - ), - new InferenceOrderConstraint(new Variable("n"), OrderConstraint.LT, new Variable("m")) - ); - - private static final InferenceRule slicedMapping = new InferenceRule( - "Sliced Mapping", - List.of( - new MetaDependencyFormula( - new MetaRDLTerm( - new MetaEvaluatableTermVariable(new Variable("se")), - new MetaResource(new Variable("r")) - ), - new MetaResource(new Variable("p")) - ), - new MetaDependencyFormula( - new MetaEvaluatableTermVariable(new Variable("te")), - new MetaResource(new Variable("p")) - ) - ), - new MetaDependencyFormula( - new MetaRDLTerm( - new MetaEvaluatableTermVariable(new Variable("se")), - new MetaResource(new Variable("r")), - new MetaEvaluatableTermVariable(new Variable("te")) - ), - new MetaResource(new Variable("p")) - ) - ); - - //======================Set-Theoretic Axioms============================= - - private static final InferenceRule memberSubstitution = new InferenceRule( - "Member Substitution", - List.of( - new MetaInFormula( - new MetaEvaluatableTermVariable(new Variable("se")), - new MetaEvaluatableTermVariable(new Variable("ue")) - ), - new MetaEquationFormula( - new MetaEvaluatableTermVariable(new Variable("se")), - new MetaEvaluatableTermVariable(new Variable("te")) - ) - ), - new MetaInFormula( - new MetaEvaluatableTermVariable(new Variable("te")), - new MetaEvaluatableTermVariable(new Variable("ue")) - ) - ); - - private static final InferenceRule membershipChain = new InferenceRule( - "Membership Chain", - List.of( - new MetaInFormula( - new MetaEvaluatableTermVariable(new Variable("se")), - new MetaEvaluatableTermVariable(new Variable("te")) - ), - new MetaInFormula( - new MetaEvaluatableTermVariable(new Variable("te")), - new MetaEvaluatableTermVariable(new Variable("ue")) - ) - ), - new MetaInFormula( - new MetaEvaluatableTermVariable(new Variable("se")), - new MetaEvaluatableTermVariable(new Variable("ue")) - ) - ); - - private static final InferenceRule collectionSubstitution = new InferenceRule( - "Collection Substitution", - List.of( - new MetaInFormula( - new MetaEvaluatableTermVariable(new Variable("se")), - new MetaEvaluatableTermVariable(new Variable("te")) - ), - new MetaEquationFormula( - new MetaEvaluatableTermVariable(new Variable("te")), - new MetaEvaluatableTermVariable(new Variable("ue")) - ) - ), - new MetaInFormula( - new MetaEvaluatableTermVariable(new Variable("se")), - new MetaEvaluatableTermVariable(new Variable("ue")) - ) - ); - - private static final InferenceRule setEquivelence = new InferenceRule( - "Set Equivelence", - List.of( - new MetaEquationFormula( - new MetaEvaluatableTermVariable(new Variable("se"), new Variable("n")), - new MetaEvaluatableTermVariable(new Variable("te"), new Variable("n")) - ) - ), - new MetaEquationFormula( - new MetaRDLTerm(new MetaEvaluatableTermVariable(new Variable("se"), new Variable("n"))), - new MetaRDLTerm(new MetaEvaluatableTermVariable(new Variable("te"), new Variable("n"))) - ), - new InferenceOrderConstraint(new Variable("n"), OrderConstraint.GT, new Constant("0")) - ); - - private static final InferenceRule setHomomorphism = new InferenceRule( - "Set Homomorphism", - List.of( - new MetaDependencyFormula( - new MetaEvaluatableTermVariable(new Variable("se")), - new MetaResource(new Variable("r")) - ) - ), - new MetaEquationFormula( - new MetaRDLTerm( - new MetaEvaluatableTermVariable(new Variable("se")), - new MetaResource(new Variable("r")), - new MetaRDLTerm(new MetaEvaluatableTermVariable(new Variable("te"))) - ), - new MetaRDLTerm( - new MetaRDLTerm( - new MetaEvaluatableTermVariable(new Variable("se")), - new MetaResource(new Variable("r")), - new MetaEvaluatableTermVariable(new Variable("te")) - ) - ) - ) - ); - - private static final InferenceRule leftProjection = new InferenceRule( - "Left Projection", - List.of( - new MetaDependencyFormula( - new MetaRDLTerm( - new MetaEvaluatableTermVariable(new Variable("te"), new Variable("n")), - new MetaResource(new Variable("r"), new Variable("m")) - ), - new MetaResource(new Variable("q"), new Variable("l")) - ) - ), - new MetaDependencyFormula( - new MetaRDLTerm(new MetaEvaluatableTermVariable(new Variable("te"), new Variable("n"))), - new MetaResource(new Variable("q"), new Variable("l")) - ) - ); - - private static final InferenceRule rightProjection = new InferenceRule( - "Right Projection", - List.of( - new MetaDependencyFormula( - new MetaRDLTerm( - new MetaEvaluatableTermVariable(new Variable("te"), new Variable("n")), - new MetaResource(new Variable("r"), new Variable("m")) - ), - new MetaResource(new Variable("q"), new Variable("l")) - ) - ), - new MetaDependencyFormula( - new MetaRDLTerm(new MetaEvaluatableTermVariable(new Variable("r"), new Variable("m"))), - new MetaResource(new Variable("q"), new Variable("l")) - ) - ); - - private static final InferenceRule domainMembership = new InferenceRule( - "Domain Membership", - List.of( - new MetaEquationFormula( - new MetaRDLTerm( - new MetaRDLTerm( - new MetaEvaluatableTermVariable(new Variable("se")), - new MetaResource(new Variable("r1")), - new MetaEvaluatableTermVariable(new Variable("t1")) - ), - new MetaResource(new Variable("r2")), - new MetaEvaluatableTermVariable(new Variable("t2")) - ), - new MetaResource(new Variable("c")) - ) - ), - new MetaInFormula( - new MetaRDLTerm( - new MetaEvaluatableTermVariable(new Variable("t1")), - new MetaResource(new Variable("r2")), - new MetaEvaluatableTermVariable(new Variable("t2")) - ), - new MetaRDLTerm( - new MetaRDLTerm(new MetaResource(new Variable("r1"))), - new MetaResource(new Variable("r2")), - new MetaEvaluatableTermVariable(new Variable("t2")) - ) - ) - ); - - private static final InferenceRule codomainMembership = new InferenceRule( - "Codomain Membership", - List.of( - new MetaDependencyFormula( - new MetaRDLTerm( - new MetaEvaluatableTermVariable(new Variable("se")), - new MetaResource(new Variable("r1")), - new MetaEvaluatableTermVariable(new Variable("t1")) - ), - new MetaResource(new Variable("r2")) - ), - new MetaInFormula( - new MetaRDLTerm( - new MetaEvaluatableTermVariable(new Variable("t1")), - new MetaResource(new Variable("r2")), - new MetaEvaluatableTermVariable(new Variable("t2")) - ), - new MetaRDLTerm( - new MetaRDLTerm( - new MetaResource(new Variable("r1")) - ), - new MetaResource(new Variable("r2")), - new MetaEvaluatableTermVariable(new Variable("t2")) - ) - ) - ), - new MetaInFormula( - new MetaRDLTerm( - new MetaRDLTerm( - new MetaEvaluatableTermVariable(new Variable("se")), - new MetaResource(new Variable("r1")), - new MetaEvaluatableTermVariable(new Variable("t1")) - ), - new MetaResource(new Variable("r2")), - new MetaEvaluatableTermVariable(new Variable("t2")) - ), - new MetaRDLTerm( - new MetaRDLTerm( - new MetaResource(new Variable("se")) - ), - new MetaResource(new Variable("r2")), - new MetaEvaluatableTermVariable(new Variable("t2")) - ) - ) - ); - - private static final InferenceRule codomainMembership2 = new InferenceRule( - "Codomain Membership2", - List.of( - new MetaDependencyFormula( - new MetaEvaluatableTermVariable(new Variable("se")), - new MetaResource(new Variable("r1")) - ), - new MetaInFormula( - new MetaEvaluatableTermVariable(new Variable("t1")), - new MetaRDLTerm( - new MetaResource(new Variable("r1")) - ) - ) - ), - new MetaInFormula( - new MetaRDLTerm( - new MetaEvaluatableTermVariable(new Variable("se")), - new MetaResource(new Variable("r1")), - new MetaEvaluatableTermVariable(new Variable("t1")) - ), - new MetaRDLTerm( - new MetaResource(new Variable("se")) - ) - ) - ); - - private static final List axioms = List.of( -// reflexivity, - symmetry, - transitivity, - rightSubstitution, - leftSubstitution, - identity, - mapComposition, - constantness, - rightNormalization, - pseudoConstantness, - identityMapping, - compositeMapping, - constantMapping, - slicedMapping, - memberSubstitution, - membershipChain, - collectionSubstitution, - setEquivelence, - setHomomorphism, - leftProjection, - rightProjection, - domainMembership, - codomainMembership, - codomainMembership2 - ); - - public static void debug() { - for (var axiom : axioms) { - System.out.println(axiom); - System.out.println("=================================================================================================="); - } - } - - record AxiomResult(InferenceRule axiom, List formulas) {} - - public static boolean check(Collection assumptions, Formula conclusion) { - - Map proofGraph = new HashMap<>(); - Map>> appliedFormulas = new HashMap<>(); - - for (InferenceRule axiom : axioms) { - appliedFormulas.put(axiom, new HashSet<>()); - } - - Set appearFormulas = new HashSet<>(assumptions); - Set existTerms = new HashSet<>(); - for (Formula assumption : assumptions) { - addExistTerms(assumption, existTerms); - } - int prevAppearFormulasSize = appearFormulas.size(); - while (! appearFormulas.contains(conclusion)) { - Set derivedFormulas = new HashSet<>(); - for(InferenceRule axiom : axioms) { - derivedFormulas.addAll(applyAxiom(axiom, appearFormulas, appliedFormulas.get(axiom), existTerms, proofGraph)); - } - if (derivedFormulas.size() == 0) { - return false; - } - appearFormulas.addAll(derivedFormulas); - if (appearFormulas.size() == prevAppearFormulasSize) { - return false; - } - prevAppearFormulasSize = appearFormulas.size(); - } - - Queue formulaQueue = new ArrayDeque<>(); - Queue depthQueue = new ArrayDeque<>(); - List formulaResult = new ArrayList<>(); - List depthResult = new ArrayList<>(); - Set used = new HashSet<>(); - Map> usedAxioms = new HashMap<>(); - - formulaQueue.add(conclusion); - depthQueue.add(0); - - System.out.println("proof finish"); - System.out.println(); - - while (formulaQueue.size() != 0) { - Formula currentFormula = formulaQueue.poll(); -// if (used.contains(currentFormula)) { -// continue; -// } - used.add(currentFormula); - int currentDepth = depthQueue.poll(); - formulaResult.add(currentFormula); - depthResult.add(currentDepth); - if (! proofGraph.containsKey(currentFormula)) continue; - for (Formula nextFormula : proofGraph.get(currentFormula).formulas) { -// if (used.contains(nextFormula)) { -// continue; -// } - formulaQueue.add(nextFormula); - depthQueue.add(currentDepth + 1); - if (! usedAxioms.containsKey(currentDepth + 1)) { - usedAxioms.put(currentDepth + 1, new HashSet<>()); - } - usedAxioms.get(currentDepth + 1).add(proofGraph.get(currentFormula).axiom); - } - } - int prevDepth = depthResult.get(depthResult.size() - 1); - Set sameDepthFormulas = new HashSet<>(); - for (int i = formulaResult.size() - 1; i >= 0; i--) { - int currentDepth = depthResult.get(i); - Formula currentFormula = formulaResult.get(i); - if (currentDepth != prevDepth) { - String out = sameDepthFormulas.stream().map(String::valueOf).collect(Collectors.joining(", ")); - String axioms = usedAxioms.get(prevDepth).stream().map(InferenceRule::getName).collect(Collectors.joining(", ")); - System.out.println(out); - System.out.println("==============================================================(" + axioms + ")"); - sameDepthFormulas.clear(); - } - prevDepth = currentDepth; - sameDepthFormulas.add(currentFormula); - - } - String out = sameDepthFormulas.stream().map(String::valueOf).collect(Collectors.joining(",")); - System.out.println(out); - return true; - } - - private static Set applyAxiom(InferenceRule axiom, Set formulas, Set> appliedFormulas, Set existTerms, Map proofGraph) { - Set result = new HashSet<>(); - List> matchedFormulas = new ArrayList<>(); - for (int i = 0; i < axiom.getAssumptionSize(); i++) { - matchedFormulas.add(new ArrayList<>()); - for (Formula formula : formulas) { - if (axiom.getAssumptions().get(i).isMatchedBy(formula)) { - matchedFormulas.get(i).add(formula); - } - } - } - for(List applyFormulas : Product.product(matchedFormulas)) { - if (appliedFormulas.contains(applyFormulas)) continue; - Set applied = axiom.apply(applyFormulas, existTerms); - if (applied != null) { - for (Formula formula : applied) { - if (! formulas.contains(formula)) { - addExistTerms(formula, existTerms); - proofGraph.put(formula, new AxiomResult(axiom, applyFormulas)); - } - } - result.addAll(applied); - appliedFormulas.add(applyFormulas); - } - } - return result; - } - - private static void addExistTerms(Formula formula, Set existTerms) { - if (formula instanceof EquationFormula) { - RDLTerm leftSideHand = ((EquationFormula) formula).getLeftSideHand(); - RDLTerm rightSideHand = ((EquationFormula) formula).getRightSideHand(); - existTerms.addAll(leftSideHand.getSubTerms(RDLTerm.class).values()); - existTerms.addAll(rightSideHand.getSubTerms(RDLTerm.class).values()); - } else if (formula instanceof DependencyFormula) { - RDLTerm dependency = ((DependencyFormula) formula).getDependency(); - existTerms.addAll(dependency.getSubTerms(RDLTerm.class).values()); - } else if (formula instanceof InFormula){ - RDLTerm leftSideHand = ((InFormula) formula).getLeftSideHand(); - RDLTerm rightSideHand = ((InFormula) formula).getRightSideHand(); - existTerms.addAll(leftSideHand.getSubTerms(RDLTerm.class).values()); - existTerms.addAll(rightSideHand.getSubTerms(RDLTerm.class).values()); - } - } - - private static boolean equationTransitionCheck(Collection assumptions, Formula conclusion) { - if (! (conclusion instanceof EquationFormula)) { - return false; - } - EquationFormula equationConclusion = (EquationFormula) conclusion; - Map> graph = constructEquationGraph(assumptions); - Deque que = new ArrayDeque<>(); - Set visited = new HashSet<>(); - que.add(equationConclusion.getLeftSideHand()); - while (! que.isEmpty()) { - EvaluatableTerm curNode = que.pollFirst(); - if (curNode.equals(equationConclusion.getRightSideHand())) { - return true; - } - for (EvaluatableTerm nextNode : graph.getOrDefault(curNode, new ArrayList<>())) { - if (visited.contains(nextNode)) { - continue; - } - visited.add(nextNode); - que.add(nextNode); - } - } - return false; - } - - private static Map> constructEquationGraph(Collection assumptions) { - List equations = new ArrayList<>(); - for (Formula assumption : assumptions) { - if (assumption instanceof EquationFormula) { - equations.add((EquationFormula) assumption); - } - } - - Map> graph = new HashMap<>(); - for (EquationFormula equation : equations) { - EvaluatableTerm lsh = equation.getLeftSideHand(); - EvaluatableTerm rsh = equation.getRightSideHand(); - if (! graph.containsKey(lsh)) { - graph.put(lsh, new ArrayList<>()); - } - if (! graph.containsKey(rsh)) { - graph.put(rsh, new ArrayList<>()); - } - graph.get(lsh).add(rsh); - graph.get(rsh).add(lsh); - } - return graph; - } -} diff --git a/src/inference/equivalence/MetaSemanticEquivalenceRelation.java b/src/inference/equivalence/MetaSemanticEquivalenceRelation.java deleted file mode 100644 index 6c73c1d..0000000 --- a/src/inference/equivalence/MetaSemanticEquivalenceRelation.java +++ /dev/null @@ -1,237 +0,0 @@ -package inference.equivalence; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import exceptions.CoefficientNotOneException; -import exceptions.SubstituteFailedException; -import exceptions.TooManyVariablesException; -import lombok.Getter; -import models.algebra.Expression; -import models.algebra.Variable; -import models.terms.EvaluatableTerm; -import models.terms.RDLTerm; -import models.terms.meta.MetaRDLTerm; -import models.terms.meta.MetaVariable; -import models.terms.meta.OrderVariableConstraint; -import utils.ExpressionUitls; -import utils.Permutation; - -@Getter -public class MetaSemanticEquivalenceRelation { - - private MetaRDLTerm leftSideHand; - private MetaRDLTerm rightSideHand; - private Expression order; - private Variable orderVariable; - private int orderConstant = 0; - - public MetaSemanticEquivalenceRelation(MetaRDLTerm lsh, MetaRDLTerm rsh, Expression order) { - leftSideHand = lsh; - rightSideHand = rsh; - this.order = order; - Map coefficients = new HashMap<>(); - orderConstant = ExpressionUitls.getCoefficientAndConstantsFromExpression(order, coefficients, 1); - if (coefficients.size() > 1) { - // todo: create exception - throw new TooManyVariablesException("Too many variables"); - } - if (coefficients.size() == 1) { - orderVariable = coefficients.keySet().iterator().next(); - if (coefficients.get(orderVariable) != 1) { - throw new CoefficientNotOneException(); - } - } else { - orderVariable = null; - } - } - - public boolean isMatchedBy(SemanticEquivalenceRelation relation) { - Map binding = new HashMap<>(); - Map orderConstraint = new HashMap<>(); - return isMatchedBy(relation, binding, orderConstraint); - } - - public boolean isMatchedBy(SemanticEquivalenceRelation relation, Map binding, Map orderConstraint) { - return leftSideHand.isMatchedBy(relation.getLeftSideHand(), binding, orderConstraint) - && rightSideHand.isMatchedBy(relation.getRightSideHand(), binding, orderConstraint); - } - - public Set substitute(Map binding, Map orderConstraint, Collection existedTerms) { - Set result = new HashSet<>(); - Map allVariables = new HashMap<>(); - for(MetaVariable variable : leftSideHand.getAllVariables()) { - allVariables.put(variable.getVariableName(), variable); - } - for(MetaVariable variable : rightSideHand.getAllVariables()) { - allVariables.put(variable.getVariableName(), variable); - } - for (Variable variable : binding.keySet()) { - allVariables.remove(variable); - } - List leftVariables = new ArrayList<>(allVariables.keySet()); - for(List useTerms: Permutation.permutation(existedTerms, leftVariables.size())) { - Map tempBinding = new HashMap<>(); - tempBinding.putAll(binding); - boolean flg = false; - for (int i = 0; i < leftVariables.size(); i++) { - if (!allVariables.get(leftVariables.get(i)).isMatchedBy(useTerms.get(i))) { - flg = true; - break; - } - tempBinding.put(leftVariables.get(i), useTerms.get(i)); - } - if (flg) { - continue; - } - EvaluatableTerm leftTerm = (EvaluatableTerm) leftSideHand.substitute(tempBinding); - EvaluatableTerm rightTerm = (EvaluatableTerm) rightSideHand.substitute(tempBinding); - Map tempOrderConstraint = new HashMap<>(); - for(Variable key : orderConstraint.keySet()) { - tempOrderConstraint.put(key, (OrderVariableConstraint)orderConstraint.get(key).clone()); - } - if (leftSideHand.isMatchedBy(leftTerm, binding, tempOrderConstraint) && rightSideHand.isMatchedBy(rightTerm, binding, tempOrderConstraint)) { - if (! tempOrderConstraint.containsKey(orderVariable)) { - continue; - } - int order = tempOrderConstraint.get(this.orderVariable).getOrder(); - if (order == -1) { - continue; - } - order += orderConstant; - result.add(new SemanticEquivalenceRelation(leftTerm, rightTerm, order)); - } - for(Variable variable: leftVariables) { - binding.remove(variable); - } - } - return result; - } - - public Set substitute(RDLTerm term, Collection existedTerms) { - Set result = new HashSet<>(); - Set leftSub = leftSubstitute(term, existedTerms); - if (leftSub != null) { - result.addAll(leftSub); - } - - Set rightSub = rightSubstitute(term, existedTerms); - if (rightSub != null) { - result.addAll(rightSub); - } - return result; - } - - private Set leftSubstitute(RDLTerm term, Collection existedTerms) { - Set result = new HashSet<>(); - Map binding = new HashMap<>(); - Map orderConstraint = new HashMap<>(); - if (! leftSideHand.isMatchedBy(term, binding, orderConstraint)) { - return null; - } - if (! orderConstraint.containsKey(orderVariable)) { - return null; - } - int order = orderConstraint.get(this.orderVariable).getOrder(); - if (order == -1) { - return null; - } - order += orderConstant; - - Set allVariables = new HashSet<>(rightSideHand.getVariables().values()); - allVariables.removeAll(binding.keySet()); - List leftVariables = new ArrayList<>(allVariables); - for (List useVariables: Permutation.permutation(existedTerms, leftVariables.size())) { - Map tempBinding = new HashMap<>(); - tempBinding.putAll(binding); - for (int i = 0; i < leftVariables.size(); i++) { - tempBinding.put(leftVariables.get(i), useVariables.get(i)); - } - RDLTerm tempTerm = rightSideHand.substitute(tempBinding); - if (! rightSideHand.isMatchedBy(tempTerm, binding, orderConstraint)) { - continue; - } - result.add(new SemanticEquivalenceRelation((EvaluatableTerm)leftSideHand.substitute(binding), (EvaluatableTerm) rightSideHand.substitute(binding), order)); - for (int i = 0; i < leftVariables.size(); i++) { - binding.remove(leftVariables.get(i)); - } - } - try { - result.add(new SemanticEquivalenceRelation((EvaluatableTerm)leftSideHand.substitute(binding), (EvaluatableTerm)rightSideHand.substitute(binding), order)); - } catch (SubstituteFailedException e){} - return result; - } - - private Set rightSubstitute(RDLTerm term, Collection existedTerms) { - Set result = new HashSet<>(); - Map binding = new HashMap<>(); - Map orderConstraint = new HashMap<>(); - if (! rightSideHand.isMatchedBy(term, binding, orderConstraint)) { - return null; - }; - if (! orderConstraint.containsKey(orderVariable)) { - return null; - } - int order = orderConstraint.get(this.orderVariable).getOrder(); - if (order == -1) { - return null; - } - order += orderConstant; - - Set allVariables = new HashSet<>(); - for (MetaVariable vari : leftSideHand.getAllVariables()) { - allVariables.add(vari.getVariableName()); - } - allVariables.removeAll(binding.keySet()); - List leftVariables = new ArrayList<>(allVariables); - for (List useVariables: Permutation.permutation(existedTerms, leftVariables.size())) { - Map tempBinding = new HashMap<>(); - tempBinding.putAll(binding); - for (int i = 0; i < leftVariables.size(); i++) { - tempBinding.put(leftVariables.get(i), useVariables.get(i)); - } - RDLTerm tempTerm = leftSideHand.substitute(tempBinding); - if (! leftSideHand.isMatchedBy(tempTerm, binding, orderConstraint)) { - for (int i = 0; i < leftVariables.size(); i++) { - binding.remove(leftVariables.get(i)); - } - continue; - } - result.add(new SemanticEquivalenceRelation((EvaluatableTerm)leftSideHand.substitute(binding), (EvaluatableTerm)rightSideHand.substitute(binding), order)); - for (int i = 0; i < leftVariables.size(); i++) { - binding.remove(leftVariables.get(i)); - } - } - try { - result.add(new SemanticEquivalenceRelation((EvaluatableTerm)leftSideHand.substitute(binding), (EvaluatableTerm)rightSideHand.substitute(binding), order)); - } catch (SubstituteFailedException e){} - return result; - - } - - - @Override - public String toString() { - return leftSideHand.toString() + " ===(" + order + ") " + rightSideHand.toString(); - } - - @Override - public boolean equals(Object another) { - if (! (another instanceof SemanticEquivalenceRelation)) { - return false; - } - SemanticEquivalenceRelation relation = (SemanticEquivalenceRelation) another; - return leftSideHand.equals(relation.getLeftSideHand()) && rightSideHand.equals(relation.getRightSideHand()); - } - - @Override - public int hashCode() { - return toString().hashCode(); - } - -} diff --git a/src/inference/equivalence/SemanticEquivalenceProofSystem.java b/src/inference/equivalence/SemanticEquivalenceProofSystem.java deleted file mode 100644 index 876aad4..0000000 --- a/src/inference/equivalence/SemanticEquivalenceProofSystem.java +++ /dev/null @@ -1,153 +0,0 @@ -package inference.equivalence; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import models.algebra.Constant; -import models.algebra.Term; -import models.algebra.Variable; -import models.dataConstraintModel.DataConstraintModel; -import models.formulas.EquationFormula; -import models.terms.EvaluatableTerm; -import models.terms.LinearRightNormalizedType; -import models.terms.RDLTerm; -import models.terms.meta.MetaEvaluatableTermVariable; -import models.terms.meta.MetaRDLTerm; -import models.terms.meta.MetaResource; -import models.terms.meta.OrderConstraint; -import models.terms.meta.OrderVariableConstraint; - -public class SemanticEquivalenceProofSystem { - - private Map> assumptions; - private EquationFormula conclusion; - private Map proofGraph = new HashMap<>(); - int maxOrder = -1; - - private static MetaSemanticEquivalenceRelation rule1 = new MetaSemanticEquivalenceRelation( - new MetaRDLTerm( - new MetaResource(new Variable("v"), new Term(DataConstraintModel.add, List.of(new Variable("n"), new Constant("1")))), - new MetaResource(new Variable("v"), new Term(DataConstraintModel.add, List.of(new Variable("n"), new Constant("1")))), - new MetaEvaluatableTermVariable(new Variable("t"), new Variable("n"), LinearRightNormalizedType.LINEAR_RIGHT_NORMALIZED) - ), - new MetaEvaluatableTermVariable(new Variable("t"), new Variable("n"), LinearRightNormalizedType.LINEAR_RIGHT_NORMALIZED), - new Variable("n") - ); - - private static MetaSemanticEquivalenceRelation rule4_1 = new MetaSemanticEquivalenceRelation( - new MetaEvaluatableTermVariable(new Variable("t"), new Term(DataConstraintModel.add, List.of(new Variable("n"), new Constant("1"))), LinearRightNormalizedType.LINEAR_RIGHT_NORMALIZED), - new MetaEvaluatableTermVariable(new Variable("t'"), new Term(DataConstraintModel.add, List.of(new Variable("n"), new Constant("1"))), LinearRightNormalizedType.LINEAR_RIGHT_NORMALIZED), - new Term(DataConstraintModel.add, List.of(new Variable("n"), new Constant("1"))) - ); - - private static MetaSemanticEquivalenceRelation rule4_2 = new MetaSemanticEquivalenceRelation( - new MetaRDLTerm( - new MetaEvaluatableTermVariable(new Variable("t"), new Term(DataConstraintModel.add, List.of(new Variable("n"), new Constant("1")))), - new MetaResource(new Variable("v"), new Term(DataConstraintModel.add, List.of(new Variable("n"), new Constant("1")))), - new MetaEvaluatableTermVariable(new Variable("s"), OrderConstraint.LT, new Term(DataConstraintModel.add, List.of(new Variable("n"), new Constant("1")))) - ), - new MetaRDLTerm( - new MetaEvaluatableTermVariable(new Variable("t'"), new Term(DataConstraintModel.add, List.of(new Variable("n"), new Constant("1")))), - new MetaResource(new Variable("v"), new Term(DataConstraintModel.add, List.of(new Variable("n"), new Constant("1")))), - new MetaEvaluatableTermVariable(new Variable("s"), OrderConstraint.LT, new Term(DataConstraintModel.add, List.of(new Variable("n"), new Constant("1")))) - ), - new Variable("n") - ); - - public SemanticEquivalenceProofSystem(Collection assumptions, EquationFormula conclusion) { - this.assumptions = new HashMap<>(); - for(SemanticEquivalenceRelation assumption : assumptions) { - maxOrder = Math.max(maxOrder, assumption.getOrder()); - if (! this.assumptions.containsKey(assumption.getOrder())) { - this.assumptions.put(assumption.getOrder(), new HashSet<>()); - } - this.assumptions.get(assumption.getOrder()).add(assumption.linearRightNormalized()); - this.conclusion = conclusion; - } - } - - public boolean proof() { - Set existTerms = new HashSet<>(); - EquationFormula linearRightNormalizedConclusion = conclusion.linearRightNormalized(); - existTerms.addAll(linearRightNormalizedConclusion.getLeftSideHand().getSubTerms(EvaluatableTerm.class).values()); - existTerms.addAll(linearRightNormalizedConclusion.getRightSideHand().getSubTerms(EvaluatableTerm.class).values()); - SemanticEquivalenceRelation conclusionRelation = new SemanticEquivalenceRelation(conclusion.getLeftSideHand(), conclusion.getRightSideHand(), conclusion.getLeftSideHand().getOrder()); - SemanticEquivalenceRelation linearConclusionRelation = new SemanticEquivalenceRelation(linearRightNormalizedConclusion.getLeftSideHand(), linearRightNormalizedConclusion.getRightSideHand(), linearRightNormalizedConclusion.getLeftSideHand().getOrder()); - if (! linearRightNormalizedConclusion.equals(conclusion)) { - proofGraph.put(conclusionRelation, linearConclusionRelation); - } - for(int key : assumptions.keySet()) { - for(SemanticEquivalenceRelation relation : assumptions.get(key)) { - existTerms.addAll(relation.getLeftSideHand().getSubTerms(EvaluatableTerm.class).values()); - existTerms.add(relation.getLeftSideHand()); - existTerms.addAll(relation.getRightSideHand().getSubTerms(EvaluatableTerm.class).values()); - existTerms.add(relation.getRightSideHand()); - } - } - - - for (int i = maxOrder; i > linearRightNormalizedConclusion.getLeftSideHand().getOrder(); i--) { - Set apperTerms = new HashSet<>(); - for (SemanticEquivalenceRelation relation : assumptions.get(i)) { - apperTerms.addAll(applyRule4(relation, existTerms)); - } - existTerms.addAll(apperTerms); - } - - - List proofResult = new ArrayList<>(); - SemanticEquivalenceRelation currentRelation = conclusionRelation; - while(proofGraph.containsKey(currentRelation)) { - proofResult.add(currentRelation); - currentRelation = proofGraph.get(currentRelation); - } - proofResult.add(currentRelation); - Collections.reverse(proofResult); - for (int i = 0; i < proofResult.size(); i++) { - SemanticEquivalenceRelation relation = proofResult.get(i); - System.out.println(relation); - if (i < proofResult.size() - 1) System.out.println("=============================================================="); - } - return assumptions.get(0).contains(linearConclusionRelation); - } - - private void applyRule1() { - - } - - public static void debug() { - System.out.println(rule4_1); - System.out.println(rule4_2); - } - - private Set applyRule4(SemanticEquivalenceRelation relation, Set existTerms) { - Map binding = new HashMap<>(); - Map orderConstraint = new HashMap<>(); - Set appearTerms = new HashSet<>(); - if (rule4_1.isMatchedBy(relation, binding, orderConstraint)) { - Set results = rule4_2.substitute(binding, orderConstraint, existTerms); - for (SemanticEquivalenceRelation result : results) { - if (! assumptions.containsKey(result.getOrder())) { - assumptions.put(result.getOrder(), new HashSet<>()); - } - proofGraph.put(result, relation); - SemanticEquivalenceRelation linear = result.linearRightNormalized(); - assumptions.get(linear.getOrder()).add(linear); - if (!linear.equals(result)) { - proofGraph.put(linear, result); - } - appearTerms.addAll(linear.getLeftSideHand().getSubTerms(EvaluatableTerm.class).values()); - appearTerms.add(linear.getLeftSideHand()); - appearTerms.addAll(linear.getRightSideHand().getSubTerms(EvaluatableTerm.class).values()); - appearTerms.add(linear.getRightSideHand()); - } - } - return appearTerms; - } -} diff --git a/src/inference/equivalence/SemanticEquivalenceRelation.java b/src/inference/equivalence/SemanticEquivalenceRelation.java deleted file mode 100644 index 3dcc5d0..0000000 --- a/src/inference/equivalence/SemanticEquivalenceRelation.java +++ /dev/null @@ -1,49 +0,0 @@ -package inference.equivalence; - -import lombok.Getter; -import models.formulas.EquationFormula; -import models.terms.EvaluatableTerm; - -@Getter -public class SemanticEquivalenceRelation { - - private EvaluatableTerm leftSideHand; - private EvaluatableTerm rightSideHand; - private int order; - - public SemanticEquivalenceRelation(EvaluatableTerm lsh, EvaluatableTerm rsh, int order) { - leftSideHand = lsh; - rightSideHand = rsh; - this.order = order; - } - - public SemanticEquivalenceRelation(EquationFormula formula, int order) { - leftSideHand = formula.getLeftSideHand(); - rightSideHand = formula.getRightSideHand(); - this.order = order; - } - - public SemanticEquivalenceRelation linearRightNormalized() { - return new SemanticEquivalenceRelation(leftSideHand.linearRightNormalize(), rightSideHand.linearRightNormalize(), order); - } - - - @Override - public String toString() { - return leftSideHand.toString() + " =(" + order + ")= " + rightSideHand.toString(); - } - - @Override - public boolean equals(Object another) { - if (! (another instanceof SemanticEquivalenceRelation)) { - return false; - } - SemanticEquivalenceRelation relation = (SemanticEquivalenceRelation) another; - return leftSideHand.equals(relation.getLeftSideHand()) && rightSideHand.equals(relation.getRightSideHand()); - } - - @Override - public int hashCode() { - return toString().hashCode(); - } -} diff --git a/src/inference/rewrite/RewriteInferenceSystem.java b/src/inference/rewrite/RewriteInferenceSystem.java deleted file mode 100644 index 303ea2e..0000000 --- a/src/inference/rewrite/RewriteInferenceSystem.java +++ /dev/null @@ -1,127 +0,0 @@ -package inference.rewrite; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import models.formulas.EquationFormula; -import models.formulas.Formula; -import models.formulas.Then; -import models.terms.DependencyTerm; -import models.terms.EvaluatableTerm; -import models.terms.PrimedTerm; -import models.terms.Resource; - -public class RewriteInferenceSystem { - - List constraintFormulas = new ArrayList<>(); - List invariantFormulas = new ArrayList<>(); - EquationFormula inputFormula; - List conditionalFormulas = new ArrayList<>(); - List otherFormulas = new ArrayList<>(); - Formula conclusion; - - public RewriteInferenceSystem(List assumptions, Formula conclusion) { - for (Formula assumption : assumptions) { - if (inputFormulaCheck(assumption)) { - inputFormula = (EquationFormula) assumption; - } else if(invariantFormulaCheck(assumption)) { - invariantFormulas.add(assumption); - } else if (assumption instanceof EquationFormula) { - constraintFormulas.add(assumption); - } else { - otherFormulas.add(assumption); - } - } - - if (conclusion instanceof Then then) { - conditionalFormulas.add(then.getCondition()); - this.conclusion = then.getResult(); - } else { - this.conclusion = conclusion; - } - - } - - public void debug() { - System.out.println("constraintFormulas: " + constraintFormulas.toString()); - System.out.println("invariantFormulas: " + invariantFormulas.toString()); - System.out.println("inputFormula: " + inputFormula.toString()); - System.out.println("conditionalFormulas: " + conditionalFormulas.toString()); - System.out.println("conclusion: " + conclusion.toString()); - } - - public boolean inference() { - Map> resourceTree = new HashMap<>(); - Resource root = parseDependencyTerm(inputFormula.getLeftSideHand(), resourceTree, new ArrayList<>()); - System.out.println(resourceTree); - return false; - } - - private Resource parseDependencyTerm(EvaluatableTerm term, Map> resourceTree, List tops) { - if (term instanceof Resource resource) { - if (tops.isEmpty()) { - resourceTree.put(resource, new ArrayList<>()); - tops.add(resource); - } else { - for (Resource top : tops) { - resourceTree.get(top).add(resource); - resourceTree.put(resource, new ArrayList<>()); - } - tops.clear(); - tops.add(resource); - } - return resource; - } - Resource root; - DependencyTerm depTerm = (DependencyTerm) term; - EvaluatableTerm dependingTerm = depTerm.getDependingTerm(); - List dependedTerms = depTerm.getDependedResources(); - List argumentTerms = depTerm.getArgumentTerms(); - root = parseDependencyTerm(dependingTerm, resourceTree, tops); - List nextTops = new ArrayList<>(); - for (int i = 0; i < dependedTerms.size(); i++) { - List currentTops = new ArrayList<>(tops); - parseDependencyTerm(dependedTerms.get(i), resourceTree, currentTops); - parseDependencyTerm(argumentTerms.get(i), resourceTree, currentTops); - nextTops.addAll(currentTops); - } - tops.clear(); - tops.addAll(nextTops); - return root; - } - - - private boolean inputFormulaCheck(Formula formula) { - if (! (formula instanceof EquationFormula equation)) { - return false; - } - List resources = new ArrayList<>(equation.getLeftSideHand().getSubTerms(Resource.class).values()); - resources.addAll(equation.getRightSideHand().getSubTerms(Resource.class).values()); - for (Resource resource : resources) { - if (resource.getOrder() == 0) { - return true; - } - } - return false; - } - - private boolean invariantFormulaCheck(Formula formula) { - if (! (formula instanceof EquationFormula equation)) { - return false; - } - EvaluatableTerm leftSideHand = equation.getLeftSideHand(); - EvaluatableTerm rightSideHand = equation.getRightSideHand(); - - if (leftSideHand instanceof PrimedTerm) { - return ((PrimedTerm) leftSideHand).getPrimedTerm().equals(rightSideHand); - } else if (rightSideHand instanceof PrimedTerm) { - return ((PrimedTerm) rightSideHand).getPrimedTerm().equals(leftSideHand); - } - - return false; - } - - -} diff --git a/src/main/java/Main.java b/src/main/java/Main.java new file mode 100644 index 0000000..12d7b28 --- /dev/null +++ b/src/main/java/Main.java @@ -0,0 +1,188 @@ +import java.util.List; + +import inference.ProofSystem; +import inference.rewrite.RewriteInferenceSystem; +import lombok.SneakyThrows; +import models.algebra.Expression; +import models.algebra.Type; +import models.dataConstraintModel.DataConstraintModel; +import models.dataFlowModel.DataTransferModel; +import models.formulas.DependencyFormula; +import models.formulas.EquationFormula; +import models.formulas.InFormula; +import models.terms.Dependency; +import models.terms.DependencyTerm; +import models.terms.Resource; +import models.terms.ResourceConstant; +import models.terms.SetEvaluatableTerm; +import parser.Parser; +import parser.Parser.TokenStream; + +public class Main { + + static TokenStream stream = new Parser.TokenStream(); + static Parser parser = new Parser(stream); + static DataTransferModel model = new DataTransferModel(); + + static Type INT = DataConstraintModel.typeInt; + + public static void main(String[] args) { +// sandbox1(); +// sandbox2(); +// sandbox3(); +// sandbox4(); +// ProofSystem.debug(); + sandbox6(); + } + +// static void sandbox1() { +// Resource A = new Resource("A", INT, 2); +// Resource Ap = new Resource("A'", INT, 2); +// Resource B = new Resource("B", INT, 2); +// Resource Bp = new Resource("B'", Utils.INT, 2); +// Resource C = new Resource("C", Utils.INT, 2); +// Resource Cp = new Resource("C'", Utils.INT, 2); +// Resource D = new Resource("D", Utils.INT, 2); +// Resource E = new Resource("E", Utils.INT, 1); +// Resource F = new Resource("F", Utils.INT, 1); +// Resource G = new Resource("G", Utils.INT, 0); +// DependencyTerm t1 = new DependencyTerm(A, B, C); +// DependencyTerm t2 = new DependencyTerm(Ap, Bp, Cp); +// EquationFormula assumptionFormula = new EquationFormula(t1, t2); +// EquationFormula conclusionFormula = new EquationFormula( +// new DependencyTerm(new DependencyTerm(new DependencyTerm(A, B, C), D, E), F, G), +// new DependencyTerm(new DependencyTerm(new DependencyTerm(Ap, Bp, Cp), D, E), F, G) +// ); +// +// SemanticEquivalenceProofSystem proofSystem = new SemanticEquivalenceProofSystem( +// List.of(new SemanticEquivalenceRelation(assumptionFormula, 2)), +// conclusionFormula +// ); +// SemanticEquivalenceProofSystem.debug(); +// System.out.println(); +// System.out.println(assumptionFormula); +// System.out.println(conclusionFormula); +//// System.out.println(conclusionFormula.linearRightNormalized()); +// System.out.println(proofSystem.proof()); +// } + + static void sandbox2() { + ProofSystem.debug(); + } + + static void sandbox3() { + Resource followee = new Resource("followee", INT, 2); + Resource fno = new Resource("fno", INT, 2); + ResourceConstant one = new ResourceConstant("1"); + ResourceConstant A = new ResourceConstant("A"); + ResourceConstant C = new ResourceConstant("C"); + Resource aid = new Resource("aid", INT, 1); + DependencyTerm t1 = new DependencyTerm(followee, fno, one); + Dependency d1 = new Dependency(t1, aid); + DependencyTerm t2 = new DependencyTerm(one, aid, A); + DependencyTerm t3 = new DependencyTerm(new SetEvaluatableTerm(fno), aid, A); + DependencyTerm t4 = new DependencyTerm(t1, aid, A); + + DependencyFormula f1 = new DependencyFormula(d1); + InFormula f2 = new InFormula(t2, t3); + EquationFormula f3 = new EquationFormula(t4, C); + DependencyFormula f4 = new DependencyFormula(new Dependency(new SetEvaluatableTerm(followee), aid)); + InFormula f5 = new InFormula(A, new SetEvaluatableTerm(aid)); + InFormula conclusion = new InFormula(C, new SetEvaluatableTerm(new SetEvaluatableTerm(followee))); + + System.out.println(f1); + System.out.println(f2); + System.out.println(f3); + System.out.println(conclusion); + System.out.println(); + boolean result = ProofSystem.check(List.of(f1, f2, f3, f4, f5), conclusion); + System.out.println(); + System.out.println(result); + } + + static void sandbox4() { + Resource X = new Resource("X", INT, 1); + Resource Y= new Resource("Y", INT, 1); + Resource U = new Resource("U", INT, 1); + Resource W = new Resource("W", INT, 1); + + EquationFormula f1 = new EquationFormula(X, Y); + DependencyFormula f2 = new DependencyFormula(X, U); + DependencyFormula f3 = new DependencyFormula(U, W); + DependencyTerm t1 = new DependencyTerm(X, U, U); + DependencyTerm t2 = new DependencyTerm(t1, W, W); + DependencyTerm t3 = new DependencyTerm(Y, U, U); + DependencyTerm t4 = new DependencyTerm(t3, W, W); +// EquationFormula f4 = new EquationFormula(t1, X); +// EquationFormula f4 = new EquationFormula(X, t1); +// EquationFormula f4 = new EquationFormula(t2, X); +// EquationFormula f4 = new EquationFormula(t3, Y); +// EquationFormula f4 = new EquationFormula(t4, Y); + EquationFormula f4 = new EquationFormula(t2, t4); +// DependencyFormula f4 = new DependencyFormula(Y, U); + System.out.println(f1 + ", " + f2 + ", " + f3); + boolean result = ProofSystem.check(List.of(f1, f2, f3), f4); + System.out.println(result); + } + + static void sandbox5() { + Resource a = new Resource("a", INT, 1); + Resource b = new Resource("b", INT, 1); + Resource c = new Resource("c", INT, 1); + Resource d = new Resource("d", INT, 1); + Resource e = new Resource("e", INT, 1); + Resource f = new Resource("f", INT, 1); + Resource x = new Resource("x", INT, 0); + Resource y = new Resource("y", INT, 0); + DependencyTerm t1 = new DependencyTerm(a, b, c, d, e); + DependencyTerm t2 = new DependencyTerm(t1, f, x); + EquationFormula fm = new EquationFormula(t2, y); + System.out.println(t1); + System.out.println(t2); + System.out.println(fm); + RewriteInferenceSystem tmp = new RewriteInferenceSystem(List.of(fm), null); + tmp.debug(); + tmp.inference(); + } + + static void sandbox6() { + Resource uid = new Resource("uid", INT, 1); + Resource org = new Resource("org", INT, 1); + Resource uadd = new Resource("uadd", INT, 1); + Resource cid = new Resource("cid", INT, 1); + Resource add = new Resource("add", INT, 1); + Resource addP = new Resource("add'", INT, 1); + Resource cidP = new Resource("cid'", INT, 1); + Resource orgP = new Resource("org'", INT, 1); + Resource uidP = new Resource("uid'", INT, 1); + Resource uaddP = new Resource("uadd'", INT, 1); + Resource x = new Resource("x", INT, 0); + Resource y = new Resource("y", INT, 0); + Resource z = new Resource("z", INT, 0); + + DependencyTerm t1 = new DependencyTerm(add, cid, org); + DependencyTerm t2 = new DependencyTerm(addP, cidP, orgP); + DependencyTerm t3 = new DependencyTerm(orgP, uidP, x); + DependencyTerm t4 = new DependencyTerm(add, cid, y); + DependencyTerm t5 = new DependencyTerm(uaddP, uidP, x); + + EquationFormula f1 = new EquationFormula(uadd, t1); + EquationFormula f2 = new EquationFormula(uaddP, t2); + EquationFormula f3 = new EquationFormula(t3, y); + EquationFormula f4 = new EquationFormula(t4, t5); + + RewriteInferenceSystem tmp = new RewriteInferenceSystem(List.of(f1, f2, f3), f4); + tmp.debug(); + tmp.inference(); + + } + + + @SneakyThrows + static Expression parse(String expr) { + stream.addLine(expr); + return parser.parseTerm(stream, model); + } + + +} diff --git a/src/main/java/exceptions/CoefficientNotOneException.java b/src/main/java/exceptions/CoefficientNotOneException.java new file mode 100644 index 0000000..ddef07c --- /dev/null +++ b/src/main/java/exceptions/CoefficientNotOneException.java @@ -0,0 +1,13 @@ +package exceptions; + +public class CoefficientNotOneException extends RuntimeException { + + public CoefficientNotOneException(String msg) { + super(msg); + } + + public CoefficientNotOneException() { + super("Coefficient is not 1."); + } + +} diff --git a/src/main/java/exceptions/IllegalTypeException.java b/src/main/java/exceptions/IllegalTypeException.java new file mode 100644 index 0000000..ea73b66 --- /dev/null +++ b/src/main/java/exceptions/IllegalTypeException.java @@ -0,0 +1,13 @@ +package exceptions; + +public class IllegalTypeException extends RuntimeException { + + public IllegalTypeException() { + super("Term type is illegal"); + } + + public IllegalTypeException(String msg) { + super(msg); + } + +} diff --git a/src/main/java/exceptions/NonLinearExpressionException.java b/src/main/java/exceptions/NonLinearExpressionException.java new file mode 100644 index 0000000..fc56963 --- /dev/null +++ b/src/main/java/exceptions/NonLinearExpressionException.java @@ -0,0 +1,13 @@ +package exceptions; + +public class NonLinearExpressionException extends RuntimeException { + + public NonLinearExpressionException() { + super("This Expression is not linear"); + } + + public NonLinearExpressionException(String msg) { + super(msg); + } + +} diff --git a/src/main/java/exceptions/SubstituteFailedException.java b/src/main/java/exceptions/SubstituteFailedException.java new file mode 100644 index 0000000..de4a0e2 --- /dev/null +++ b/src/main/java/exceptions/SubstituteFailedException.java @@ -0,0 +1,13 @@ +package exceptions; + +public class SubstituteFailedException extends RuntimeException { + + public SubstituteFailedException(String msg) { + super(msg); + } + + public SubstituteFailedException() { + super("substitute failed"); + } + +} diff --git a/src/main/java/exceptions/TooManyVariablesException.java b/src/main/java/exceptions/TooManyVariablesException.java new file mode 100644 index 0000000..407ca30 --- /dev/null +++ b/src/main/java/exceptions/TooManyVariablesException.java @@ -0,0 +1,13 @@ +package exceptions; + +public class TooManyVariablesException extends RuntimeException { + + public TooManyVariablesException(String msg) { + super(msg); + } + + public TooManyVariablesException() { + super("Too many variables"); + } + +} diff --git a/src/main/java/inference/InferenceOrderConstraint.java b/src/main/java/inference/InferenceOrderConstraint.java new file mode 100644 index 0000000..e74b9dc --- /dev/null +++ b/src/main/java/inference/InferenceOrderConstraint.java @@ -0,0 +1,105 @@ +package inference; +import java.util.Map; + +import exceptions.IllegalTypeException; +import lombok.Getter; +import models.algebra.Constant; +import models.algebra.Expression; +import models.algebra.Variable; +import models.terms.meta.OrderConstraint; +import models.terms.meta.OrderVariableConstraint; + +@Getter +public class InferenceOrderConstraint { + + private final Variable leftSideHandVariable; + private final int leftSideHandConstant; + private final OrderConstraint operator; + private final Variable rightSideHandVariable; + private final int rightSideHandConstant; + + public InferenceOrderConstraint(Expression left, OrderConstraint operator, Expression right) { + if ((left instanceof Constant) && (right instanceof Constant)) { + throw new IllegalTypeException("Both left and right can't be Constant"); + } + if (left instanceof Constant) { + leftSideHandConstant = Integer.parseInt(((Constant) left).toString()); + leftSideHandVariable = null; + } else if (left instanceof Variable) { + leftSideHandConstant = -1; + leftSideHandVariable = (Variable) left; + } else { + throw new IllegalTypeException("Left must be Constant or Variable"); + } + + this.operator = operator; + + if (right instanceof Constant) { + rightSideHandConstant = Integer.parseInt(((Constant) right).toString()); + rightSideHandVariable = null; + } else if (right instanceof Variable) { + rightSideHandConstant = -1; + rightSideHandVariable = (Variable) right; + } else { + throw new IllegalTypeException("Right must be Constant or Variable"); + } + } + + public boolean check(Map orderConstraints) { + switch(this.operator) { + case EQ: + return getLeftValue(orderConstraints) == getRightValue(orderConstraints); + case GE: + return getLeftValue(orderConstraints) >= getRightValue(orderConstraints); + case GT: + return getLeftValue(orderConstraints) > getRightValue(orderConstraints); + case LE: + return getLeftValue(orderConstraints) <= getRightValue(orderConstraints); + case LT: + return getLeftValue(orderConstraints) < getRightValue(orderConstraints); + default: + return false; + } + } + + private int getLeftValue(Map orderConstraints) { + if (this.leftSideHandVariable != null) { + OrderVariableConstraint constraint = orderConstraints.get(this.leftSideHandVariable); + return constraint.getLower(); + } else { + return this.leftSideHandConstant; + } + } + + private int getRightValue(Map orderConstraints) { + if (this.rightSideHandVariable != null) { + OrderVariableConstraint constraint = orderConstraints.get(this.rightSideHandVariable); + return constraint.getLower(); + } else { + return this.rightSideHandConstant; + } + } + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + if (this.leftSideHandVariable != null) { + sb.append(this.leftSideHandVariable.toString()); + } else { + sb.append(this.leftSideHandConstant); + } + sb.append(" "); + sb.append(operator.getOperator()); + sb.append(" "); + if (this.rightSideHandVariable != null) { + sb.append(this.rightSideHandVariable.toString()); + } else { + sb.append(this.rightSideHandConstant); + } + + return sb.toString(); + + } + +} diff --git a/src/main/java/inference/InferenceRule.java b/src/main/java/inference/InferenceRule.java new file mode 100644 index 0000000..1a3243b --- /dev/null +++ b/src/main/java/inference/InferenceRule.java @@ -0,0 +1,247 @@ +package inference; + +import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import exceptions.SubstituteFailedException; +import lombok.Getter; +import models.algebra.Variable; +import models.formulas.Formula; +import models.formulas.meta.MetaDependencyFormula; +import models.formulas.meta.MetaEquationFormula; +import models.formulas.meta.MetaFormula; +import models.terms.RDLTerm; +import models.terms.meta.OrderVariableConstraint; +import utils.Permutation; + +public class InferenceRule { + + @Getter + private final String name; + + @Getter + private final List assumptions; + @Getter + private final MetaFormula conclusion; + private final InferenceOrderConstraint defaultOrderConstraint; + + public InferenceRule(String name, List assumptions, MetaFormula conclusion, InferenceOrderConstraint constraint) { + this.name = name; + this.assumptions = assumptions; + this.conclusion = conclusion; + this.defaultOrderConstraint = constraint; + } + + public InferenceRule( List assumptions, MetaFormula conclusion, InferenceOrderConstraint constraint) { + this.name = "undefined"; + this.assumptions = assumptions; + this.conclusion = conclusion; + this.defaultOrderConstraint = constraint; + } + + public InferenceRule(String name, List assumptions, MetaFormula conclusion) { + this.assumptions = assumptions; + this.conclusion = conclusion; + this.name = name; + this.defaultOrderConstraint = null; + } + + public InferenceRule(List assumptions, MetaFormula conclusion) { + this.assumptions = assumptions; + this.conclusion = conclusion; + this.name = "undefined"; + this.defaultOrderConstraint = null; + } + + public boolean check(Collection assumptions, Formula conclusion) { + + if (this.assumptions.size() > assumptions.size()) { + return false; + } + + Map binding = new HashMap<>(); + Map orderConstraints = new HashMap<>(); + this.conclusion.isMatchedBy(conclusion, binding, orderConstraints); + Set givenAssumptions = new HashSet<>(assumptions); + + for (MetaFormula assumption : this.assumptions) { + boolean flg = false; + for (Formula given : givenAssumptions) { + Map tmpBinding = new HashMap<>(binding); + Map tmpOrderConstraints = new HashMap<>(orderConstraints); + if (assumption.isMatchedBy(given, tmpBinding, tmpOrderConstraints)) { + binding.putAll(tmpBinding); + orderConstraints.putAll(tmpOrderConstraints); + flg = true; + givenAssumptions.remove(given); + break; + } + } + if (!flg) { + return false; + } + } + + if (this.defaultOrderConstraint != null) { + return defaultOrderConstraint.check(orderConstraints); + } + + return true; + +// for(List assumption : permutation(assumptions, this.assumptions.size())) { +// if (check(assumption, conclusion)) { +// return true; +// } +// } +// return false; + } + + private boolean check(List assumptions, Formula conclusion) { + Map binding = new HashMap<>(); + Map orderConstraints = new HashMap<>(); + for (int i = 0; i < assumptions.size(); i++) { + if (! this.assumptions.get(i).isMatchedBy(assumptions.get(i), binding, orderConstraints)) { + return false; + } + } + if (! this.conclusion.isMatchedBy(conclusion, binding, orderConstraints)) { + return false; + } + if (this.defaultOrderConstraint != null) { + return defaultOrderConstraint.check(orderConstraints); + } + return true; + } + + + public Formula apply(List assumptions) { + if (assumptions.size() != getAssumptionSize()) { + return null; + } + Map binding = new HashMap<>(); + Map orderConstraint = new HashMap<>(); + for (int i = 0; i < getAssumptionSize(); i++) { + if (! this.assumptions.get(i).isMatchedBy(assumptions.get(i), binding, orderConstraint)) { + return null; + } + } + return conclusion.substitution(binding); + } + + public Set apply(List assumptions, Set existTerms) { + Set result = new HashSet<>(); + if (assumptions.size() != getAssumptionSize()) { + return null; + } + Map binding = new HashMap<>(); + Map orderConstraint = new HashMap<>(); + for (int i = 0; i < getAssumptionSize(); i++) { + if (! this.assumptions.get(i).isMatchedBy(assumptions.get(i), binding, orderConstraint)) { + return result; + } + } + try { + result.add(conclusion.substitution(binding)); + } catch (SubstituteFailedException e) { + + } + for (RDLTerm term : existTerms) { + Map localBinding = new HashMap<>(binding); + Map localOrderConstraint = new HashMap<>(orderConstraint); + if (conclusion instanceof MetaEquationFormula) { + MetaEquationFormula equation = (MetaEquationFormula) conclusion; + if (equation.getLeftSideHand().isMatchedBy(term, localBinding, localOrderConstraint)) { + result.add(conclusion.substitution(localBinding)); + } + } + else if (conclusion instanceof MetaDependencyFormula) { + MetaDependencyFormula dependency = (MetaDependencyFormula) conclusion; + if (dependency.getDependency().isMatchedBy(term, localBinding, localOrderConstraint)) { + result.add(conclusion.substitution(localBinding)); + } + } + } + + for (RDLTerm term : existTerms) { + Map localBinding = new HashMap<>(binding); + Map localOrderConstraint = new HashMap<>(orderConstraint); + if (conclusion instanceof MetaEquationFormula) { + MetaEquationFormula equation = (MetaEquationFormula) conclusion; + if (equation.getRightSideHand().isMatchedBy(term, localBinding, localOrderConstraint)) { + result.add(conclusion.substitution(localBinding)); + } + } + } + return result; + } + + public Formula apply(Collection assumptions) { + if (assumptions.size() != getAssumptionSize()) { + return null; + } + for (List assumptionList : Permutation.permutation(assumptions, assumptions.size())) { + boolean matchFailed = false; + for (int i = 0; i < getAssumptionSize(); i++) { + if (! this.assumptions.get(i).isMatchedBy(assumptionList.get(i))) { + matchFailed = true; + break; + } + } + if (matchFailed) { + continue; + } else { + return apply(assumptionList); + } + } + return null; + } + + + public int getAssumptionSize() { + return this.assumptions.size(); + } + + + public String toString() { + StringBuilder sb = new StringBuilder(); + if (defaultOrderConstraint != null) { + sb.append(defaultOrderConstraint); + sb.append(", "); + } + for (int i = 0; i < assumptions.size(); i++) { + sb.append(assumptions.get(i).toString()); + if (i != assumptions.size() - 1) { + sb.append(", "); + } + } + String assumpStr = sb.toString(); + String concluStr = conclusion.toString(); + String line = "-".repeat(Math.max(assumpStr.length(), concluStr.length())) + " (" + this.name + ")"; + sb = new StringBuilder(); + sb.append(assumpStr); + sb.append("\n"); + sb.append(line); + sb.append("\n"); + sb.append(concluStr); + return sb.toString(); + } + + @Override + public boolean equals(Object another) { + if (! (another instanceof InferenceRule)) { + return false; + } + InferenceRule anotherRule = (InferenceRule) another; + return getName().equals(anotherRule.getName()); + } + + @Override + public int hashCode() { + return getName().hashCode(); + } + +} diff --git a/src/main/java/inference/ProofSystem.java b/src/main/java/inference/ProofSystem.java new file mode 100644 index 0000000..8d1b7be --- /dev/null +++ b/src/main/java/inference/ProofSystem.java @@ -0,0 +1,783 @@ +package inference; + +import java.util.ArrayDeque; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Deque; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Queue; +import java.util.Set; +import java.util.stream.Collectors; + +import models.algebra.Constant; +import models.algebra.Variable; +import models.formulas.DependencyFormula; +import models.formulas.EquationFormula; +import models.formulas.Formula; +import models.formulas.InFormula; +import models.formulas.meta.MetaDependencyFormula; +import models.formulas.meta.MetaEquationFormula; +import models.formulas.meta.MetaInFormula; +import models.terms.EvaluatableTerm; +import models.terms.RDLTerm; +import models.terms.meta.MetaEvaluatableTermVariable; +import models.terms.meta.MetaRDLTerm; +import models.terms.meta.MetaResource; +import models.terms.meta.OrderConstraint; +import utils.Product; + +public class ProofSystem { + + //======================Equality Axioms============================= + + private static final InferenceRule reflexivity = new InferenceRule( + "Reflexivity", + List.of(), + new MetaEquationFormula( + new MetaEvaluatableTermVariable(new Variable("te")), + new MetaEvaluatableTermVariable(new Variable("te")) + ) + ); + + private static final InferenceRule symmetry = new InferenceRule( + "Symmetry", + List.of( + new MetaEquationFormula( + new MetaEvaluatableTermVariable(new Variable("te")), + new MetaEvaluatableTermVariable(new Variable("se")) + ) + ), + new MetaEquationFormula( + new MetaEvaluatableTermVariable(new Variable("se")), + new MetaEvaluatableTermVariable(new Variable("te")) + ) + ); + + private static final InferenceRule transitivity = new InferenceRule( + "Transitivity", + List.of( + new MetaEquationFormula( + new MetaEvaluatableTermVariable(new Variable("se")), + new MetaEvaluatableTermVariable(new Variable("te")) + ), + new MetaEquationFormula( + new MetaEvaluatableTermVariable(new Variable("te")), + new MetaEvaluatableTermVariable(new Variable("ue")) + ) + ), + new MetaEquationFormula( + new MetaEvaluatableTermVariable(new Variable("se")), + new MetaEvaluatableTermVariable(new Variable("ue")) + ) + ); + + private static final InferenceRule rightSubstitution = new InferenceRule( + "Right Substitution", + List.of( + new MetaEquationFormula( + new MetaEvaluatableTermVariable(new Variable("te")), + new MetaEvaluatableTermVariable(new Variable("ue")) + ), + new MetaDependencyFormula( + new MetaEvaluatableTermVariable(new Variable("se")), + new MetaResource(new Variable("r")) + ), + new MetaInFormula( + new MetaEvaluatableTermVariable(new Variable("te")), + new MetaRDLTerm(new MetaResource(new Variable("r"))) + ) + ), + new MetaEquationFormula( + new MetaRDLTerm( + new MetaEvaluatableTermVariable(new Variable("se")), + new MetaResource(new Variable("r")), + new MetaEvaluatableTermVariable(new Variable("te")) + ), + new MetaRDLTerm( + new MetaEvaluatableTermVariable(new Variable("se")), + new MetaResource(new Variable("r")), + new MetaEvaluatableTermVariable(new Variable("ue")) + ) + ) + ); + + private static final InferenceRule leftSubstitution = new InferenceRule( + "Left Substitution", + List.of( + new MetaEquationFormula( + new MetaEvaluatableTermVariable(new Variable("se")), + new MetaEvaluatableTermVariable(new Variable("te")) + ), + new MetaDependencyFormula( + new MetaEvaluatableTermVariable(new Variable("se")), + new MetaResource(new Variable("r")) + ), + new MetaInFormula( + new MetaEvaluatableTermVariable(new Variable("ue")), + new MetaRDLTerm(new MetaResource(new Variable("r"))) + ) + ), + new MetaEquationFormula( + new MetaRDLTerm( + new MetaEvaluatableTermVariable(new Variable("se")), + new MetaResource(new Variable("r")), + new MetaEvaluatableTermVariable(new Variable("ue")) + ), + new MetaRDLTerm( + new MetaEvaluatableTermVariable(new Variable("te")), + new MetaResource(new Variable("r")), + new MetaEvaluatableTermVariable(new Variable("ue")) + ) + ) + ); + + private static final InferenceRule identity = new InferenceRule( + "Identity", + List.of( + new MetaInFormula( + new MetaEvaluatableTermVariable(new Variable("te")), + new MetaRDLTerm(new MetaResource(new Variable("r"))) + ) + ), + new MetaEquationFormula( + new MetaRDLTerm( + new MetaResource(new Variable("r")), + new MetaResource(new Variable("r")), + new MetaEvaluatableTermVariable(new Variable("te")) + ), + new MetaEvaluatableTermVariable(new Variable("te")) + ) + ); + + private static final InferenceRule mapComposition = new InferenceRule( + "Map Composition", + List.of( + new MetaDependencyFormula( + new MetaEvaluatableTermVariable(new Variable("se")), + new MetaResource(new Variable("r")) + ), + new MetaDependencyFormula( + new MetaResource(new Variable("r")), + new MetaResource(new Variable("p")) + ), + new MetaInFormula( + new MetaEvaluatableTermVariable(new Variable("te")), + new MetaRDLTerm(new MetaResource(new Variable("p"))) + ) + ), + new MetaEquationFormula( + new MetaRDLTerm( + new MetaEvaluatableTermVariable(new Variable("se")), + new MetaResource(new Variable("r")), + new MetaRDLTerm( + new MetaResource(new Variable("r")), + new MetaResource(new Variable("p")), + new MetaEvaluatableTermVariable(new Variable("te")) + ) + ), + new MetaRDLTerm( + new MetaEvaluatableTermVariable(new Variable("se")), + new MetaResource(new Variable("p")), + new MetaEvaluatableTermVariable(new Variable("te")) + ) + ) + ); + + private static final InferenceRule constantness = new InferenceRule( + "Constantness", + List.of( + new MetaInFormula( + new MetaEvaluatableTermVariable(new Variable("t1")), + new MetaRDLTerm(new MetaResource(new Variable("r1"), new Variable("m"))) + ) + ), + new MetaEquationFormula( + new MetaRDLTerm( + new MetaEvaluatableTermVariable(new Variable("se"), new Variable("n")), + new MetaResource(new Variable("r1"), new Variable("m")), + new MetaEvaluatableTermVariable(new Variable("t1")) + ), + new MetaEvaluatableTermVariable(new Variable("se"), new Variable("n")) + ), + new InferenceOrderConstraint(new Variable("n"), OrderConstraint.LT, new Variable("m")) + ); + + private static final InferenceRule rightNormalization = new InferenceRule( + "Right Normalization", + List.of( + new MetaDependencyFormula( + new MetaRDLTerm( + new MetaEvaluatableTermVariable(new Variable("te")), + new MetaResource(new Variable("r"), new Variable("n")) + ) + ), + new MetaDependencyFormula( + new MetaRDLTerm( + new MetaEvaluatableTermVariable(new Variable("se")), + new MetaResource(new Variable("q"), new Variable("n")) + ) + ) + ), + new MetaEquationFormula( + new MetaRDLTerm( + new MetaRDLTerm( + new MetaEvaluatableTermVariable(new Variable("te")), + new MetaResource(new Variable("r"), new Variable("n")), + new MetaEvaluatableTermVariable(new Variable("se")) + ), + new MetaResource(new Variable("q"), new Variable("n")), + new MetaEvaluatableTermVariable(new Variable("ue")) + ), + new MetaRDLTerm( + new MetaEvaluatableTermVariable(new Variable("te")), + new MetaResource(new Variable("r"), new Variable("n")), + new MetaRDLTerm( + new MetaEvaluatableTermVariable(new Variable("se")), + new MetaResource(new Variable("q"), new Variable("n")), + new MetaEvaluatableTermVariable(new Variable("ue")) + ) + ) + ), + new InferenceOrderConstraint(new Variable("n"), OrderConstraint.GT, new Constant("0")) + ); + + private static final InferenceRule pseudoConstantness = new InferenceRule( + "Pseudo-Constantness", + List.of( + new MetaDependencyFormula( + new MetaRDLTerm( + new MetaEvaluatableTermVariable(new Variable("te"), new Variable("n")), + new MetaResource(new Variable("r"), new Variable("n")) + ) + ) + ), + new MetaEquationFormula( + new MetaRDLTerm( + new MetaEvaluatableTermVariable(new Variable("te"), new Variable("n")), + new MetaResource(new Variable("r"), new Variable("n")), + new MetaResource(new Variable("r"), new Variable("n")) + ), + new MetaEvaluatableTermVariable(new Variable("te"), new Variable("n")) + ), + new InferenceOrderConstraint(new Variable("n"), OrderConstraint.GT, new Constant("0")) + ); + + //======================Dependency Axioms============================= + + private static final InferenceRule identityMapping = new InferenceRule( + "Identity Mapping", + List.of( + new MetaEquationFormula( + new MetaEvaluatableTermVariable(new Variable("te")), + new MetaResource(new Variable("r")) + ) + ), + new MetaDependencyFormula( + new MetaEvaluatableTermVariable(new Variable("te")), + new MetaResource(new Variable("r")) + ) + ); + + private static final InferenceRule compositeMapping = new InferenceRule( + "Composite Mapping", + List.of( + new MetaDependencyFormula( + new MetaEvaluatableTermVariable(new Variable("te")), + new MetaResource(new Variable("r")) + ), + new MetaDependencyFormula( + new MetaEvaluatableTermVariable(new Variable("r")), + new MetaResource(new Variable("q")) + ) + ), + new MetaDependencyFormula( + new MetaEvaluatableTermVariable(new Variable("te")), + new MetaResource(new Variable("q")) + ) + ); + + private static final InferenceRule constantMapping = new InferenceRule( + "Constant Mapping", + List.of(), + new MetaDependencyFormula( + new MetaEvaluatableTermVariable(new Variable("te"), new Variable("n")), + new MetaResource(new Variable("r"), new Variable("m")) + ), + new InferenceOrderConstraint(new Variable("n"), OrderConstraint.LT, new Variable("m")) + ); + + private static final InferenceRule slicedMapping = new InferenceRule( + "Sliced Mapping", + List.of( + new MetaDependencyFormula( + new MetaRDLTerm( + new MetaEvaluatableTermVariable(new Variable("se")), + new MetaResource(new Variable("r")) + ), + new MetaResource(new Variable("p")) + ), + new MetaDependencyFormula( + new MetaEvaluatableTermVariable(new Variable("te")), + new MetaResource(new Variable("p")) + ) + ), + new MetaDependencyFormula( + new MetaRDLTerm( + new MetaEvaluatableTermVariable(new Variable("se")), + new MetaResource(new Variable("r")), + new MetaEvaluatableTermVariable(new Variable("te")) + ), + new MetaResource(new Variable("p")) + ) + ); + + //======================Set-Theoretic Axioms============================= + + private static final InferenceRule memberSubstitution = new InferenceRule( + "Member Substitution", + List.of( + new MetaInFormula( + new MetaEvaluatableTermVariable(new Variable("se")), + new MetaEvaluatableTermVariable(new Variable("ue")) + ), + new MetaEquationFormula( + new MetaEvaluatableTermVariable(new Variable("se")), + new MetaEvaluatableTermVariable(new Variable("te")) + ) + ), + new MetaInFormula( + new MetaEvaluatableTermVariable(new Variable("te")), + new MetaEvaluatableTermVariable(new Variable("ue")) + ) + ); + + private static final InferenceRule membershipChain = new InferenceRule( + "Membership Chain", + List.of( + new MetaInFormula( + new MetaEvaluatableTermVariable(new Variable("se")), + new MetaEvaluatableTermVariable(new Variable("te")) + ), + new MetaInFormula( + new MetaEvaluatableTermVariable(new Variable("te")), + new MetaEvaluatableTermVariable(new Variable("ue")) + ) + ), + new MetaInFormula( + new MetaEvaluatableTermVariable(new Variable("se")), + new MetaEvaluatableTermVariable(new Variable("ue")) + ) + ); + + private static final InferenceRule collectionSubstitution = new InferenceRule( + "Collection Substitution", + List.of( + new MetaInFormula( + new MetaEvaluatableTermVariable(new Variable("se")), + new MetaEvaluatableTermVariable(new Variable("te")) + ), + new MetaEquationFormula( + new MetaEvaluatableTermVariable(new Variable("te")), + new MetaEvaluatableTermVariable(new Variable("ue")) + ) + ), + new MetaInFormula( + new MetaEvaluatableTermVariable(new Variable("se")), + new MetaEvaluatableTermVariable(new Variable("ue")) + ) + ); + + private static final InferenceRule setEquivelence = new InferenceRule( + "Set Equivelence", + List.of( + new MetaEquationFormula( + new MetaEvaluatableTermVariable(new Variable("se"), new Variable("n")), + new MetaEvaluatableTermVariable(new Variable("te"), new Variable("n")) + ) + ), + new MetaEquationFormula( + new MetaRDLTerm(new MetaEvaluatableTermVariable(new Variable("se"), new Variable("n"))), + new MetaRDLTerm(new MetaEvaluatableTermVariable(new Variable("te"), new Variable("n"))) + ), + new InferenceOrderConstraint(new Variable("n"), OrderConstraint.GT, new Constant("0")) + ); + + private static final InferenceRule setHomomorphism = new InferenceRule( + "Set Homomorphism", + List.of( + new MetaDependencyFormula( + new MetaEvaluatableTermVariable(new Variable("se")), + new MetaResource(new Variable("r")) + ) + ), + new MetaEquationFormula( + new MetaRDLTerm( + new MetaEvaluatableTermVariable(new Variable("se")), + new MetaResource(new Variable("r")), + new MetaRDLTerm(new MetaEvaluatableTermVariable(new Variable("te"))) + ), + new MetaRDLTerm( + new MetaRDLTerm( + new MetaEvaluatableTermVariable(new Variable("se")), + new MetaResource(new Variable("r")), + new MetaEvaluatableTermVariable(new Variable("te")) + ) + ) + ) + ); + + private static final InferenceRule leftProjection = new InferenceRule( + "Left Projection", + List.of( + new MetaDependencyFormula( + new MetaRDLTerm( + new MetaEvaluatableTermVariable(new Variable("te"), new Variable("n")), + new MetaResource(new Variable("r"), new Variable("m")) + ), + new MetaResource(new Variable("q"), new Variable("l")) + ) + ), + new MetaDependencyFormula( + new MetaRDLTerm(new MetaEvaluatableTermVariable(new Variable("te"), new Variable("n"))), + new MetaResource(new Variable("q"), new Variable("l")) + ) + ); + + private static final InferenceRule rightProjection = new InferenceRule( + "Right Projection", + List.of( + new MetaDependencyFormula( + new MetaRDLTerm( + new MetaEvaluatableTermVariable(new Variable("te"), new Variable("n")), + new MetaResource(new Variable("r"), new Variable("m")) + ), + new MetaResource(new Variable("q"), new Variable("l")) + ) + ), + new MetaDependencyFormula( + new MetaRDLTerm(new MetaEvaluatableTermVariable(new Variable("r"), new Variable("m"))), + new MetaResource(new Variable("q"), new Variable("l")) + ) + ); + + private static final InferenceRule domainMembership = new InferenceRule( + "Domain Membership", + List.of( + new MetaEquationFormula( + new MetaRDLTerm( + new MetaRDLTerm( + new MetaEvaluatableTermVariable(new Variable("se")), + new MetaResource(new Variable("r1")), + new MetaEvaluatableTermVariable(new Variable("t1")) + ), + new MetaResource(new Variable("r2")), + new MetaEvaluatableTermVariable(new Variable("t2")) + ), + new MetaResource(new Variable("c")) + ) + ), + new MetaInFormula( + new MetaRDLTerm( + new MetaEvaluatableTermVariable(new Variable("t1")), + new MetaResource(new Variable("r2")), + new MetaEvaluatableTermVariable(new Variable("t2")) + ), + new MetaRDLTerm( + new MetaRDLTerm(new MetaResource(new Variable("r1"))), + new MetaResource(new Variable("r2")), + new MetaEvaluatableTermVariable(new Variable("t2")) + ) + ) + ); + + private static final InferenceRule codomainMembership = new InferenceRule( + "Codomain Membership", + List.of( + new MetaDependencyFormula( + new MetaRDLTerm( + new MetaEvaluatableTermVariable(new Variable("se")), + new MetaResource(new Variable("r1")), + new MetaEvaluatableTermVariable(new Variable("t1")) + ), + new MetaResource(new Variable("r2")) + ), + new MetaInFormula( + new MetaRDLTerm( + new MetaEvaluatableTermVariable(new Variable("t1")), + new MetaResource(new Variable("r2")), + new MetaEvaluatableTermVariable(new Variable("t2")) + ), + new MetaRDLTerm( + new MetaRDLTerm( + new MetaResource(new Variable("r1")) + ), + new MetaResource(new Variable("r2")), + new MetaEvaluatableTermVariable(new Variable("t2")) + ) + ) + ), + new MetaInFormula( + new MetaRDLTerm( + new MetaRDLTerm( + new MetaEvaluatableTermVariable(new Variable("se")), + new MetaResource(new Variable("r1")), + new MetaEvaluatableTermVariable(new Variable("t1")) + ), + new MetaResource(new Variable("r2")), + new MetaEvaluatableTermVariable(new Variable("t2")) + ), + new MetaRDLTerm( + new MetaRDLTerm( + new MetaResource(new Variable("se")) + ), + new MetaResource(new Variable("r2")), + new MetaEvaluatableTermVariable(new Variable("t2")) + ) + ) + ); + + private static final InferenceRule codomainMembership2 = new InferenceRule( + "Codomain Membership2", + List.of( + new MetaDependencyFormula( + new MetaEvaluatableTermVariable(new Variable("se")), + new MetaResource(new Variable("r1")) + ), + new MetaInFormula( + new MetaEvaluatableTermVariable(new Variable("t1")), + new MetaRDLTerm( + new MetaResource(new Variable("r1")) + ) + ) + ), + new MetaInFormula( + new MetaRDLTerm( + new MetaEvaluatableTermVariable(new Variable("se")), + new MetaResource(new Variable("r1")), + new MetaEvaluatableTermVariable(new Variable("t1")) + ), + new MetaRDLTerm( + new MetaResource(new Variable("se")) + ) + ) + ); + + private static final List axioms = List.of( +// reflexivity, + symmetry, + transitivity, + rightSubstitution, + leftSubstitution, + identity, + mapComposition, + constantness, + rightNormalization, + pseudoConstantness, + identityMapping, + compositeMapping, + constantMapping, + slicedMapping, + memberSubstitution, + membershipChain, + collectionSubstitution, + setEquivelence, + setHomomorphism, + leftProjection, + rightProjection, + domainMembership, + codomainMembership, + codomainMembership2 + ); + + public static void debug() { + for (var axiom : axioms) { + System.out.println(axiom); + System.out.println("=================================================================================================="); + } + } + + record AxiomResult(InferenceRule axiom, List formulas) {} + + public static boolean check(Collection assumptions, Formula conclusion) { + + Map proofGraph = new HashMap<>(); + Map>> appliedFormulas = new HashMap<>(); + + for (InferenceRule axiom : axioms) { + appliedFormulas.put(axiom, new HashSet<>()); + } + + Set appearFormulas = new HashSet<>(assumptions); + Set existTerms = new HashSet<>(); + for (Formula assumption : assumptions) { + addExistTerms(assumption, existTerms); + } + int prevAppearFormulasSize = appearFormulas.size(); + while (! appearFormulas.contains(conclusion)) { + Set derivedFormulas = new HashSet<>(); + for(InferenceRule axiom : axioms) { + derivedFormulas.addAll(applyAxiom(axiom, appearFormulas, appliedFormulas.get(axiom), existTerms, proofGraph)); + } + if (derivedFormulas.size() == 0) { + return false; + } + appearFormulas.addAll(derivedFormulas); + if (appearFormulas.size() == prevAppearFormulasSize) { + return false; + } + prevAppearFormulasSize = appearFormulas.size(); + } + + Queue formulaQueue = new ArrayDeque<>(); + Queue depthQueue = new ArrayDeque<>(); + List formulaResult = new ArrayList<>(); + List depthResult = new ArrayList<>(); + Set used = new HashSet<>(); + Map> usedAxioms = new HashMap<>(); + + formulaQueue.add(conclusion); + depthQueue.add(0); + + System.out.println("proof finish"); + System.out.println(); + + while (formulaQueue.size() != 0) { + Formula currentFormula = formulaQueue.poll(); +// if (used.contains(currentFormula)) { +// continue; +// } + used.add(currentFormula); + int currentDepth = depthQueue.poll(); + formulaResult.add(currentFormula); + depthResult.add(currentDepth); + if (! proofGraph.containsKey(currentFormula)) continue; + for (Formula nextFormula : proofGraph.get(currentFormula).formulas) { +// if (used.contains(nextFormula)) { +// continue; +// } + formulaQueue.add(nextFormula); + depthQueue.add(currentDepth + 1); + if (! usedAxioms.containsKey(currentDepth + 1)) { + usedAxioms.put(currentDepth + 1, new HashSet<>()); + } + usedAxioms.get(currentDepth + 1).add(proofGraph.get(currentFormula).axiom); + } + } + int prevDepth = depthResult.get(depthResult.size() - 1); + Set sameDepthFormulas = new HashSet<>(); + for (int i = formulaResult.size() - 1; i >= 0; i--) { + int currentDepth = depthResult.get(i); + Formula currentFormula = formulaResult.get(i); + if (currentDepth != prevDepth) { + String out = sameDepthFormulas.stream().map(String::valueOf).collect(Collectors.joining(", ")); + String axioms = usedAxioms.get(prevDepth).stream().map(InferenceRule::getName).collect(Collectors.joining(", ")); + System.out.println(out); + System.out.println("==============================================================(" + axioms + ")"); + sameDepthFormulas.clear(); + } + prevDepth = currentDepth; + sameDepthFormulas.add(currentFormula); + + } + String out = sameDepthFormulas.stream().map(String::valueOf).collect(Collectors.joining(",")); + System.out.println(out); + return true; + } + + private static Set applyAxiom(InferenceRule axiom, Set formulas, Set> appliedFormulas, Set existTerms, Map proofGraph) { + Set result = new HashSet<>(); + List> matchedFormulas = new ArrayList<>(); + for (int i = 0; i < axiom.getAssumptionSize(); i++) { + matchedFormulas.add(new ArrayList<>()); + for (Formula formula : formulas) { + if (axiom.getAssumptions().get(i).isMatchedBy(formula)) { + matchedFormulas.get(i).add(formula); + } + } + } + for(List applyFormulas : Product.product(matchedFormulas)) { + if (appliedFormulas.contains(applyFormulas)) continue; + Set applied = axiom.apply(applyFormulas, existTerms); + if (applied != null) { + for (Formula formula : applied) { + if (! formulas.contains(formula)) { + addExistTerms(formula, existTerms); + proofGraph.put(formula, new AxiomResult(axiom, applyFormulas)); + } + } + result.addAll(applied); + appliedFormulas.add(applyFormulas); + } + } + return result; + } + + private static void addExistTerms(Formula formula, Set existTerms) { + if (formula instanceof EquationFormula) { + RDLTerm leftSideHand = ((EquationFormula) formula).getLeftSideHand(); + RDLTerm rightSideHand = ((EquationFormula) formula).getRightSideHand(); + existTerms.addAll(leftSideHand.getSubTerms(RDLTerm.class).values()); + existTerms.addAll(rightSideHand.getSubTerms(RDLTerm.class).values()); + } else if (formula instanceof DependencyFormula) { + RDLTerm dependency = ((DependencyFormula) formula).getDependency(); + existTerms.addAll(dependency.getSubTerms(RDLTerm.class).values()); + } else if (formula instanceof InFormula){ + RDLTerm leftSideHand = ((InFormula) formula).getLeftSideHand(); + RDLTerm rightSideHand = ((InFormula) formula).getRightSideHand(); + existTerms.addAll(leftSideHand.getSubTerms(RDLTerm.class).values()); + existTerms.addAll(rightSideHand.getSubTerms(RDLTerm.class).values()); + } + } + + private static boolean equationTransitionCheck(Collection assumptions, Formula conclusion) { + if (! (conclusion instanceof EquationFormula)) { + return false; + } + EquationFormula equationConclusion = (EquationFormula) conclusion; + Map> graph = constructEquationGraph(assumptions); + Deque que = new ArrayDeque<>(); + Set visited = new HashSet<>(); + que.add(equationConclusion.getLeftSideHand()); + while (! que.isEmpty()) { + EvaluatableTerm curNode = que.pollFirst(); + if (curNode.equals(equationConclusion.getRightSideHand())) { + return true; + } + for (EvaluatableTerm nextNode : graph.getOrDefault(curNode, new ArrayList<>())) { + if (visited.contains(nextNode)) { + continue; + } + visited.add(nextNode); + que.add(nextNode); + } + } + return false; + } + + private static Map> constructEquationGraph(Collection assumptions) { + List equations = new ArrayList<>(); + for (Formula assumption : assumptions) { + if (assumption instanceof EquationFormula) { + equations.add((EquationFormula) assumption); + } + } + + Map> graph = new HashMap<>(); + for (EquationFormula equation : equations) { + EvaluatableTerm lsh = equation.getLeftSideHand(); + EvaluatableTerm rsh = equation.getRightSideHand(); + if (! graph.containsKey(lsh)) { + graph.put(lsh, new ArrayList<>()); + } + if (! graph.containsKey(rsh)) { + graph.put(rsh, new ArrayList<>()); + } + graph.get(lsh).add(rsh); + graph.get(rsh).add(lsh); + } + return graph; + } +} diff --git a/src/main/java/inference/equivalence/MetaSemanticEquivalenceRelation.java b/src/main/java/inference/equivalence/MetaSemanticEquivalenceRelation.java new file mode 100644 index 0000000..6c73c1d --- /dev/null +++ b/src/main/java/inference/equivalence/MetaSemanticEquivalenceRelation.java @@ -0,0 +1,237 @@ +package inference.equivalence; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import exceptions.CoefficientNotOneException; +import exceptions.SubstituteFailedException; +import exceptions.TooManyVariablesException; +import lombok.Getter; +import models.algebra.Expression; +import models.algebra.Variable; +import models.terms.EvaluatableTerm; +import models.terms.RDLTerm; +import models.terms.meta.MetaRDLTerm; +import models.terms.meta.MetaVariable; +import models.terms.meta.OrderVariableConstraint; +import utils.ExpressionUitls; +import utils.Permutation; + +@Getter +public class MetaSemanticEquivalenceRelation { + + private MetaRDLTerm leftSideHand; + private MetaRDLTerm rightSideHand; + private Expression order; + private Variable orderVariable; + private int orderConstant = 0; + + public MetaSemanticEquivalenceRelation(MetaRDLTerm lsh, MetaRDLTerm rsh, Expression order) { + leftSideHand = lsh; + rightSideHand = rsh; + this.order = order; + Map coefficients = new HashMap<>(); + orderConstant = ExpressionUitls.getCoefficientAndConstantsFromExpression(order, coefficients, 1); + if (coefficients.size() > 1) { + // todo: create exception + throw new TooManyVariablesException("Too many variables"); + } + if (coefficients.size() == 1) { + orderVariable = coefficients.keySet().iterator().next(); + if (coefficients.get(orderVariable) != 1) { + throw new CoefficientNotOneException(); + } + } else { + orderVariable = null; + } + } + + public boolean isMatchedBy(SemanticEquivalenceRelation relation) { + Map binding = new HashMap<>(); + Map orderConstraint = new HashMap<>(); + return isMatchedBy(relation, binding, orderConstraint); + } + + public boolean isMatchedBy(SemanticEquivalenceRelation relation, Map binding, Map orderConstraint) { + return leftSideHand.isMatchedBy(relation.getLeftSideHand(), binding, orderConstraint) + && rightSideHand.isMatchedBy(relation.getRightSideHand(), binding, orderConstraint); + } + + public Set substitute(Map binding, Map orderConstraint, Collection existedTerms) { + Set result = new HashSet<>(); + Map allVariables = new HashMap<>(); + for(MetaVariable variable : leftSideHand.getAllVariables()) { + allVariables.put(variable.getVariableName(), variable); + } + for(MetaVariable variable : rightSideHand.getAllVariables()) { + allVariables.put(variable.getVariableName(), variable); + } + for (Variable variable : binding.keySet()) { + allVariables.remove(variable); + } + List leftVariables = new ArrayList<>(allVariables.keySet()); + for(List useTerms: Permutation.permutation(existedTerms, leftVariables.size())) { + Map tempBinding = new HashMap<>(); + tempBinding.putAll(binding); + boolean flg = false; + for (int i = 0; i < leftVariables.size(); i++) { + if (!allVariables.get(leftVariables.get(i)).isMatchedBy(useTerms.get(i))) { + flg = true; + break; + } + tempBinding.put(leftVariables.get(i), useTerms.get(i)); + } + if (flg) { + continue; + } + EvaluatableTerm leftTerm = (EvaluatableTerm) leftSideHand.substitute(tempBinding); + EvaluatableTerm rightTerm = (EvaluatableTerm) rightSideHand.substitute(tempBinding); + Map tempOrderConstraint = new HashMap<>(); + for(Variable key : orderConstraint.keySet()) { + tempOrderConstraint.put(key, (OrderVariableConstraint)orderConstraint.get(key).clone()); + } + if (leftSideHand.isMatchedBy(leftTerm, binding, tempOrderConstraint) && rightSideHand.isMatchedBy(rightTerm, binding, tempOrderConstraint)) { + if (! tempOrderConstraint.containsKey(orderVariable)) { + continue; + } + int order = tempOrderConstraint.get(this.orderVariable).getOrder(); + if (order == -1) { + continue; + } + order += orderConstant; + result.add(new SemanticEquivalenceRelation(leftTerm, rightTerm, order)); + } + for(Variable variable: leftVariables) { + binding.remove(variable); + } + } + return result; + } + + public Set substitute(RDLTerm term, Collection existedTerms) { + Set result = new HashSet<>(); + Set leftSub = leftSubstitute(term, existedTerms); + if (leftSub != null) { + result.addAll(leftSub); + } + + Set rightSub = rightSubstitute(term, existedTerms); + if (rightSub != null) { + result.addAll(rightSub); + } + return result; + } + + private Set leftSubstitute(RDLTerm term, Collection existedTerms) { + Set result = new HashSet<>(); + Map binding = new HashMap<>(); + Map orderConstraint = new HashMap<>(); + if (! leftSideHand.isMatchedBy(term, binding, orderConstraint)) { + return null; + } + if (! orderConstraint.containsKey(orderVariable)) { + return null; + } + int order = orderConstraint.get(this.orderVariable).getOrder(); + if (order == -1) { + return null; + } + order += orderConstant; + + Set allVariables = new HashSet<>(rightSideHand.getVariables().values()); + allVariables.removeAll(binding.keySet()); + List leftVariables = new ArrayList<>(allVariables); + for (List useVariables: Permutation.permutation(existedTerms, leftVariables.size())) { + Map tempBinding = new HashMap<>(); + tempBinding.putAll(binding); + for (int i = 0; i < leftVariables.size(); i++) { + tempBinding.put(leftVariables.get(i), useVariables.get(i)); + } + RDLTerm tempTerm = rightSideHand.substitute(tempBinding); + if (! rightSideHand.isMatchedBy(tempTerm, binding, orderConstraint)) { + continue; + } + result.add(new SemanticEquivalenceRelation((EvaluatableTerm)leftSideHand.substitute(binding), (EvaluatableTerm) rightSideHand.substitute(binding), order)); + for (int i = 0; i < leftVariables.size(); i++) { + binding.remove(leftVariables.get(i)); + } + } + try { + result.add(new SemanticEquivalenceRelation((EvaluatableTerm)leftSideHand.substitute(binding), (EvaluatableTerm)rightSideHand.substitute(binding), order)); + } catch (SubstituteFailedException e){} + return result; + } + + private Set rightSubstitute(RDLTerm term, Collection existedTerms) { + Set result = new HashSet<>(); + Map binding = new HashMap<>(); + Map orderConstraint = new HashMap<>(); + if (! rightSideHand.isMatchedBy(term, binding, orderConstraint)) { + return null; + }; + if (! orderConstraint.containsKey(orderVariable)) { + return null; + } + int order = orderConstraint.get(this.orderVariable).getOrder(); + if (order == -1) { + return null; + } + order += orderConstant; + + Set allVariables = new HashSet<>(); + for (MetaVariable vari : leftSideHand.getAllVariables()) { + allVariables.add(vari.getVariableName()); + } + allVariables.removeAll(binding.keySet()); + List leftVariables = new ArrayList<>(allVariables); + for (List useVariables: Permutation.permutation(existedTerms, leftVariables.size())) { + Map tempBinding = new HashMap<>(); + tempBinding.putAll(binding); + for (int i = 0; i < leftVariables.size(); i++) { + tempBinding.put(leftVariables.get(i), useVariables.get(i)); + } + RDLTerm tempTerm = leftSideHand.substitute(tempBinding); + if (! leftSideHand.isMatchedBy(tempTerm, binding, orderConstraint)) { + for (int i = 0; i < leftVariables.size(); i++) { + binding.remove(leftVariables.get(i)); + } + continue; + } + result.add(new SemanticEquivalenceRelation((EvaluatableTerm)leftSideHand.substitute(binding), (EvaluatableTerm)rightSideHand.substitute(binding), order)); + for (int i = 0; i < leftVariables.size(); i++) { + binding.remove(leftVariables.get(i)); + } + } + try { + result.add(new SemanticEquivalenceRelation((EvaluatableTerm)leftSideHand.substitute(binding), (EvaluatableTerm)rightSideHand.substitute(binding), order)); + } catch (SubstituteFailedException e){} + return result; + + } + + + @Override + public String toString() { + return leftSideHand.toString() + " ===(" + order + ") " + rightSideHand.toString(); + } + + @Override + public boolean equals(Object another) { + if (! (another instanceof SemanticEquivalenceRelation)) { + return false; + } + SemanticEquivalenceRelation relation = (SemanticEquivalenceRelation) another; + return leftSideHand.equals(relation.getLeftSideHand()) && rightSideHand.equals(relation.getRightSideHand()); + } + + @Override + public int hashCode() { + return toString().hashCode(); + } + +} diff --git a/src/main/java/inference/equivalence/SemanticEquivalenceProofSystem.java b/src/main/java/inference/equivalence/SemanticEquivalenceProofSystem.java new file mode 100644 index 0000000..876aad4 --- /dev/null +++ b/src/main/java/inference/equivalence/SemanticEquivalenceProofSystem.java @@ -0,0 +1,153 @@ +package inference.equivalence; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import models.algebra.Constant; +import models.algebra.Term; +import models.algebra.Variable; +import models.dataConstraintModel.DataConstraintModel; +import models.formulas.EquationFormula; +import models.terms.EvaluatableTerm; +import models.terms.LinearRightNormalizedType; +import models.terms.RDLTerm; +import models.terms.meta.MetaEvaluatableTermVariable; +import models.terms.meta.MetaRDLTerm; +import models.terms.meta.MetaResource; +import models.terms.meta.OrderConstraint; +import models.terms.meta.OrderVariableConstraint; + +public class SemanticEquivalenceProofSystem { + + private Map> assumptions; + private EquationFormula conclusion; + private Map proofGraph = new HashMap<>(); + int maxOrder = -1; + + private static MetaSemanticEquivalenceRelation rule1 = new MetaSemanticEquivalenceRelation( + new MetaRDLTerm( + new MetaResource(new Variable("v"), new Term(DataConstraintModel.add, List.of(new Variable("n"), new Constant("1")))), + new MetaResource(new Variable("v"), new Term(DataConstraintModel.add, List.of(new Variable("n"), new Constant("1")))), + new MetaEvaluatableTermVariable(new Variable("t"), new Variable("n"), LinearRightNormalizedType.LINEAR_RIGHT_NORMALIZED) + ), + new MetaEvaluatableTermVariable(new Variable("t"), new Variable("n"), LinearRightNormalizedType.LINEAR_RIGHT_NORMALIZED), + new Variable("n") + ); + + private static MetaSemanticEquivalenceRelation rule4_1 = new MetaSemanticEquivalenceRelation( + new MetaEvaluatableTermVariable(new Variable("t"), new Term(DataConstraintModel.add, List.of(new Variable("n"), new Constant("1"))), LinearRightNormalizedType.LINEAR_RIGHT_NORMALIZED), + new MetaEvaluatableTermVariable(new Variable("t'"), new Term(DataConstraintModel.add, List.of(new Variable("n"), new Constant("1"))), LinearRightNormalizedType.LINEAR_RIGHT_NORMALIZED), + new Term(DataConstraintModel.add, List.of(new Variable("n"), new Constant("1"))) + ); + + private static MetaSemanticEquivalenceRelation rule4_2 = new MetaSemanticEquivalenceRelation( + new MetaRDLTerm( + new MetaEvaluatableTermVariable(new Variable("t"), new Term(DataConstraintModel.add, List.of(new Variable("n"), new Constant("1")))), + new MetaResource(new Variable("v"), new Term(DataConstraintModel.add, List.of(new Variable("n"), new Constant("1")))), + new MetaEvaluatableTermVariable(new Variable("s"), OrderConstraint.LT, new Term(DataConstraintModel.add, List.of(new Variable("n"), new Constant("1")))) + ), + new MetaRDLTerm( + new MetaEvaluatableTermVariable(new Variable("t'"), new Term(DataConstraintModel.add, List.of(new Variable("n"), new Constant("1")))), + new MetaResource(new Variable("v"), new Term(DataConstraintModel.add, List.of(new Variable("n"), new Constant("1")))), + new MetaEvaluatableTermVariable(new Variable("s"), OrderConstraint.LT, new Term(DataConstraintModel.add, List.of(new Variable("n"), new Constant("1")))) + ), + new Variable("n") + ); + + public SemanticEquivalenceProofSystem(Collection assumptions, EquationFormula conclusion) { + this.assumptions = new HashMap<>(); + for(SemanticEquivalenceRelation assumption : assumptions) { + maxOrder = Math.max(maxOrder, assumption.getOrder()); + if (! this.assumptions.containsKey(assumption.getOrder())) { + this.assumptions.put(assumption.getOrder(), new HashSet<>()); + } + this.assumptions.get(assumption.getOrder()).add(assumption.linearRightNormalized()); + this.conclusion = conclusion; + } + } + + public boolean proof() { + Set existTerms = new HashSet<>(); + EquationFormula linearRightNormalizedConclusion = conclusion.linearRightNormalized(); + existTerms.addAll(linearRightNormalizedConclusion.getLeftSideHand().getSubTerms(EvaluatableTerm.class).values()); + existTerms.addAll(linearRightNormalizedConclusion.getRightSideHand().getSubTerms(EvaluatableTerm.class).values()); + SemanticEquivalenceRelation conclusionRelation = new SemanticEquivalenceRelation(conclusion.getLeftSideHand(), conclusion.getRightSideHand(), conclusion.getLeftSideHand().getOrder()); + SemanticEquivalenceRelation linearConclusionRelation = new SemanticEquivalenceRelation(linearRightNormalizedConclusion.getLeftSideHand(), linearRightNormalizedConclusion.getRightSideHand(), linearRightNormalizedConclusion.getLeftSideHand().getOrder()); + if (! linearRightNormalizedConclusion.equals(conclusion)) { + proofGraph.put(conclusionRelation, linearConclusionRelation); + } + for(int key : assumptions.keySet()) { + for(SemanticEquivalenceRelation relation : assumptions.get(key)) { + existTerms.addAll(relation.getLeftSideHand().getSubTerms(EvaluatableTerm.class).values()); + existTerms.add(relation.getLeftSideHand()); + existTerms.addAll(relation.getRightSideHand().getSubTerms(EvaluatableTerm.class).values()); + existTerms.add(relation.getRightSideHand()); + } + } + + + for (int i = maxOrder; i > linearRightNormalizedConclusion.getLeftSideHand().getOrder(); i--) { + Set apperTerms = new HashSet<>(); + for (SemanticEquivalenceRelation relation : assumptions.get(i)) { + apperTerms.addAll(applyRule4(relation, existTerms)); + } + existTerms.addAll(apperTerms); + } + + + List proofResult = new ArrayList<>(); + SemanticEquivalenceRelation currentRelation = conclusionRelation; + while(proofGraph.containsKey(currentRelation)) { + proofResult.add(currentRelation); + currentRelation = proofGraph.get(currentRelation); + } + proofResult.add(currentRelation); + Collections.reverse(proofResult); + for (int i = 0; i < proofResult.size(); i++) { + SemanticEquivalenceRelation relation = proofResult.get(i); + System.out.println(relation); + if (i < proofResult.size() - 1) System.out.println("=============================================================="); + } + return assumptions.get(0).contains(linearConclusionRelation); + } + + private void applyRule1() { + + } + + public static void debug() { + System.out.println(rule4_1); + System.out.println(rule4_2); + } + + private Set applyRule4(SemanticEquivalenceRelation relation, Set existTerms) { + Map binding = new HashMap<>(); + Map orderConstraint = new HashMap<>(); + Set appearTerms = new HashSet<>(); + if (rule4_1.isMatchedBy(relation, binding, orderConstraint)) { + Set results = rule4_2.substitute(binding, orderConstraint, existTerms); + for (SemanticEquivalenceRelation result : results) { + if (! assumptions.containsKey(result.getOrder())) { + assumptions.put(result.getOrder(), new HashSet<>()); + } + proofGraph.put(result, relation); + SemanticEquivalenceRelation linear = result.linearRightNormalized(); + assumptions.get(linear.getOrder()).add(linear); + if (!linear.equals(result)) { + proofGraph.put(linear, result); + } + appearTerms.addAll(linear.getLeftSideHand().getSubTerms(EvaluatableTerm.class).values()); + appearTerms.add(linear.getLeftSideHand()); + appearTerms.addAll(linear.getRightSideHand().getSubTerms(EvaluatableTerm.class).values()); + appearTerms.add(linear.getRightSideHand()); + } + } + return appearTerms; + } +} diff --git a/src/main/java/inference/equivalence/SemanticEquivalenceRelation.java b/src/main/java/inference/equivalence/SemanticEquivalenceRelation.java new file mode 100644 index 0000000..3dcc5d0 --- /dev/null +++ b/src/main/java/inference/equivalence/SemanticEquivalenceRelation.java @@ -0,0 +1,49 @@ +package inference.equivalence; + +import lombok.Getter; +import models.formulas.EquationFormula; +import models.terms.EvaluatableTerm; + +@Getter +public class SemanticEquivalenceRelation { + + private EvaluatableTerm leftSideHand; + private EvaluatableTerm rightSideHand; + private int order; + + public SemanticEquivalenceRelation(EvaluatableTerm lsh, EvaluatableTerm rsh, int order) { + leftSideHand = lsh; + rightSideHand = rsh; + this.order = order; + } + + public SemanticEquivalenceRelation(EquationFormula formula, int order) { + leftSideHand = formula.getLeftSideHand(); + rightSideHand = formula.getRightSideHand(); + this.order = order; + } + + public SemanticEquivalenceRelation linearRightNormalized() { + return new SemanticEquivalenceRelation(leftSideHand.linearRightNormalize(), rightSideHand.linearRightNormalize(), order); + } + + + @Override + public String toString() { + return leftSideHand.toString() + " =(" + order + ")= " + rightSideHand.toString(); + } + + @Override + public boolean equals(Object another) { + if (! (another instanceof SemanticEquivalenceRelation)) { + return false; + } + SemanticEquivalenceRelation relation = (SemanticEquivalenceRelation) another; + return leftSideHand.equals(relation.getLeftSideHand()) && rightSideHand.equals(relation.getRightSideHand()); + } + + @Override + public int hashCode() { + return toString().hashCode(); + } +} diff --git a/src/main/java/inference/rewrite/RewriteInferenceSystem.java b/src/main/java/inference/rewrite/RewriteInferenceSystem.java new file mode 100644 index 0000000..303ea2e --- /dev/null +++ b/src/main/java/inference/rewrite/RewriteInferenceSystem.java @@ -0,0 +1,127 @@ +package inference.rewrite; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import models.formulas.EquationFormula; +import models.formulas.Formula; +import models.formulas.Then; +import models.terms.DependencyTerm; +import models.terms.EvaluatableTerm; +import models.terms.PrimedTerm; +import models.terms.Resource; + +public class RewriteInferenceSystem { + + List constraintFormulas = new ArrayList<>(); + List invariantFormulas = new ArrayList<>(); + EquationFormula inputFormula; + List conditionalFormulas = new ArrayList<>(); + List otherFormulas = new ArrayList<>(); + Formula conclusion; + + public RewriteInferenceSystem(List assumptions, Formula conclusion) { + for (Formula assumption : assumptions) { + if (inputFormulaCheck(assumption)) { + inputFormula = (EquationFormula) assumption; + } else if(invariantFormulaCheck(assumption)) { + invariantFormulas.add(assumption); + } else if (assumption instanceof EquationFormula) { + constraintFormulas.add(assumption); + } else { + otherFormulas.add(assumption); + } + } + + if (conclusion instanceof Then then) { + conditionalFormulas.add(then.getCondition()); + this.conclusion = then.getResult(); + } else { + this.conclusion = conclusion; + } + + } + + public void debug() { + System.out.println("constraintFormulas: " + constraintFormulas.toString()); + System.out.println("invariantFormulas: " + invariantFormulas.toString()); + System.out.println("inputFormula: " + inputFormula.toString()); + System.out.println("conditionalFormulas: " + conditionalFormulas.toString()); + System.out.println("conclusion: " + conclusion.toString()); + } + + public boolean inference() { + Map> resourceTree = new HashMap<>(); + Resource root = parseDependencyTerm(inputFormula.getLeftSideHand(), resourceTree, new ArrayList<>()); + System.out.println(resourceTree); + return false; + } + + private Resource parseDependencyTerm(EvaluatableTerm term, Map> resourceTree, List tops) { + if (term instanceof Resource resource) { + if (tops.isEmpty()) { + resourceTree.put(resource, new ArrayList<>()); + tops.add(resource); + } else { + for (Resource top : tops) { + resourceTree.get(top).add(resource); + resourceTree.put(resource, new ArrayList<>()); + } + tops.clear(); + tops.add(resource); + } + return resource; + } + Resource root; + DependencyTerm depTerm = (DependencyTerm) term; + EvaluatableTerm dependingTerm = depTerm.getDependingTerm(); + List dependedTerms = depTerm.getDependedResources(); + List argumentTerms = depTerm.getArgumentTerms(); + root = parseDependencyTerm(dependingTerm, resourceTree, tops); + List nextTops = new ArrayList<>(); + for (int i = 0; i < dependedTerms.size(); i++) { + List currentTops = new ArrayList<>(tops); + parseDependencyTerm(dependedTerms.get(i), resourceTree, currentTops); + parseDependencyTerm(argumentTerms.get(i), resourceTree, currentTops); + nextTops.addAll(currentTops); + } + tops.clear(); + tops.addAll(nextTops); + return root; + } + + + private boolean inputFormulaCheck(Formula formula) { + if (! (formula instanceof EquationFormula equation)) { + return false; + } + List resources = new ArrayList<>(equation.getLeftSideHand().getSubTerms(Resource.class).values()); + resources.addAll(equation.getRightSideHand().getSubTerms(Resource.class).values()); + for (Resource resource : resources) { + if (resource.getOrder() == 0) { + return true; + } + } + return false; + } + + private boolean invariantFormulaCheck(Formula formula) { + if (! (formula instanceof EquationFormula equation)) { + return false; + } + EvaluatableTerm leftSideHand = equation.getLeftSideHand(); + EvaluatableTerm rightSideHand = equation.getRightSideHand(); + + if (leftSideHand instanceof PrimedTerm) { + return ((PrimedTerm) leftSideHand).getPrimedTerm().equals(rightSideHand); + } else if (rightSideHand instanceof PrimedTerm) { + return ((PrimedTerm) rightSideHand).getPrimedTerm().equals(leftSideHand); + } + + return false; + } + + +} diff --git a/src/main/java/models/formulas/DependencyFormula.java b/src/main/java/models/formulas/DependencyFormula.java new file mode 100644 index 0000000..269aafd --- /dev/null +++ b/src/main/java/models/formulas/DependencyFormula.java @@ -0,0 +1,41 @@ +package models.formulas; + +import lombok.Getter; +import models.terms.Dependency; +import models.terms.RDLTerm; +import models.terms.Resource; + +@Getter +public class DependencyFormula extends Formula { + + private Dependency dependency; + + public DependencyFormula(Dependency dependency) { + this.dependency = dependency; + } + + public DependencyFormula(RDLTerm dependingTerm, Resource dependedVariable) { + this.dependency = new Dependency(dependingTerm, dependedVariable); + } + + + @Override + public String toString() { + return dependency.toString(); + } + + @Override + public boolean equals(Object another) { + if(! (another instanceof DependencyFormula)) { + return false; + } + DependencyFormula anotherFormula = (DependencyFormula) another; + return dependency.equals(anotherFormula.getDependency()); + } + + @Override + public int hashCode() { + return ("DF" + toString()).hashCode(); + } + +} diff --git a/src/main/java/models/formulas/EquationFormula.java b/src/main/java/models/formulas/EquationFormula.java new file mode 100644 index 0000000..4ed83f6 --- /dev/null +++ b/src/main/java/models/formulas/EquationFormula.java @@ -0,0 +1,41 @@ +package models.formulas; + +import lombok.Getter; +import models.terms.EvaluatableTerm; + +@Getter +public class EquationFormula extends Formula { + + private EvaluatableTerm leftSideHand; + private EvaluatableTerm rightSideHand; + + public EquationFormula(EvaluatableTerm leftTerm, EvaluatableTerm rightTerm) { + this.leftSideHand = leftTerm; + this.rightSideHand = rightTerm; + } + + public EquationFormula linearRightNormalized() { + return new EquationFormula(leftSideHand.linearRightNormalize(), rightSideHand.linearRightNormalize()); + } + + + @Override + public String toString() { + return leftSideHand.toString() + " = " + rightSideHand.toString(); + } + + @Override + public boolean equals(Object another) { + if (! (another instanceof EquationFormula)) { + return false; + } + EquationFormula anotherFormula = (EquationFormula) another; + return leftSideHand.equals(anotherFormula.getLeftSideHand()) && rightSideHand.equals(anotherFormula.getRightSideHand()); + } + + @Override + public int hashCode() { + return toString().hashCode(); + } + +} diff --git a/src/main/java/models/formulas/Formula.java b/src/main/java/models/formulas/Formula.java new file mode 100644 index 0000000..f1813f4 --- /dev/null +++ b/src/main/java/models/formulas/Formula.java @@ -0,0 +1,9 @@ +package models.formulas; + +public abstract class Formula { + + public abstract String toString(); + public abstract boolean equals(Object another); + public abstract int hashCode(); + +} diff --git a/src/main/java/models/formulas/InFormula.java b/src/main/java/models/formulas/InFormula.java new file mode 100644 index 0000000..7b95536 --- /dev/null +++ b/src/main/java/models/formulas/InFormula.java @@ -0,0 +1,36 @@ +package models.formulas; + +import lombok.Getter; +import models.terms.EvaluatableTerm; + +@Getter +public class InFormula extends Formula { + + private EvaluatableTerm leftSideHand; + private EvaluatableTerm rightSideHand; + + public InFormula(EvaluatableTerm leftSideHand, EvaluatableTerm rightSideHand) { + this.leftSideHand = leftSideHand; + this.rightSideHand = rightSideHand; + } + + @Override + public String toString() { + return leftSideHand.toString() + " in " + rightSideHand.toString(); + } + + @Override + public boolean equals(Object another) { + if (! (another instanceof InFormula)) { + return false; + } + InFormula formula = (InFormula) another; + return leftSideHand.equals(formula.getLeftSideHand()) && rightSideHand.equals(formula.getRightSideHand()); + } + + @Override + public int hashCode() { + return toString().hashCode(); + } + +} diff --git a/src/main/java/models/formulas/Then.java b/src/main/java/models/formulas/Then.java new file mode 100644 index 0000000..6466300 --- /dev/null +++ b/src/main/java/models/formulas/Then.java @@ -0,0 +1,33 @@ +package models.formulas; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public class Then extends Formula { + + private Formula condition; + private Formula result; + + + @Override + public String toString() { + return condition.toString() + " => " + result.toString(); + } + + @Override + public int hashCode() { + return toString().hashCode(); + } + + @Override + public boolean equals(Object another) { + if (! (another instanceof Then)) { + return false; + } + Then then = (Then) another; + return this.condition.equals(then.getCondition()) && this.result.equals(then.getResult()); + } + +} diff --git a/src/main/java/models/formulas/meta/MetaDependencyFormula.java b/src/main/java/models/formulas/meta/MetaDependencyFormula.java new file mode 100644 index 0000000..68f9888 --- /dev/null +++ b/src/main/java/models/formulas/meta/MetaDependencyFormula.java @@ -0,0 +1,71 @@ +package models.formulas.meta; + +import java.util.Map; + +import exceptions.IllegalTypeException; +import lombok.Getter; +import models.algebra.Variable; +import models.formulas.DependencyFormula; +import models.formulas.Formula; +import models.terms.Dependency; +import models.terms.RDLTerm; +import models.terms.meta.MetaDependencyVariable; +import models.terms.meta.MetaRDLTerm; +import models.terms.meta.MetaResource; +import models.terms.meta.OrderVariableConstraint; + +@Getter +public class MetaDependencyFormula extends MetaFormula { + + private MetaRDLTerm dependency; + + public MetaDependencyFormula(MetaRDLTerm term) { + if (! term.isDependency()) { + throw new IllegalTypeException(); + } + this.dependency = term; + } + + public MetaDependencyFormula(MetaDependencyVariable dependency) { + this.dependency = dependency; + } + + public MetaDependencyFormula(MetaRDLTerm dependingTerm, MetaResource dependedVariable) { + this.dependency = new MetaRDLTerm(dependingTerm, dependedVariable); + } + + @Override + public boolean isMatchedBy(Formula formula, Map binding, + Map orderConstraint) { + if (! (formula instanceof DependencyFormula)) { + return false; + } + DependencyFormula dep = (DependencyFormula) formula; + return dependency.isMatchedBy(dep.getDependency(), binding, orderConstraint); + } + + + @Override + public DependencyFormula substitution(Map binding) { + return new DependencyFormula((Dependency) dependency.substitute(binding)); + } + + + + public String toString() { + return dependency.toString(); + } + + public boolean equals(Object another) { + if (! (another instanceof MetaDependencyFormula)) { + return false; + } + MetaDependencyFormula anohterFormula = (MetaDependencyFormula) another; + return dependency.equals(anohterFormula.getDependency()); + } + + public int hashCode() { + return ("MDF" + toString()).hashCode(); + } + +} diff --git a/src/main/java/models/formulas/meta/MetaEquationFormula.java b/src/main/java/models/formulas/meta/MetaEquationFormula.java new file mode 100644 index 0000000..7f27ff5 --- /dev/null +++ b/src/main/java/models/formulas/meta/MetaEquationFormula.java @@ -0,0 +1,64 @@ +package models.formulas.meta; + +import java.util.Map; + +import exceptions.IllegalTypeException; +import lombok.Getter; +import models.algebra.Variable; +import models.formulas.EquationFormula; +import models.formulas.Formula; +import models.terms.EvaluatableTerm; +import models.terms.RDLTerm; +import models.terms.meta.MetaRDLTerm; +import models.terms.meta.OrderVariableConstraint; + +@Getter +public class MetaEquationFormula extends MetaFormula { + + private MetaRDLTerm leftSideHand; + private MetaRDLTerm rightSideHand; + + public MetaEquationFormula(MetaRDLTerm left, MetaRDLTerm right) { + if (! left.isEvaluatableTerm()) { + throw new IllegalTypeException(); + } + if (! right.isEvaluatableTerm()) { + throw new IllegalTypeException(); + } + + this.leftSideHand = left; + this.rightSideHand = right; + } + + @Override + public boolean isMatchedBy(Formula formula, Map binding, + Map orderConstraint) { + if (! (formula instanceof EquationFormula)) { + return false; + } + EquationFormula eq = (EquationFormula) formula; + return leftSideHand.isMatchedBy(eq.getLeftSideHand(), binding, orderConstraint) && rightSideHand.isMatchedBy(eq.getRightSideHand(), binding, orderConstraint); + } + + @Override + public EquationFormula substitution(Map binding) { + return new EquationFormula((EvaluatableTerm) leftSideHand.substitute(binding), (EvaluatableTerm) rightSideHand.substitute(binding)); + } + + public String toString() { + return leftSideHand.toString() + " = " + rightSideHand.toString(); + } + + public boolean equals(Object another) { + if (! (another instanceof MetaEquationFormula)) { + return false; + } + MetaEquationFormula anohterFormula = (MetaEquationFormula) another; + return leftSideHand.equals(anohterFormula.getLeftSideHand()) && rightSideHand.equals(anohterFormula.getRightSideHand()); + } + + public int hashCode() { + return ("MEF" + toString()).hashCode(); + } + +} diff --git a/src/main/java/models/formulas/meta/MetaFormula.java b/src/main/java/models/formulas/meta/MetaFormula.java new file mode 100644 index 0000000..6115a2b --- /dev/null +++ b/src/main/java/models/formulas/meta/MetaFormula.java @@ -0,0 +1,25 @@ +package models.formulas.meta; + +import java.util.HashMap; +import java.util.Map; + +import models.algebra.Variable; +import models.formulas.Formula; +import models.terms.RDLTerm; +import models.terms.meta.OrderVariableConstraint; + +public abstract class MetaFormula { + + public boolean isMatchedBy(Formula formula) { + return isMatchedBy(formula, new HashMap<>(), new HashMap<>()); + } + + public abstract boolean isMatchedBy(Formula formula, Map binding, Map orderConstraint); + + public abstract Formula substitution(Map binding); + + public abstract String toString(); + public abstract boolean equals(Object another); + public abstract int hashCode(); + +} diff --git a/src/main/java/models/formulas/meta/MetaInFormula.java b/src/main/java/models/formulas/meta/MetaInFormula.java new file mode 100644 index 0000000..900faff --- /dev/null +++ b/src/main/java/models/formulas/meta/MetaInFormula.java @@ -0,0 +1,68 @@ +package models.formulas.meta; + +import java.util.Map; + +import exceptions.IllegalTypeException; +import lombok.Getter; +import models.algebra.Variable; +import models.formulas.Formula; +import models.formulas.InFormula; +import models.terms.EvaluatableTerm; +import models.terms.RDLTerm; +import models.terms.meta.MetaRDLTerm; +import models.terms.meta.OrderVariableConstraint; + +@Getter +public class MetaInFormula extends MetaFormula { + + private MetaRDLTerm leftSideHand; + private MetaRDLTerm rightSideHand; + + public MetaInFormula(MetaRDLTerm leftSideHand, MetaRDLTerm rightSideHand) { + if (! leftSideHand.isEvaluatableTerm()) { + throw new IllegalTypeException(); + } + if(! rightSideHand.isEvaluatableTerm()) { + throw new IllegalTypeException(); + } + this.leftSideHand = leftSideHand; + this.rightSideHand = rightSideHand; + } + + @Override + public boolean isMatchedBy(Formula formula, Map binding, + Map orderConstraint) { + if (! (formula instanceof InFormula)) { + return false; + } + InFormula inFormula = (InFormula) formula; + return leftSideHand.isMatchedBy(inFormula.getLeftSideHand(), binding, orderConstraint) + && rightSideHand.isMatchedBy(inFormula.getRightSideHand(), binding, orderConstraint); + } + + @Override + public InFormula substitution(Map binding) { + return new InFormula((EvaluatableTerm) leftSideHand.substitute(binding), (EvaluatableTerm) rightSideHand.substitute(binding)); + } + + + @Override + public String toString() { + return leftSideHand.toString() + " in " + rightSideHand.toString(); + } + + @Override + public boolean equals(Object anohter) { + if (! (anohter instanceof MetaInFormula)) { + return false; + } + MetaInFormula formula = (MetaInFormula) anohter; + return leftSideHand.equals(formula.getLeftSideHand()) && rightSideHand.equals(formula.getRightSideHand()); + } + + @Override + public int hashCode() { + return toString().hashCode(); + } + +} diff --git a/src/main/java/models/terms/Dependency.java b/src/main/java/models/terms/Dependency.java new file mode 100644 index 0000000..eee07c7 --- /dev/null +++ b/src/main/java/models/terms/Dependency.java @@ -0,0 +1,140 @@ +package models.terms; + +import lombok.Getter; +import models.algebra.Symbol; + +@Getter +public class Dependency extends RDLTerm{ + + private RDLTerm dependingTerm; + private Resource dependedVariable; + private Dependency dependency; + private boolean isListType; + + public Dependency(RDLTerm dependingTerm, Resource dependedVariable) { + super(new Symbol(":", 2), dependedVariable.getOrder(), dependingTerm.getSize() + dependedVariable.getSize()); + this.dependingTerm = dependingTerm; + this.dependedVariable = dependedVariable; + this.dependency = null; + this.addChild(dependingTerm); + this.addChild(dependedVariable); + this.isListType = false; + } + + public Dependency(Dependency dependency) { + super(new Symbol(":", 1), dependency.getOrder() - 1, dependency.getSize()); + this.dependency = dependency; + this.dependingTerm = null; + this.dependedVariable = null; + this.addChild(dependency); + this.isListType = true; + } + + public Dependency(RDLTerm dependingTerm, Resource dependedVariable, int order) { + super(new Symbol(":", order == dependedVariable.order ? 2 : 1), order, dependingTerm.getSize() + dependedVariable.getSize()); + if(order == dependedVariable.order) { + this.dependingTerm = dependingTerm; + this.dependedVariable = dependedVariable; + this.addChild(dependingTerm); + this.addChild(dependedVariable); + this.dependency = null; + this.isListType = false; + } else { + this.dependency = new Dependency(dependingTerm, dependedVariable, order+1); + this.dependingTerm = null; + this.dependedVariable = null; + this.addChild(dependency); + this.isListType = true; + } + } + + public Dependency getDependency() { + return this.dependency; + } + + @Override + public int getTermOrder() { + return getOrder() - 1; + } + + public boolean isDependeingTermEvaluatable() { + return dependingTerm instanceof EvaluatableTerm; + } + + public void setDependingTerm(RDLTerm newTerm) { + setChild(0, newTerm); + this.dependingTerm = newTerm; + } + + public void setDependedVariable(Resource newVariable) { + setChild(1, newVariable); + this.dependedVariable = newVariable; + } + + public void setDependency(Dependency newDependency) { + setChild(0, newDependency); + this.dependency = newDependency; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + if(dependency == null) { + sb.append(dependingTerm.toTermString()); + sb.append(" : "); + sb.append(dependedVariable.toString()); + } else { + sb.append('['); + sb.append(dependency.toString()); + sb.append(']'); + } + return sb.toString(); + } + + @Override + public String toStringWithOrder() { + StringBuilder sb = new StringBuilder(); + if(dependency == null) { + sb.append(dependingTerm.toStringWithOrder()); + sb.append(" : "); + sb.append(dependedVariable.toStringWithOrder()); + } else { + sb.append('['); + sb.append(dependency.toStringWithOrder()); + sb.append(']'); + } + return sb.toString() + "(" + order + ")"; + } + + @Override + public String toTermString() { + return "[" + toString() + "]"; + } + + @Override + public boolean equals(Object another) { + if(! (another instanceof Dependency)) { + return false; + } + Dependency anotherDep = (Dependency) another; + if(anotherDep.isListType() != isListType()) { + return false; + } + if(isListType()) { + return anotherDep.getDependency().equals(dependency); + } + return anotherDep.getDependingTerm().equals(dependingTerm) + && anotherDep.getDependedVariable().equals(dependedVariable); + } + + @Override + public int hashCode() { + return ("Dep" + toString()).hashCode(); + } + + @Override + public Object clone() { + return new Dependency((RDLTerm) dependingTerm.clone(), (Resource) dependedVariable.clone()); + } + +} diff --git a/src/main/java/models/terms/DependencyTerm.java b/src/main/java/models/terms/DependencyTerm.java new file mode 100644 index 0000000..a84c945 --- /dev/null +++ b/src/main/java/models/terms/DependencyTerm.java @@ -0,0 +1,192 @@ +package models.terms; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.IntStream; + +import lombok.Getter; +import models.algebra.Symbol; + +@Getter +public class DependencyTerm extends EvaluatableTerm{ + + private EvaluatableTerm dependingTerm; + private List dependedResources = new ArrayList<>(); + private List argumentTerms = new ArrayList<>(); + + +// public DependencyTerm(EvaluatableTerm dependingTerm, EvaluatableTerm dependedTerm, EvaluatableTerm argumentTerm) { +// super( +// new Symbol(":", 3), +// dependedTerm.getOrder() == argumentTerm.getOrder() ? dependedTerm.getOrder() : dependedTerm.getOrder() - 1, +// dependingTerm.getSize() + argumentTerm.getSize() + dependedTerm.getSize() +// ); +// this.dependingTerm = dependingTerm; +// this.dependedTerms.add(dependedTerm); +// this.argumentTerms.add(argumentTerm); +// addChild(dependingTerm); +// addChild(dependedTerm); +// addChild(argumentTerm); +// } + + public DependencyTerm(EvaluatableTerm dependingTerm, List dependedTerms, List argumentTerms) { + super( + new Symbol(":", 1 + dependedTerms.size() + argumentTerms.size()), + dependedTerms.get(0).getOrder() == argumentTerms.get(0).getOrder() ? dependedTerms.get(0).getOrder() : argumentTerms.get(0).getOrder() - 1, + dependingTerm.getSize() + argumentTerms.get(0).getSize() + dependedTerms.get(0).getSize() + ); + boolean dependedTermsOrderCheck = dependedTerms.stream().allMatch(e -> e.getOrder() == dependedTerms.get(0).getOrder()); +// boolean argumentTermsOrderCheck = argumentTerms.stream().allMatch(e -> e.getOrder() == argumentTerms.get(0).getOrder()); + if (! (dependedTermsOrderCheck)) { + throw new RuntimeException("Orders are not all equals"); + } + if (dependedTerms.size() != argumentTerms.size()) { + throw new RuntimeException("Size not equals"); + } + this.dependingTerm = dependingTerm; + this.dependedResources = new ArrayList<>(dependedTerms); + this.argumentTerms = new ArrayList<>(argumentTerms); + addChild(dependingTerm); + for (int i = 0; i < dependedTerms.size(); i++) { + addChild(dependedTerms.get(i)); + addChild(argumentTerms.get(i)); + } + } + + public DependencyTerm(EvaluatableTerm dependingTerm, EvaluatableTerm ...terms) { + this( + dependingTerm, + IntStream.range(0, terms.length).filter(i -> i % 2 == 0).mapToObj(i -> (Resource) terms[i]).toList(), + IntStream.range(0, terms.length).filter(i -> i % 2 == 1).mapToObj(i -> terms[i]).toList() + ); + } + + @Override + public boolean isLinearRightNormalized() { + return isLinearRightNormaled(0); + } + + @Override + public EvaluatableTerm linearRightNormalize() { + DependencyTerm newTerm = (DependencyTerm) clone(); + newTerm.selfLinearRightNormalize(); + return newTerm; + } + + @Override + public void selfLinearRightNormalize() { +// if(dependingTerm instanceof ResourceVariable || dependingTerm instanceof SetEvaluatableTerm) { +// argumentTerm.selfLinearRightNormalize(); +// return; +// } +// DependencyTerm dependencyTerm = (DependencyTerm) dependingTerm; +// if(! dependencyTerm.isLinearRightNormalized()) { +// dependencyTerm.selfLinearRightNormalize(); +// } +// if(! isLinearRightNormalized()) { +// EvaluatableTerm childArgumentTerm = dependencyTerm.getArgumentTerm(); +// DependencyTerm nextDependencyTerm = new DependencyTerm(childArgumentTerm, dependedVariable, argumentTerm); +// this.dependingTerm = dependencyTerm.getDependingTerm(); +// this.dependedVariable = dependencyTerm.getDependedVariable(); +// this.argumentTerm = nextDependencyTerm; +// this.setChild(2, nextDependencyTerm); +// this.setChild(0, dependencyTerm.getDependingTerm()); +// this.setChild(1, dependencyTerm.getDependedVariable()); +// } +// argumentTerm.selfLinearRightNormalize(); + + } + + private boolean isLinearRightNormaled(int depth) { +// if(dependingTerm instanceof ResourceVariable || dependingTerm instanceof SetEvaluatableTerm) { +// return dependingTerm.getOrder() == dependedVariable.getOrder(); +// } +// DependencyTerm dependencyTerm = (DependencyTerm) dependingTerm; +// if( +// dependencyTerm.isLinearRightNormaled(depth + 1) && +// dependencyTerm.getDependedVariable().getOrder() - 1 == dependedVariable.getOrder() && +// dependencyTerm.getOrder() == dependedVariable.getOrder() && +// argumentTerm.getOrder() <= dependencyTerm.getOrder() && +// depth == 0 +// ) { +// return true; +// } +// if( +// dependencyTerm.isLinearRightNormaled(depth + 1) && +// dependencyTerm.getDependedVariable().getOrder() - 1 == dependedVariable.getOrder() && +// dependencyTerm.getOrder() == dependedVariable.getOrder() && +// argumentTerm.getOrder() < dependencyTerm.getOrder() +// ) { +// return true; +// } + + return false; + } + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append('['); + sb.append(getDependingTerm().toString()); + sb.append(" : "); + for (int i = 0; i < dependedResources.size(); i++) { + sb.append(dependedResources.get(i).toString()); + sb.append(" -> "); + sb.append(argumentTerms.get(i).toString()); + sb.append(", "); + } + sb.deleteCharAt(sb.length() - 1); + sb.deleteCharAt(sb.length() - 1); + sb.append(']'); + return sb.toString(); + } + + @Override + public String toStringWithOrder() { + StringBuilder sb = new StringBuilder(); + sb.append('['); + sb.append(getDependingTerm().toStringWithOrder()); + sb.append(" : "); + for (int i = 0; i < dependedResources.size(); i++) { + sb.append(dependedResources.get(i).toStringWithOrder()); + sb.append(" -> "); + sb.append(argumentTerms.get(i).toStringWithOrder()); + sb.append(", "); + } + sb.deleteCharAt(sb.length() - 1); + sb.append(']'); + sb.append('('); + sb.append(order); + sb.append(')'); + return sb.toString(); + } + + @Override + public boolean equals(Object another) { + if(! (another instanceof DependencyTerm)) { + return false; + } + DependencyTerm term = (DependencyTerm) another; + + return dependingTerm.equals(term.getDependingTerm()) && + dependedResources.stream().sorted().toList().equals(term.getDependedResources().stream().sorted().toList()) && + argumentTerms.stream().sorted().toList().equals(term.getArgumentTerms().stream().sorted().toList()); + } + + @Override + public int hashCode() { + return ("DT" + toString()).hashCode(); + } + + @Override + public Object clone() { + return new DependencyTerm( + (EvaluatableTerm) dependingTerm.clone(), + new ArrayList<>(dependedResources), + new ArrayList<>(argumentTerms) + ); + } + + +} diff --git a/src/main/java/models/terms/EvaluatableTerm.java b/src/main/java/models/terms/EvaluatableTerm.java new file mode 100644 index 0000000..84169f6 --- /dev/null +++ b/src/main/java/models/terms/EvaluatableTerm.java @@ -0,0 +1,22 @@ +package models.terms; + +import models.algebra.Symbol; + +public abstract class EvaluatableTerm extends RDLTerm{ + + protected EvaluatableTerm(Symbol symbol, int order, int size) { + super(symbol, order, size); + } + + public abstract boolean isLinearRightNormalized(); + public LinearRightNormalizedType getLinearRightNormalizedType() { + if (isLinearRightNormalized()) { + return LinearRightNormalizedType.LINEAR_RIGHT_NORMALIZED; + } + return LinearRightNormalizedType.NOT_LINEAR_RIGHT_NORMALIZED; + } + + public abstract EvaluatableTerm linearRightNormalize(); + public abstract void selfLinearRightNormalize(); + +} diff --git a/src/main/java/models/terms/LinearRightNormalizedType.java b/src/main/java/models/terms/LinearRightNormalizedType.java new file mode 100644 index 0000000..e043c08 --- /dev/null +++ b/src/main/java/models/terms/LinearRightNormalizedType.java @@ -0,0 +1,9 @@ +package models.terms; + +public enum LinearRightNormalizedType { + + LINEAR_RIGHT_NORMALIZED, + NOT_LINEAR_RIGHT_NORMALIZED, + UNDEFINED + +} diff --git a/src/main/java/models/terms/PrimedTerm.java b/src/main/java/models/terms/PrimedTerm.java new file mode 100644 index 0000000..6de8ae5 --- /dev/null +++ b/src/main/java/models/terms/PrimedTerm.java @@ -0,0 +1,52 @@ +package models.terms; + +import lombok.Getter; + +@Getter +public class PrimedTerm extends EvaluatableTerm { + + private EvaluatableTerm primedTerm; + + public PrimedTerm(EvaluatableTerm term) { + super(term.getSymbol(), term.getOrder(), term.getSize()); + this.primedTerm = term; + } + + @Override + public String toString() { + return primedTerm.toString() + "'"; + } + + @Override + public String toStringWithOrder() { + return toString() + "(" + primedTerm.getOrder() + ")"; + } + + @Override + public int hashCode() { + return toStringWithOrder().hashCode(); + } + + @Override + public Object clone() { + return new PrimedTerm(primedTerm); + } + + @Override + public boolean isLinearRightNormalized() { + return primedTerm.isLinearRightNormalized(); + } + + @Override + public EvaluatableTerm linearRightNormalize() { + return new PrimedTerm(primedTerm.linearRightNormalize()); + } + + @Override + public void selfLinearRightNormalize() { + primedTerm.selfLinearRightNormalize(); + } + + + +} diff --git a/src/main/java/models/terms/RDLTerm.java b/src/main/java/models/terms/RDLTerm.java new file mode 100644 index 0000000..629839c --- /dev/null +++ b/src/main/java/models/terms/RDLTerm.java @@ -0,0 +1,48 @@ +package models.terms; + +import lombok.Getter; +import models.algebra.Symbol; +import models.algebra.Term; + +@Getter +public abstract class RDLTerm extends Term implements Comparable{ + + protected int order; + protected int size; + + protected RDLTerm(Symbol symbol, int order, int size) { + super(symbol); + this.order = order; + this.size = size; + } + + public int getTermOrder() { + return getOrder(); + } + + @Override + public abstract String toString(); + + public abstract String toStringWithOrder(); + + public String toTermString() { + return toString(); + } + + @Override + public int compareTo(RDLTerm other) { + return toString().compareTo(other.toString()); + } + + @Override + public boolean equals(Object another) { + return super.equals(another); + } + + @Override + public abstract int hashCode(); + + @Override + public abstract Object clone(); + +} diff --git a/src/main/java/models/terms/Resource.java b/src/main/java/models/terms/Resource.java new file mode 100644 index 0000000..e5274fb --- /dev/null +++ b/src/main/java/models/terms/Resource.java @@ -0,0 +1,63 @@ +package models.terms; + +import lombok.Getter; +import models.algebra.Symbol; +import models.algebra.Type; + +@Getter +public class Resource extends EvaluatableTerm { + + private String name; + private Type type; + + public Resource(String name, Type type, int order) { + super(new Symbol("", 0), order, 1); + this.name = name; + this.type = type; + } + + @Override + public EvaluatableTerm linearRightNormalize() { + return (Resource) clone(); + } + + @Override + public void selfLinearRightNormalize() { + } + + @Override + public boolean isLinearRightNormalized() { + return true; + } + + + @Override + public boolean equals(Object another) { + if(! (another instanceof Resource)) { + return false; + } + var vari = (Resource) another; + return vari.getOrder() == getOrder() && vari.getName().equals(getName()) && vari.getType().equals(getType()); + } + + @Override + public int hashCode() { + return ("Vari" + toStringWithOrder()).hashCode(); + } + + @Override + public String toString() { + return this.name; + } + + @Override + public String toStringWithOrder() { + return this.name + "(" + order + ")"; + } + + @Override + public Object clone() { + return new Resource(name, type, order); + } + +} diff --git a/src/main/java/models/terms/ResourceConstant.java b/src/main/java/models/terms/ResourceConstant.java new file mode 100644 index 0000000..1158b84 --- /dev/null +++ b/src/main/java/models/terms/ResourceConstant.java @@ -0,0 +1,70 @@ +package models.terms; + +import lombok.Getter; +import models.algebra.Symbol; +import models.algebra.Type; + +@Getter +public class ResourceConstant extends EvaluatableTerm{ + + private String name; + private Type type; + + public ResourceConstant(String name) { + super(new Symbol("", 0), 0, 1); + this.name = name; + this.type = null; + } + + public ResourceConstant(String name, Type type) { + super(new Symbol("", 0), 0, 1); + this.name = name; + this.type = type; + } + + @Override + public boolean isLinearRightNormalized() { + return true; + } + + @Override + public EvaluatableTerm linearRightNormalize() { + return (ResourceConstant) clone(); + } + + @Override + public void selfLinearRightNormalize() { + } + + + @Override + public boolean equals(Object another) { + if(! (another instanceof ResourceConstant)) { + return false; + } + var cons = (ResourceConstant) another; + return cons.getOrder() == getOrder() && cons.getName().equals(getName()); + } + + @Override + public int hashCode() { + return ("Const" + toStringWithOrder()).hashCode(); + } + + @Override + public String toString() { + return this.name; + } + + @Override + public String toStringWithOrder() { + return this.name + "(" + order + ")"; + } + + @Override + public Object clone() { + return new ResourceConstant(name, type); + } + + +} diff --git a/src/main/java/models/terms/SetEvaluatableTerm.java b/src/main/java/models/terms/SetEvaluatableTerm.java new file mode 100644 index 0000000..05fc8e2 --- /dev/null +++ b/src/main/java/models/terms/SetEvaluatableTerm.java @@ -0,0 +1,86 @@ +package models.terms; + +import lombok.Getter; +import models.algebra.Symbol; + +@Getter +public class SetEvaluatableTerm extends EvaluatableTerm{ + + private EvaluatableTerm term; + + public SetEvaluatableTerm(EvaluatableTerm term) { + super(new Symbol("", 1), term.getOrder() - 1, term.getSize()); + this.term = term; + this.addChild(term); + } + + public SetEvaluatableTerm(EvaluatableTerm term, int order) { + super(new Symbol("", 1), order, term.getSize()); + if(term.getOrder() > order + 1) { + var childTerm = new SetEvaluatableTerm(term, order+1); + this.term = childTerm; + this.addChild(childTerm); + } else { + this.term = term; + this.addChild(term); + } + } + + public void setTerm(EvaluatableTerm newTerm) { + setChild(0, newTerm); + this.term = newTerm; + } + + @Override + public EvaluatableTerm linearRightNormalize() { + return (SetEvaluatableTerm) clone(); + } + + @Override + public void selfLinearRightNormalize() { + } + + @Override + public boolean isLinearRightNormalized() { + return term.isLinearRightNormalized(); + } + + + @Override + public boolean equals(Object another) { + if(! (another instanceof SetEvaluatableTerm)) { + return false; + } + var term = (SetEvaluatableTerm) another; + return term.getTerm().equals(getTerm()); + } + + @Override + public int hashCode() { + return ("SET" + toString()).hashCode(); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append('{'); + sb.append(term.toString()); + sb.append('}'); + return sb.toString(); + } + + @Override + public String toStringWithOrder() { + StringBuilder sb = new StringBuilder(); + sb.append('{'); + sb.append(term.toStringWithOrder()); + sb.append('}'); + return sb.toString() + "(" + order + ")"; + } + + @Override + public Object clone() { + return new SetEvaluatableTerm((EvaluatableTerm) term.clone(), order); + } + +} diff --git a/src/main/java/models/terms/meta/MetaDependencyTermVariable.java b/src/main/java/models/terms/meta/MetaDependencyTermVariable.java new file mode 100644 index 0000000..fc23e3a --- /dev/null +++ b/src/main/java/models/terms/meta/MetaDependencyTermVariable.java @@ -0,0 +1,24 @@ +package models.terms.meta; + +import lombok.Getter; +import models.algebra.Constant; +import models.algebra.Expression; +import models.algebra.Symbol; +import models.algebra.Variable; + +@Getter +public class MetaDependencyTermVariable extends MetaVariable { + + public MetaDependencyTermVariable(Variable variableName, OrderConstraint constraint, Expression order) { + super(new Symbol(":", 3), MetaRDLTerm.TermType.META_DEPENDENCY_TERM_VARIABLE, variableName, constraint, order); + } + + public MetaDependencyTermVariable(Variable variableName) { + super(new Symbol(":", 3), MetaRDLTerm.TermType.META_DEPENDENCY_TERM_VARIABLE, variableName, OrderConstraint.ANY, new Constant("0")); + } + + public MetaDependencyTermVariable(Variable variableName, Expression order) { + super(new Symbol(":", 3), MetaRDLTerm.TermType.META_DEPENDENCY_TERM_VARIABLE, variableName, OrderConstraint.EQ, order); + } + +} diff --git a/src/main/java/models/terms/meta/MetaDependencyVariable.java b/src/main/java/models/terms/meta/MetaDependencyVariable.java new file mode 100644 index 0000000..477e338 --- /dev/null +++ b/src/main/java/models/terms/meta/MetaDependencyVariable.java @@ -0,0 +1,24 @@ +package models.terms.meta; + +import lombok.Getter; +import models.algebra.Constant; +import models.algebra.Expression; +import models.algebra.Symbol; +import models.algebra.Variable; + +@Getter +public class MetaDependencyVariable extends MetaVariable { + + public MetaDependencyVariable(Variable variableName, OrderConstraint constraint, Expression order) { + super(new Symbol(":", 2), MetaRDLTerm.TermType.META_DEPENDENCY_VARIABLE, variableName, constraint, order); + } + + public MetaDependencyVariable(Variable variableName) { + super(new Symbol(":", 2), MetaRDLTerm.TermType.META_DEPENDENCY_VARIABLE, variableName, OrderConstraint.ANY, new Constant("0")); + } + + public MetaDependencyVariable(Variable variableName, Expression order) { + super(new Symbol(":", 2), MetaRDLTerm.TermType.META_DEPENDENCY_VARIABLE, variableName, OrderConstraint.EQ, order); + } + +} diff --git a/src/main/java/models/terms/meta/MetaEvaluatableTermSet.java b/src/main/java/models/terms/meta/MetaEvaluatableTermSet.java new file mode 100644 index 0000000..8611340 --- /dev/null +++ b/src/main/java/models/terms/meta/MetaEvaluatableTermSet.java @@ -0,0 +1,22 @@ +package models.terms.meta; + +import models.algebra.Constant; +import models.algebra.Expression; +import models.algebra.Symbol; +import models.algebra.Variable; + +public class MetaEvaluatableTermSet extends MetaVariable{ + + public MetaEvaluatableTermSet(Variable name, OrderConstraint constraint, Expression order) { + super(new Symbol(":", 1), TermType.META_EVALUATABLE_TERM_SET_VARIABLE, name, constraint, order); + } + + public MetaEvaluatableTermSet(Variable variableName) { + super(new Symbol(":", 1), MetaRDLTerm.TermType.META_EVALUATABLE_TERM_SET_VARIABLE, variableName, OrderConstraint.ANY, new Constant("0")); + } + + public MetaEvaluatableTermSet(Variable variableName, Expression order) { + super(new Symbol(":", 1), MetaRDLTerm.TermType.META_EVALUATABLE_TERM_SET_VARIABLE, variableName, OrderConstraint.EQ, order); + } + +} diff --git a/src/main/java/models/terms/meta/MetaEvaluatableTermVariable.java b/src/main/java/models/terms/meta/MetaEvaluatableTermVariable.java new file mode 100644 index 0000000..dd049b4 --- /dev/null +++ b/src/main/java/models/terms/meta/MetaEvaluatableTermVariable.java @@ -0,0 +1,35 @@ +package models.terms.meta; + +import models.algebra.Constant; +import models.algebra.Expression; +import models.algebra.Symbol; +import models.algebra.Variable; +import models.terms.LinearRightNormalizedType; + +public class MetaEvaluatableTermVariable extends MetaVariable { + + public MetaEvaluatableTermVariable(Variable variableName, OrderConstraint constraint, Expression order) { + super(new Symbol(":", 2), MetaRDLTerm.TermType.META_EVALUATABLE_TERM_VARIABLE, variableName, constraint, order); + } + + public MetaEvaluatableTermVariable(Variable variableName) { + super(new Symbol(":", 2), MetaRDLTerm.TermType.META_EVALUATABLE_TERM_VARIABLE, variableName, OrderConstraint.ANY, new Constant("0")); + } + + public MetaEvaluatableTermVariable(Variable variableName, Expression order) { + super(new Symbol(":", 2), MetaRDLTerm.TermType.META_EVALUATABLE_TERM_VARIABLE, variableName, OrderConstraint.EQ, order); + } + + public MetaEvaluatableTermVariable(Variable variableName, OrderConstraint constraint, Expression order, LinearRightNormalizedType linearRIghtNormalizedType) { + super(new Symbol(":", 2), MetaRDLTerm.TermType.META_EVALUATABLE_TERM_VARIABLE, variableName, constraint, order, linearRIghtNormalizedType); + } + + public MetaEvaluatableTermVariable(Variable variableName, LinearRightNormalizedType linearRIghtNormalizedType) { + super(new Symbol(":", 2), MetaRDLTerm.TermType.META_EVALUATABLE_TERM_VARIABLE, variableName, OrderConstraint.ANY, new Constant("0"), linearRIghtNormalizedType); + } + + public MetaEvaluatableTermVariable(Variable variableName, Expression order, LinearRightNormalizedType linearRIghtNormalizedType) { + super(new Symbol(":", 2), MetaRDLTerm.TermType.META_EVALUATABLE_TERM_VARIABLE, variableName, OrderConstraint.EQ, order, linearRIghtNormalizedType); + } + +} diff --git a/src/main/java/models/terms/meta/MetaRDLTerm.java b/src/main/java/models/terms/meta/MetaRDLTerm.java new file mode 100644 index 0000000..2072bd5 --- /dev/null +++ b/src/main/java/models/terms/meta/MetaRDLTerm.java @@ -0,0 +1,344 @@ +package models.terms.meta; + +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; + +import exceptions.IllegalTypeException; +import exceptions.SubstituteFailedException; +import lombok.Getter; +import models.algebra.Symbol; +import models.algebra.Variable; +import models.terms.Dependency; +import models.terms.DependencyTerm; +import models.terms.EvaluatableTerm; +import models.terms.LinearRightNormalizedType; +import models.terms.RDLTerm; +import models.terms.Resource; +import models.terms.SetEvaluatableTerm; + +@Getter +public class MetaRDLTerm extends RDLTerm { + + protected TermType termType; + protected LinearRightNormalizedType linearRightNormalizedType = LinearRightNormalizedType.UNDEFINED; + + protected MetaRDLTerm(Symbol symbol, TermType termType, int size) { + super(symbol, -1, size); + this.termType = termType; + if (isResourceVariable()) { + linearRightNormalizedType = LinearRightNormalizedType.LINEAR_RIGHT_NORMALIZED; + } + } + + //dependency + public MetaRDLTerm(RDLTerm dependingTerm, MetaResource dependedVariable) { + super(new Symbol(":", 2), dependedVariable.getOrder(), dependingTerm.getSize() + dependedVariable.getSize()); + addChild(dependingTerm); + addChild(dependedVariable); + this.termType = TermType.META_DEPENDENCY; + } + + public MetaRDLTerm(MetaRDLTerm dependingTerm, Resource dependedVariable) { + super(new Symbol(":", 2), dependedVariable.getOrder(), dependingTerm.getSize() + dependedVariable.getSize()); + addChild(dependingTerm); + addChild(dependedVariable); + this.termType = TermType.META_DEPENDENCY; + } + + public MetaRDLTerm(MetaRDLTerm dependingTerm, MetaResource dependedVariable) { + super(new Symbol(":", 2), dependedVariable.getOrder(), dependingTerm.getSize() + dependedVariable.getSize()); + addChild(dependingTerm); + addChild(dependedVariable); + this.termType = TermType.META_DEPENDENCY; + } + + //list type dependency or set term + public MetaRDLTerm(MetaRDLTerm term) { + super(new Symbol(":", 1), term.getOrder() - 1, term.getSize()); + if (term.isDependency()) { + this.termType = TermType.META_DEPENDENCY_LIST; + } else if (term.isEvaluatableTerm()) { + this.termType = TermType.META_EVALUATABLE_TERM_SET; + } + addChild(term); + } + + //dependency term + public MetaRDLTerm(MetaRDLTerm dependingTerm, MetaResource dependedVariable, MetaRDLTerm argumentTerm) { + super(new Symbol(":", 3), -1, dependingTerm.getSize() + dependedVariable.getSize() + argumentTerm.getSize()); + if (! EvaluatableTerm.class.isAssignableFrom(dependingTerm.getTermType().getBaseTermClass())) { + throw new IllegalTypeException(); + } + if(! EvaluatableTerm.class.isAssignableFrom(argumentTerm.getTermType().getBaseTermClass())) { + throw new IllegalTypeException(); + } + addChild(dependingTerm); + addChild(dependedVariable); + addChild(argumentTerm); + this.termType = TermType.META_DEPENDENCY_TERM; + } + + public MetaRDLTerm(EvaluatableTerm dependingTerm, MetaRDLTerm dependedVariable, MetaRDLTerm argumentTerm) { + super(new Symbol(":", 3), -1, dependingTerm.getSize() + dependedVariable.getSize() + argumentTerm.getSize()); + if(! EvaluatableTerm.class.isAssignableFrom(argumentTerm.getTermType().getBaseTermClass())) { + throw new IllegalTypeException(); + } + addChild(dependingTerm); + addChild(dependedVariable); + addChild(argumentTerm); + this.termType = TermType.META_DEPENDENCY_TERM; + } + + public MetaRDLTerm(MetaRDLTerm dependingTerm, Resource dependedVariable, MetaRDLTerm argumentTerm) { + super(new Symbol(":", 3), -1, dependingTerm.getSize() + dependedVariable.getSize() + argumentTerm.getSize()); + if (! EvaluatableTerm.class.isAssignableFrom(dependingTerm.getTermType().getBaseTermClass())) { + throw new IllegalTypeException(); + } + if(! EvaluatableTerm.class.isAssignableFrom(argumentTerm.getTermType().getBaseTermClass())) { + throw new IllegalTypeException(); + } + addChild(dependingTerm); + addChild(dependedVariable); + addChild(argumentTerm); + this.termType = TermType.META_DEPENDENCY_TERM; + } + + public MetaRDLTerm(MetaRDLTerm dependingTerm, MetaRDLTerm dependedVariable, EvaluatableTerm argumentTerm) { + super(new Symbol(":", 3), -1, dependingTerm.getSize() + dependedVariable.getSize() + argumentTerm.getSize()); + if (! EvaluatableTerm.class.isAssignableFrom(dependingTerm.getTermType().getBaseTermClass())) { + throw new IllegalTypeException(); + } + addChild(dependingTerm); + addChild(dependedVariable); + addChild(argumentTerm); + this.termType = TermType.META_DEPENDENCY_TERM; + } + + public MetaRDLTerm(MetaRDLTerm dependingTerm, Resource dependedVariable, EvaluatableTerm argumentTerm) { + super(new Symbol(":", 3), -1, dependingTerm.getSize() + dependedVariable.getSize() + argumentTerm.getSize()); + if (! EvaluatableTerm.class.isAssignableFrom(dependingTerm.getTermType().getBaseTermClass())) { + throw new IllegalTypeException(); + } + addChild(dependingTerm); + addChild(dependedVariable); + addChild(argumentTerm); + this.termType = TermType.META_DEPENDENCY_TERM; + } + + public MetaRDLTerm(EvaluatableTerm dependingTerm, MetaResource dependedVariable, EvaluatableTerm argumentTerm) { + super(new Symbol(":", 3), -1, dependingTerm.getSize() + dependedVariable.getSize() + argumentTerm.getSize()); + addChild(dependingTerm); + addChild(dependedVariable); + addChild(argumentTerm); + this.termType = TermType.META_DEPENDENCY_TERM; + } + + public MetaRDLTerm(EvaluatableTerm dependingTerm, Resource dependedVariable, MetaRDLTerm argumentTerm) { + super(new Symbol(":", 3), -1, dependingTerm.getSize() + dependedVariable.getSize() + argumentTerm.getSize()); + if(! EvaluatableTerm.class.isAssignableFrom(argumentTerm.getTermType().getBaseTermClass())) { + throw new IllegalTypeException(); + } + addChild(dependingTerm); + addChild(dependedVariable); + addChild(argumentTerm); + this.termType = TermType.META_DEPENDENCY_TERM; + } + + public RDLTerm substitute(Map binding) { + if (isDependency()) { + RDLTerm dependingTerm = (RDLTerm) getChild(0); + RDLTerm dependedVariable = (RDLTerm) getChild(1); + if (dependingTerm instanceof MetaRDLTerm) { + dependingTerm = ((MetaRDLTerm) dependingTerm).substitute(binding); + } + if (dependedVariable instanceof MetaRDLTerm) { + dependedVariable = ((MetaRDLTerm) dependedVariable).substitute(binding); + } + if (dependedVariable instanceof Resource) { + return new Dependency(dependingTerm, (Resource) dependedVariable); + } + } + else if (isDependencyTerm()) { + RDLTerm dependingTerm = (RDLTerm) getChild(0); + RDLTerm dependedVariable = (RDLTerm) getChild(1); + RDLTerm argumentTerm = (RDLTerm) getChild(2); + if (dependingTerm instanceof MetaRDLTerm) { + dependingTerm = ((MetaRDLTerm) dependingTerm).substitute(binding); + } + if (dependedVariable instanceof MetaRDLTerm) { + dependedVariable = ((MetaRDLTerm) dependedVariable).substitute(binding); + } + if (argumentTerm instanceof MetaRDLTerm) { + argumentTerm = ((MetaRDLTerm) argumentTerm).substitute(binding); + } + return new DependencyTerm((EvaluatableTerm) dependingTerm, (Resource) dependedVariable, (EvaluatableTerm) argumentTerm); + } else if (isSetTerm()) { + RDLTerm term = (RDLTerm) getChild(0); + if (term instanceof MetaRDLTerm) { + term = ((MetaRDLTerm) term).substitute(binding); + } + return new SetEvaluatableTerm((EvaluatableTerm) term); + } + throw new SubstituteFailedException(); + } + + public boolean isVariable() { + return false; + } + + public boolean isMatchedBy(RDLTerm another) { + return isMatchedBy(another, new HashMap<>(), new HashMap<>()); + } + + public boolean isMatchedBy(RDLTerm another, Map binding, Map orderConstraint) { + if (! another.getClass().isAssignableFrom(this.termType.getBaseTermClass())) { + return false; + } + if (this.getChildren().size() != another.getChildren().size()) { + return false; + } + if (isDependencyTerm() && (! islinearRightNormalizedMatchedBy(another))) { + return false; + } + for (int i = 0; i < this.getChildren().size(); i++) { + RDLTerm child = (RDLTerm) this.getChild(i); + RDLTerm anotherChild = (RDLTerm) another.getChild(i); + if (child instanceof MetaRDLTerm) { + MetaRDLTerm metaChild = (MetaRDLTerm) child; + if (! metaChild.isMatchedBy(anotherChild, binding, orderConstraint)) { + return false; + } + } else { + if (!(child.equals(anotherChild))) { + return false; + } + } + } + return true; + } + + public boolean checkTermType(Class clazz) { + return clazz.isAssignableFrom(termType.getBaseTermClass()); + } + + public boolean isDependency() { + return checkTermType(Dependency.class); + } + + public boolean isEvaluatableTerm() { + return checkTermType(EvaluatableTerm.class); + } + + public boolean isDependencyTerm() { + return checkTermType(DependencyTerm.class); + } + + public boolean isSetTerm() { + return checkTermType(SetEvaluatableTerm.class); + } + + public boolean isResourceVariable() { + return checkTermType(Resource.class); + } + + public void setLinearRightNormalizedType(LinearRightNormalizedType next) { + if (isDependency()) { + return; + } + this.linearRightNormalizedType = next; + } + + public Collection getAllVariables() { + return getSubTerms(MetaVariable.class).values(); + } + + protected boolean islinearRightNormalizedMatchedBy(RDLTerm another) { + if (linearRightNormalizedType != LinearRightNormalizedType.UNDEFINED) { + if (another instanceof DependencyTerm) { + if (((DependencyTerm) another).getLinearRightNormalizedType() != linearRightNormalizedType) { + return false; + } + } + else if (another instanceof MetaRDLTerm) { + if (((MetaRDLTerm) another).getLinearRightNormalizedType() != linearRightNormalizedType) { + return false; + } + } + } + return true; + } + + @Override + public String toString() { + switch(termType) { + case META_DEPENDENCY: + return "[" + getChild(0).toString() + " : " + getChild(1).toString() + "]"; + case META_DEPENDENCY_LIST: + return "[" + getChild(0).toString() + "]"; + case META_DEPENDENCY_TERM: + return "[" + getChild(0).toString() + " : " + getChild(1).toString() + " -> " + getChild(2).toString() + "]"; + case META_EVALUATABLE_TERM_SET: + return "{" + getChild(0).toString() + "}"; + default: + return ""; + } + } + + @Override + public String toStringWithOrder() { + switch(termType) { + case META_DEPENDENCY: + return "[" + ((RDLTerm) getChild(0)).toStringWithOrder() + " : " + ((RDLTerm) getChild(1)).toStringWithOrder() + "]"; + case META_DEPENDENCY_LIST: + return "[" + ((RDLTerm) getChild(0)).toStringWithOrder() + "]"; + case META_DEPENDENCY_TERM: + return "[" + ((RDLTerm) getChild(0)).toStringWithOrder() + " : " + + ((RDLTerm) getChild(1)).toStringWithOrder() + " -> " + ((RDLTerm) getChild(2)).toStringWithOrder() + "]"; + default: + return ""; + } + } + + @Override + public boolean equals(Object another) { + if(! (another instanceof MetaRDLTerm)) { + return false; + } + MetaRDLTerm anotherTerm = (MetaRDLTerm) another; + return super.equals(another) && termType == anotherTerm.getTermType(); + } + + @Override + public int hashCode() { + return (termType.toString() + toStringWithOrder()).hashCode(); + } + + @Override + public Object clone() { + + return null; + } + + protected static enum TermType { + META_RDL_TERM(RDLTerm.class), + META_DEPENDENCY(Dependency.class), + META_DEPENDENCY_LIST(Dependency.class), + META_DEPENDENCY_VARIABLE(Dependency.class), + META_DEPENDENCY_TERM(DependencyTerm.class), + META_DEPENDENCY_TERM_VARIABLE(DependencyTerm.class), + META_EVALUATABLE_TERM_VARIABLE(EvaluatableTerm.class), + META_EVALUATABLE_TERM_SET(SetEvaluatableTerm.class), + META_EVALUATABLE_TERM_SET_VARIABLE(SetEvaluatableTerm.class), + META_RESOURCE_VARIABLE(Resource.class); + + @Getter + private Class baseTermClass; + + private TermType(Class clazz) { + this.baseTermClass = clazz; + } + + } + +} diff --git a/src/main/java/models/terms/meta/MetaRDLTermVariable.java b/src/main/java/models/terms/meta/MetaRDLTermVariable.java new file mode 100644 index 0000000..1205c21 --- /dev/null +++ b/src/main/java/models/terms/meta/MetaRDLTermVariable.java @@ -0,0 +1,22 @@ +package models.terms.meta; + +import models.algebra.Constant; +import models.algebra.Expression; +import models.algebra.Symbol; +import models.algebra.Variable; + +public class MetaRDLTermVariable extends MetaVariable { + + public MetaRDLTermVariable(Variable variableName, OrderConstraint constraint, Expression order) { + super(new Symbol("", -1), MetaRDLTerm.TermType.META_RDL_TERM, variableName, constraint, order); + } + + public MetaRDLTermVariable(Variable variableName) { + super(new Symbol("", -1), MetaRDLTerm.TermType.META_RDL_TERM, variableName, OrderConstraint.ANY, new Constant("0")); + } + + public MetaRDLTermVariable(Variable variableName, Expression order) { + super(new Symbol("", -1), MetaRDLTerm.TermType.META_RDL_TERM, variableName, OrderConstraint.EQ, order); + } + +} diff --git a/src/main/java/models/terms/meta/MetaResource.java b/src/main/java/models/terms/meta/MetaResource.java new file mode 100644 index 0000000..d28b163 --- /dev/null +++ b/src/main/java/models/terms/meta/MetaResource.java @@ -0,0 +1,50 @@ +package models.terms.meta; + +import java.util.Map; + +import lombok.Getter; +import models.algebra.Constant; +import models.algebra.Expression; +import models.algebra.Symbol; +import models.algebra.Variable; +import models.terms.RDLTerm; +import models.terms.ResourceConstant; +import models.terms.Resource; + +@Getter +public class MetaResource extends MetaVariable { + + public MetaResource(Variable variableName, OrderConstraint constraint, Expression order) { + super(new Symbol("", 0), MetaRDLTerm.TermType.META_RESOURCE_VARIABLE, variableName, constraint, order); + } + + public MetaResource(Variable variableName) { + super(new Symbol("", 0), MetaRDLTerm.TermType.META_RESOURCE_VARIABLE, variableName, OrderConstraint.ANY, new Constant("0")); + } + + public MetaResource(Variable variableName, Expression order) { + super(new Symbol("", 0), MetaRDLTerm.TermType.META_RESOURCE_VARIABLE, variableName, OrderConstraint.EQ, order); + } + + @Override + public boolean isMatchedBy(RDLTerm another, Map binding, + Map orderConstraint) { + if ((! (another instanceof Resource)) && (! (another instanceof ResourceConstant))) { + return false; + } + + if (! orderConstraintCheck(another, orderConstraint)) { + return false; + } + + if (! islinearRightNormalizedMatchedBy(another)) { + return false; + } + + if (! binding.containsKey(this.variableName)) { + binding.put(this.variableName, another); + return true; + } + return binding.get(this.variableName).equals(another); + } +} diff --git a/src/main/java/models/terms/meta/MetaVariable.java b/src/main/java/models/terms/meta/MetaVariable.java new file mode 100644 index 0000000..804f1c2 --- /dev/null +++ b/src/main/java/models/terms/meta/MetaVariable.java @@ -0,0 +1,189 @@ +package models.terms.meta; + +import java.util.HashMap; +import java.util.Map; + +import exceptions.CoefficientNotOneException; +import exceptions.SubstituteFailedException; +import exceptions.TooManyVariablesException; +import lombok.Getter; +import models.algebra.Expression; +import models.algebra.Symbol; +import models.algebra.Variable; +import models.terms.LinearRightNormalizedType; +import models.terms.RDLTerm; +import utils.ExpressionUitls; + +@Getter +public abstract class MetaVariable extends MetaRDLTerm { + + protected Variable variableName; + protected OrderConstraint constraint; + protected Variable orderVariable; + protected int orderConstant; + protected Expression orderExpression; + + protected MetaVariable(Symbol symbol, TermType termType, Variable name, OrderConstraint constraint, Expression order) { + super(symbol, termType, 1); + this.variableName = name; + this.constraint = constraint; + this.orderExpression = order; + Map coefficients = new HashMap<>(); + int constant = ExpressionUitls.getCoefficientAndConstantsFromExpression(order, coefficients, 1); + if (coefficients.size() > 1) { + // todo: create exception + throw new TooManyVariablesException("Too many variables"); + } + if (coefficients.size() == 1) { + orderVariable = coefficients.keySet().iterator().next(); + if (coefficients.get(orderVariable) != 1) { + throw new CoefficientNotOneException(); + } + } else { + orderVariable = null; + } + orderConstant = constant; + } + + protected MetaVariable(Symbol symbol, TermType termType, Variable name, OrderConstraint constraint, Expression order, LinearRightNormalizedType linearRIghtNormalizedType) { + super(symbol, termType, 1); + this.variableName = name; + this.constraint = constraint; + this.orderExpression = order; + Map coefficients = new HashMap<>(); + int constant = ExpressionUitls.getCoefficientAndConstantsFromExpression(order, coefficients, 1); + if (coefficients.size() > 1) { + // todo: create exception + throw new TooManyVariablesException("Too many variables"); + } + if (coefficients.size() == 1) { + orderVariable = coefficients.keySet().iterator().next(); + if (coefficients.get(orderVariable) != 1) { + throw new CoefficientNotOneException(); + } + } else { + orderVariable = null; + } + orderConstant = constant; + this.linearRightNormalizedType = linearRIghtNormalizedType; + } + + @Override + public boolean isVariable() { + return true; + } + + @Override + public boolean isMatchedBy(RDLTerm another, Map binding, + Map orderConstraint) { + if (! this.termType.getBaseTermClass().isAssignableFrom(another.getClass())) { + return false; + } + + if (! orderConstraintCheck(another, orderConstraint)) { + return false; + } + + if (! islinearRightNormalizedMatchedBy(another)) { + return false; + } + + if (! binding.containsKey(this.variableName)) { + binding.put(this.variableName, another); + return true; + } + return binding.get(this.variableName).equals(another); + } + + @Override + public RDLTerm substitute(Map binding) { + if (binding.containsKey(variableName)) { + return binding.get(variableName); + } + throw new SubstituteFailedException(); + } + + protected boolean orderConstraintCheck(RDLTerm another, Map orderConstraints) { + if (orderVariable == null) { + switch (constraint) { + case ANY: + return true; + case EQ: + return another.getOrder() == orderConstant; + case GE: + return another.getOrder() >= orderConstant; + case GT: + return another.getOrder() > orderConstant; + case LE: + return another.getOrder() <= orderConstant; + case LT: + return another.getOrder() < orderConstant; + } + } else { + if (! orderConstraints.containsKey(orderVariable)) { + orderConstraints.put(orderVariable, new OrderVariableConstraint()); + } + var orderVarConst = orderConstraints.get(orderVariable); + return orderVarConst.setConstraint(another.getOrder() - orderConstant, constraint); + } + return false; + } + + + + + @Override + public String toString() { + return variableName.toString(); + } + + @Override + public String toStringWithOrder() { + return toString() +getOrderString(); + } + + protected String getOrderString() { + switch(constraint) { + case ANY: + return "(*)"; + case EQ: + return "(= " + orderExpression.toString() + ")"; + case GE: + return "(>= " + orderExpression.toString() + ")"; + case GT: + return "(> " + orderExpression.toString() + ")"; + case LE: + return "(<= " + orderExpression.toString() + ")"; + case LT: + return "(< " + orderExpression.toString() + ")"; + } + return ""; + } + + @Override + public boolean equals(Object another) { + if (another instanceof MetaVariable) { + return false; + } + MetaVariable anotherVar = (MetaVariable) another; + return super.equals(another) + && variableName.equals(another) + && constraint == anotherVar.getConstraint() + && orderVariable.equals(anotherVar.getOrderVariable()) + && orderConstant == anotherVar.getOrderConstant(); + } + + @Override + public int hashCode() { + return (termType.name() + toString()).hashCode(); + } + + @Override + public Object clone() { + // TODO 自動生成されたメソッド・スタブ + return super.clone(); + } + + + +} diff --git a/src/main/java/models/terms/meta/OrderConstraint.java b/src/main/java/models/terms/meta/OrderConstraint.java new file mode 100644 index 0000000..fbd7320 --- /dev/null +++ b/src/main/java/models/terms/meta/OrderConstraint.java @@ -0,0 +1,22 @@ +package models.terms.meta; + +public enum OrderConstraint { + + EQ("=="), + LT("<"), + LE("<="), + GT(">"), + GE(">="), + ANY(""); + + private final String operator; + + private OrderConstraint(String operator) { + this.operator = operator; + } + + public String getOperator() { + return this.operator; + } + +} diff --git a/src/main/java/models/terms/meta/OrderVariableConstraint.java b/src/main/java/models/terms/meta/OrderVariableConstraint.java new file mode 100644 index 0000000..7a80c79 --- /dev/null +++ b/src/main/java/models/terms/meta/OrderVariableConstraint.java @@ -0,0 +1,71 @@ +package models.terms.meta; + +import lombok.Getter; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@Getter +public class OrderVariableConstraint implements Cloneable{ + + // lower <= x <= upper + private int upper = 100000000; + private int lower = -1; + private boolean isOk = true; + + public boolean setConstraint(int value, OrderConstraint constraint) { + switch (constraint) { + case ANY: + return true; + case EQ: + return setEq(value); + case GE: + return setUpper(value); + case GT: + return setUpper(value - 1); + case LE: + return setLower(value); + case LT: + return setLower(value + 1); + } + return false; + } + + public int getOrder() { + if (isOk) { + return lower; + } + return -1; + } + + private boolean setEq(int eq) { + return setUpper(eq) && setLower(eq); + } + + private boolean setUpper(int upper) { + if (isOk && this.lower <= upper && upper <= this.upper) { + this.upper = upper; + return true; + } + isOk = false; + return false; + } + + private boolean setLower(int lower) { + if (isOk && this.lower <= lower && lower <= this.upper) { + this.lower = lower; + return true; + } + isOk = false; + return false; + } + + @Override + public Object clone() { + OrderVariableConstraint constraint = new OrderVariableConstraint(); + constraint.isOk = isOk; + constraint.lower = lower; + constraint.upper = upper; + return constraint; + } + +} diff --git a/src/main/java/utils/DynamicDisjointSetUnion.java b/src/main/java/utils/DynamicDisjointSetUnion.java new file mode 100644 index 0000000..06cc58e --- /dev/null +++ b/src/main/java/utils/DynamicDisjointSetUnion.java @@ -0,0 +1,66 @@ +package utils; + +import java.util.HashMap; +import java.util.Map; + +public class DynamicDisjointSetUnion { + + private Map parent; + private Map size; + + public DynamicDisjointSetUnion() { + parent = new HashMap<>(); + size = new HashMap<>(); + } + + public void add(T x) { + if (! parent.containsKey(x)) { + parent.put(x, x); + size.put(x, 1); + } + } + + public T find(T x) { + if (! parent.containsKey(x)) { + throw new RuntimeException(x.toString() + " does not exist"); + } + + if (! parent.get(x).equals(x)) { + parent.put(x, find(parent.get(x))); + } + return parent.get(x); + } + + public void union(T x, T y) { + add(x); + add(y); + + T rx = find(x); + T ry = find(y); + + if (rx.equals(ry)) { + return; + } + + if (size.get(rx) < size.get(ry)) { + T tmp = rx; + rx = ry; + ry = tmp; + } + + parent.put(ry, rx); + size.put(rx, size.get(rx) + size.get(ry)); + } + + public boolean same(T x, T y) { + if ((! parent.containsKey(x)) || (! parent.containsKey(y))) { + return false; + } + return find(x).equals(find(y)); + } + + public int componentSize(T x) { + return size.get(x); + } + +} diff --git a/src/main/java/utils/ExpressionUitls.java b/src/main/java/utils/ExpressionUitls.java new file mode 100644 index 0000000..7981932 --- /dev/null +++ b/src/main/java/utils/ExpressionUitls.java @@ -0,0 +1,71 @@ +package utils; + +import java.util.Map; + +import exceptions.NonLinearExpressionException; +import models.algebra.Constant; +import models.algebra.Expression; +import models.algebra.Symbol; +import models.algebra.Term; +import models.algebra.Variable; +import models.dataConstraintModel.DataConstraintModel; + +public class ExpressionUitls { + + + public static int getCoefficientAndConstantsFromExpression(Expression expression, Map coefficients, int curWeight) { + int res = 0; + if(expression instanceof Constant) { + return getConstantValue((Constant) expression) * curWeight; + } else if(expression instanceof Variable) { + coefficients.put((Variable) expression, coefficients.getOrDefault((Variable) expression, 0) + curWeight); + return 0; + } + Term term = (Term) expression; + Symbol symbol = term.getSymbol(); + if(symbol.equals(DataConstraintModel.add)) { + Expression c1 = term.getChild(0); + Expression c2 = term.getChild(1); + res += getCoefficientAndConstantsFromExpression(c1, coefficients, curWeight); + res += getCoefficientAndConstantsFromExpression(c2, coefficients, curWeight); + } else if(symbol.equals(DataConstraintModel.sub)) { + Expression c1 = term.getChild(0); + Expression c2 = term.getChild(1); + res += getCoefficientAndConstantsFromExpression(c1, coefficients, curWeight); + res += getCoefficientAndConstantsFromExpression(c2, coefficients, -curWeight); + } else if(symbol.equals(DataConstraintModel.mul)) { + Expression c1 = term.getChild(0); + Expression c2 = term.getChild(1); + if(c1.getVariables().size() == 0 && c2.getVariables().size() == 0) { + res += getCoefficientAndConstantsFromExpression(c1, coefficients, curWeight) * + getCoefficientAndConstantsFromExpression(c2, coefficients, curWeight); + } else if(c1.getVariables().size() == 0) { + res += getCoefficientAndConstantsFromExpression( + c2, + coefficients, + getCoefficientAndConstantsFromExpression(c1, coefficients, curWeight) + ); + } else if(c2.getVariables().size() == 0){ + res += getCoefficientAndConstantsFromExpression( + c1, + coefficients, + getCoefficientAndConstantsFromExpression(c2, coefficients, curWeight) + ); + } else { + throw new NonLinearExpressionException("Order expression must be linear expression."); + } + } else if(symbol.equals(DataConstraintModel.minus)) { + Expression c1 = term.getChild(0); + res += getCoefficientAndConstantsFromExpression(c1, coefficients, -curWeight); + } else { + throw new NonLinearExpressionException("Order expression must be linear expression."); + } + return res; + + } + + public static int getConstantValue(Constant constant) { + return Integer.parseInt((String) constant.getValue()); + } + +} diff --git a/src/main/java/utils/Permutation.java b/src/main/java/utils/Permutation.java new file mode 100644 index 0000000..039b9f9 --- /dev/null +++ b/src/main/java/utils/Permutation.java @@ -0,0 +1,33 @@ +package utils; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +public class Permutation { + + public static List> permutation(Collection list, int n) { + List> res = new ArrayList<>(); + permutation(list, n, new ArrayList<>(), new HashSet<>(), res); + return res; + } + + private static void permutation(Collection all, int n, List current, Set used, List> result) { + if (current.size() == n) { + result.add(new ArrayList<>(current)); + return; + } + for (T elem : all) { + if (! used.contains(elem)) { + current.add(elem); + used.add(elem); + permutation(all, n, current, used, result); + current.remove(current.size() - 1); + used.remove(elem); + } + } + } + +} diff --git a/src/main/java/utils/Product.java b/src/main/java/utils/Product.java new file mode 100644 index 0000000..89238fb --- /dev/null +++ b/src/main/java/utils/Product.java @@ -0,0 +1,37 @@ +package utils; + +import java.util.ArrayList; +import java.util.List; + +public class Product { + + public static List> product(List> lists) { + List> result = new ArrayList<>(); + + if (lists == null || lists.isEmpty()) { + return result; + } + + backtrack(lists, result, 0, new ArrayList<>()); + return result; + } + + private static void backtrack( + List> lists, + List> result, + int depth, + List current) { + + if (depth == lists.size()) { + result.add(new ArrayList<>(current)); + return; + } + + for (T element : lists.get(depth)) { + current.add(element); + backtrack(lists, result, depth + 1, current); + current.remove(current.size() - 1); + } + } + +} diff --git a/src/models/formulas/DependencyFormula.java b/src/models/formulas/DependencyFormula.java deleted file mode 100644 index 269aafd..0000000 --- a/src/models/formulas/DependencyFormula.java +++ /dev/null @@ -1,41 +0,0 @@ -package models.formulas; - -import lombok.Getter; -import models.terms.Dependency; -import models.terms.RDLTerm; -import models.terms.Resource; - -@Getter -public class DependencyFormula extends Formula { - - private Dependency dependency; - - public DependencyFormula(Dependency dependency) { - this.dependency = dependency; - } - - public DependencyFormula(RDLTerm dependingTerm, Resource dependedVariable) { - this.dependency = new Dependency(dependingTerm, dependedVariable); - } - - - @Override - public String toString() { - return dependency.toString(); - } - - @Override - public boolean equals(Object another) { - if(! (another instanceof DependencyFormula)) { - return false; - } - DependencyFormula anotherFormula = (DependencyFormula) another; - return dependency.equals(anotherFormula.getDependency()); - } - - @Override - public int hashCode() { - return ("DF" + toString()).hashCode(); - } - -} diff --git a/src/models/formulas/EquationFormula.java b/src/models/formulas/EquationFormula.java deleted file mode 100644 index 4ed83f6..0000000 --- a/src/models/formulas/EquationFormula.java +++ /dev/null @@ -1,41 +0,0 @@ -package models.formulas; - -import lombok.Getter; -import models.terms.EvaluatableTerm; - -@Getter -public class EquationFormula extends Formula { - - private EvaluatableTerm leftSideHand; - private EvaluatableTerm rightSideHand; - - public EquationFormula(EvaluatableTerm leftTerm, EvaluatableTerm rightTerm) { - this.leftSideHand = leftTerm; - this.rightSideHand = rightTerm; - } - - public EquationFormula linearRightNormalized() { - return new EquationFormula(leftSideHand.linearRightNormalize(), rightSideHand.linearRightNormalize()); - } - - - @Override - public String toString() { - return leftSideHand.toString() + " = " + rightSideHand.toString(); - } - - @Override - public boolean equals(Object another) { - if (! (another instanceof EquationFormula)) { - return false; - } - EquationFormula anotherFormula = (EquationFormula) another; - return leftSideHand.equals(anotherFormula.getLeftSideHand()) && rightSideHand.equals(anotherFormula.getRightSideHand()); - } - - @Override - public int hashCode() { - return toString().hashCode(); - } - -} diff --git a/src/models/formulas/Formula.java b/src/models/formulas/Formula.java deleted file mode 100644 index f1813f4..0000000 --- a/src/models/formulas/Formula.java +++ /dev/null @@ -1,9 +0,0 @@ -package models.formulas; - -public abstract class Formula { - - public abstract String toString(); - public abstract boolean equals(Object another); - public abstract int hashCode(); - -} diff --git a/src/models/formulas/InFormula.java b/src/models/formulas/InFormula.java deleted file mode 100644 index 7b95536..0000000 --- a/src/models/formulas/InFormula.java +++ /dev/null @@ -1,36 +0,0 @@ -package models.formulas; - -import lombok.Getter; -import models.terms.EvaluatableTerm; - -@Getter -public class InFormula extends Formula { - - private EvaluatableTerm leftSideHand; - private EvaluatableTerm rightSideHand; - - public InFormula(EvaluatableTerm leftSideHand, EvaluatableTerm rightSideHand) { - this.leftSideHand = leftSideHand; - this.rightSideHand = rightSideHand; - } - - @Override - public String toString() { - return leftSideHand.toString() + " in " + rightSideHand.toString(); - } - - @Override - public boolean equals(Object another) { - if (! (another instanceof InFormula)) { - return false; - } - InFormula formula = (InFormula) another; - return leftSideHand.equals(formula.getLeftSideHand()) && rightSideHand.equals(formula.getRightSideHand()); - } - - @Override - public int hashCode() { - return toString().hashCode(); - } - -} diff --git a/src/models/formulas/Then.java b/src/models/formulas/Then.java deleted file mode 100644 index 6466300..0000000 --- a/src/models/formulas/Then.java +++ /dev/null @@ -1,33 +0,0 @@ -package models.formulas; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -@Getter -@AllArgsConstructor -public class Then extends Formula { - - private Formula condition; - private Formula result; - - - @Override - public String toString() { - return condition.toString() + " => " + result.toString(); - } - - @Override - public int hashCode() { - return toString().hashCode(); - } - - @Override - public boolean equals(Object another) { - if (! (another instanceof Then)) { - return false; - } - Then then = (Then) another; - return this.condition.equals(then.getCondition()) && this.result.equals(then.getResult()); - } - -} diff --git a/src/models/formulas/meta/MetaDependencyFormula.java b/src/models/formulas/meta/MetaDependencyFormula.java deleted file mode 100644 index 68f9888..0000000 --- a/src/models/formulas/meta/MetaDependencyFormula.java +++ /dev/null @@ -1,71 +0,0 @@ -package models.formulas.meta; - -import java.util.Map; - -import exceptions.IllegalTypeException; -import lombok.Getter; -import models.algebra.Variable; -import models.formulas.DependencyFormula; -import models.formulas.Formula; -import models.terms.Dependency; -import models.terms.RDLTerm; -import models.terms.meta.MetaDependencyVariable; -import models.terms.meta.MetaRDLTerm; -import models.terms.meta.MetaResource; -import models.terms.meta.OrderVariableConstraint; - -@Getter -public class MetaDependencyFormula extends MetaFormula { - - private MetaRDLTerm dependency; - - public MetaDependencyFormula(MetaRDLTerm term) { - if (! term.isDependency()) { - throw new IllegalTypeException(); - } - this.dependency = term; - } - - public MetaDependencyFormula(MetaDependencyVariable dependency) { - this.dependency = dependency; - } - - public MetaDependencyFormula(MetaRDLTerm dependingTerm, MetaResource dependedVariable) { - this.dependency = new MetaRDLTerm(dependingTerm, dependedVariable); - } - - @Override - public boolean isMatchedBy(Formula formula, Map binding, - Map orderConstraint) { - if (! (formula instanceof DependencyFormula)) { - return false; - } - DependencyFormula dep = (DependencyFormula) formula; - return dependency.isMatchedBy(dep.getDependency(), binding, orderConstraint); - } - - - @Override - public DependencyFormula substitution(Map binding) { - return new DependencyFormula((Dependency) dependency.substitute(binding)); - } - - - - public String toString() { - return dependency.toString(); - } - - public boolean equals(Object another) { - if (! (another instanceof MetaDependencyFormula)) { - return false; - } - MetaDependencyFormula anohterFormula = (MetaDependencyFormula) another; - return dependency.equals(anohterFormula.getDependency()); - } - - public int hashCode() { - return ("MDF" + toString()).hashCode(); - } - -} diff --git a/src/models/formulas/meta/MetaEquationFormula.java b/src/models/formulas/meta/MetaEquationFormula.java deleted file mode 100644 index 7f27ff5..0000000 --- a/src/models/formulas/meta/MetaEquationFormula.java +++ /dev/null @@ -1,64 +0,0 @@ -package models.formulas.meta; - -import java.util.Map; - -import exceptions.IllegalTypeException; -import lombok.Getter; -import models.algebra.Variable; -import models.formulas.EquationFormula; -import models.formulas.Formula; -import models.terms.EvaluatableTerm; -import models.terms.RDLTerm; -import models.terms.meta.MetaRDLTerm; -import models.terms.meta.OrderVariableConstraint; - -@Getter -public class MetaEquationFormula extends MetaFormula { - - private MetaRDLTerm leftSideHand; - private MetaRDLTerm rightSideHand; - - public MetaEquationFormula(MetaRDLTerm left, MetaRDLTerm right) { - if (! left.isEvaluatableTerm()) { - throw new IllegalTypeException(); - } - if (! right.isEvaluatableTerm()) { - throw new IllegalTypeException(); - } - - this.leftSideHand = left; - this.rightSideHand = right; - } - - @Override - public boolean isMatchedBy(Formula formula, Map binding, - Map orderConstraint) { - if (! (formula instanceof EquationFormula)) { - return false; - } - EquationFormula eq = (EquationFormula) formula; - return leftSideHand.isMatchedBy(eq.getLeftSideHand(), binding, orderConstraint) && rightSideHand.isMatchedBy(eq.getRightSideHand(), binding, orderConstraint); - } - - @Override - public EquationFormula substitution(Map binding) { - return new EquationFormula((EvaluatableTerm) leftSideHand.substitute(binding), (EvaluatableTerm) rightSideHand.substitute(binding)); - } - - public String toString() { - return leftSideHand.toString() + " = " + rightSideHand.toString(); - } - - public boolean equals(Object another) { - if (! (another instanceof MetaEquationFormula)) { - return false; - } - MetaEquationFormula anohterFormula = (MetaEquationFormula) another; - return leftSideHand.equals(anohterFormula.getLeftSideHand()) && rightSideHand.equals(anohterFormula.getRightSideHand()); - } - - public int hashCode() { - return ("MEF" + toString()).hashCode(); - } - -} diff --git a/src/models/formulas/meta/MetaFormula.java b/src/models/formulas/meta/MetaFormula.java deleted file mode 100644 index 6115a2b..0000000 --- a/src/models/formulas/meta/MetaFormula.java +++ /dev/null @@ -1,25 +0,0 @@ -package models.formulas.meta; - -import java.util.HashMap; -import java.util.Map; - -import models.algebra.Variable; -import models.formulas.Formula; -import models.terms.RDLTerm; -import models.terms.meta.OrderVariableConstraint; - -public abstract class MetaFormula { - - public boolean isMatchedBy(Formula formula) { - return isMatchedBy(formula, new HashMap<>(), new HashMap<>()); - } - - public abstract boolean isMatchedBy(Formula formula, Map binding, Map orderConstraint); - - public abstract Formula substitution(Map binding); - - public abstract String toString(); - public abstract boolean equals(Object another); - public abstract int hashCode(); - -} diff --git a/src/models/formulas/meta/MetaInFormula.java b/src/models/formulas/meta/MetaInFormula.java deleted file mode 100644 index 900faff..0000000 --- a/src/models/formulas/meta/MetaInFormula.java +++ /dev/null @@ -1,68 +0,0 @@ -package models.formulas.meta; - -import java.util.Map; - -import exceptions.IllegalTypeException; -import lombok.Getter; -import models.algebra.Variable; -import models.formulas.Formula; -import models.formulas.InFormula; -import models.terms.EvaluatableTerm; -import models.terms.RDLTerm; -import models.terms.meta.MetaRDLTerm; -import models.terms.meta.OrderVariableConstraint; - -@Getter -public class MetaInFormula extends MetaFormula { - - private MetaRDLTerm leftSideHand; - private MetaRDLTerm rightSideHand; - - public MetaInFormula(MetaRDLTerm leftSideHand, MetaRDLTerm rightSideHand) { - if (! leftSideHand.isEvaluatableTerm()) { - throw new IllegalTypeException(); - } - if(! rightSideHand.isEvaluatableTerm()) { - throw new IllegalTypeException(); - } - this.leftSideHand = leftSideHand; - this.rightSideHand = rightSideHand; - } - - @Override - public boolean isMatchedBy(Formula formula, Map binding, - Map orderConstraint) { - if (! (formula instanceof InFormula)) { - return false; - } - InFormula inFormula = (InFormula) formula; - return leftSideHand.isMatchedBy(inFormula.getLeftSideHand(), binding, orderConstraint) - && rightSideHand.isMatchedBy(inFormula.getRightSideHand(), binding, orderConstraint); - } - - @Override - public InFormula substitution(Map binding) { - return new InFormula((EvaluatableTerm) leftSideHand.substitute(binding), (EvaluatableTerm) rightSideHand.substitute(binding)); - } - - - @Override - public String toString() { - return leftSideHand.toString() + " in " + rightSideHand.toString(); - } - - @Override - public boolean equals(Object anohter) { - if (! (anohter instanceof MetaInFormula)) { - return false; - } - MetaInFormula formula = (MetaInFormula) anohter; - return leftSideHand.equals(formula.getLeftSideHand()) && rightSideHand.equals(formula.getRightSideHand()); - } - - @Override - public int hashCode() { - return toString().hashCode(); - } - -} diff --git a/src/models/terms/Dependency.java b/src/models/terms/Dependency.java deleted file mode 100644 index eee07c7..0000000 --- a/src/models/terms/Dependency.java +++ /dev/null @@ -1,140 +0,0 @@ -package models.terms; - -import lombok.Getter; -import models.algebra.Symbol; - -@Getter -public class Dependency extends RDLTerm{ - - private RDLTerm dependingTerm; - private Resource dependedVariable; - private Dependency dependency; - private boolean isListType; - - public Dependency(RDLTerm dependingTerm, Resource dependedVariable) { - super(new Symbol(":", 2), dependedVariable.getOrder(), dependingTerm.getSize() + dependedVariable.getSize()); - this.dependingTerm = dependingTerm; - this.dependedVariable = dependedVariable; - this.dependency = null; - this.addChild(dependingTerm); - this.addChild(dependedVariable); - this.isListType = false; - } - - public Dependency(Dependency dependency) { - super(new Symbol(":", 1), dependency.getOrder() - 1, dependency.getSize()); - this.dependency = dependency; - this.dependingTerm = null; - this.dependedVariable = null; - this.addChild(dependency); - this.isListType = true; - } - - public Dependency(RDLTerm dependingTerm, Resource dependedVariable, int order) { - super(new Symbol(":", order == dependedVariable.order ? 2 : 1), order, dependingTerm.getSize() + dependedVariable.getSize()); - if(order == dependedVariable.order) { - this.dependingTerm = dependingTerm; - this.dependedVariable = dependedVariable; - this.addChild(dependingTerm); - this.addChild(dependedVariable); - this.dependency = null; - this.isListType = false; - } else { - this.dependency = new Dependency(dependingTerm, dependedVariable, order+1); - this.dependingTerm = null; - this.dependedVariable = null; - this.addChild(dependency); - this.isListType = true; - } - } - - public Dependency getDependency() { - return this.dependency; - } - - @Override - public int getTermOrder() { - return getOrder() - 1; - } - - public boolean isDependeingTermEvaluatable() { - return dependingTerm instanceof EvaluatableTerm; - } - - public void setDependingTerm(RDLTerm newTerm) { - setChild(0, newTerm); - this.dependingTerm = newTerm; - } - - public void setDependedVariable(Resource newVariable) { - setChild(1, newVariable); - this.dependedVariable = newVariable; - } - - public void setDependency(Dependency newDependency) { - setChild(0, newDependency); - this.dependency = newDependency; - } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - if(dependency == null) { - sb.append(dependingTerm.toTermString()); - sb.append(" : "); - sb.append(dependedVariable.toString()); - } else { - sb.append('['); - sb.append(dependency.toString()); - sb.append(']'); - } - return sb.toString(); - } - - @Override - public String toStringWithOrder() { - StringBuilder sb = new StringBuilder(); - if(dependency == null) { - sb.append(dependingTerm.toStringWithOrder()); - sb.append(" : "); - sb.append(dependedVariable.toStringWithOrder()); - } else { - sb.append('['); - sb.append(dependency.toStringWithOrder()); - sb.append(']'); - } - return sb.toString() + "(" + order + ")"; - } - - @Override - public String toTermString() { - return "[" + toString() + "]"; - } - - @Override - public boolean equals(Object another) { - if(! (another instanceof Dependency)) { - return false; - } - Dependency anotherDep = (Dependency) another; - if(anotherDep.isListType() != isListType()) { - return false; - } - if(isListType()) { - return anotherDep.getDependency().equals(dependency); - } - return anotherDep.getDependingTerm().equals(dependingTerm) - && anotherDep.getDependedVariable().equals(dependedVariable); - } - - @Override - public int hashCode() { - return ("Dep" + toString()).hashCode(); - } - - @Override - public Object clone() { - return new Dependency((RDLTerm) dependingTerm.clone(), (Resource) dependedVariable.clone()); - } - -} diff --git a/src/models/terms/DependencyTerm.java b/src/models/terms/DependencyTerm.java deleted file mode 100644 index a84c945..0000000 --- a/src/models/terms/DependencyTerm.java +++ /dev/null @@ -1,192 +0,0 @@ -package models.terms; - -import java.util.ArrayList; -import java.util.List; -import java.util.stream.IntStream; - -import lombok.Getter; -import models.algebra.Symbol; - -@Getter -public class DependencyTerm extends EvaluatableTerm{ - - private EvaluatableTerm dependingTerm; - private List dependedResources = new ArrayList<>(); - private List argumentTerms = new ArrayList<>(); - - -// public DependencyTerm(EvaluatableTerm dependingTerm, EvaluatableTerm dependedTerm, EvaluatableTerm argumentTerm) { -// super( -// new Symbol(":", 3), -// dependedTerm.getOrder() == argumentTerm.getOrder() ? dependedTerm.getOrder() : dependedTerm.getOrder() - 1, -// dependingTerm.getSize() + argumentTerm.getSize() + dependedTerm.getSize() -// ); -// this.dependingTerm = dependingTerm; -// this.dependedTerms.add(dependedTerm); -// this.argumentTerms.add(argumentTerm); -// addChild(dependingTerm); -// addChild(dependedTerm); -// addChild(argumentTerm); -// } - - public DependencyTerm(EvaluatableTerm dependingTerm, List dependedTerms, List argumentTerms) { - super( - new Symbol(":", 1 + dependedTerms.size() + argumentTerms.size()), - dependedTerms.get(0).getOrder() == argumentTerms.get(0).getOrder() ? dependedTerms.get(0).getOrder() : argumentTerms.get(0).getOrder() - 1, - dependingTerm.getSize() + argumentTerms.get(0).getSize() + dependedTerms.get(0).getSize() - ); - boolean dependedTermsOrderCheck = dependedTerms.stream().allMatch(e -> e.getOrder() == dependedTerms.get(0).getOrder()); -// boolean argumentTermsOrderCheck = argumentTerms.stream().allMatch(e -> e.getOrder() == argumentTerms.get(0).getOrder()); - if (! (dependedTermsOrderCheck)) { - throw new RuntimeException("Orders are not all equals"); - } - if (dependedTerms.size() != argumentTerms.size()) { - throw new RuntimeException("Size not equals"); - } - this.dependingTerm = dependingTerm; - this.dependedResources = new ArrayList<>(dependedTerms); - this.argumentTerms = new ArrayList<>(argumentTerms); - addChild(dependingTerm); - for (int i = 0; i < dependedTerms.size(); i++) { - addChild(dependedTerms.get(i)); - addChild(argumentTerms.get(i)); - } - } - - public DependencyTerm(EvaluatableTerm dependingTerm, EvaluatableTerm ...terms) { - this( - dependingTerm, - IntStream.range(0, terms.length).filter(i -> i % 2 == 0).mapToObj(i -> (Resource) terms[i]).toList(), - IntStream.range(0, terms.length).filter(i -> i % 2 == 1).mapToObj(i -> terms[i]).toList() - ); - } - - @Override - public boolean isLinearRightNormalized() { - return isLinearRightNormaled(0); - } - - @Override - public EvaluatableTerm linearRightNormalize() { - DependencyTerm newTerm = (DependencyTerm) clone(); - newTerm.selfLinearRightNormalize(); - return newTerm; - } - - @Override - public void selfLinearRightNormalize() { -// if(dependingTerm instanceof ResourceVariable || dependingTerm instanceof SetEvaluatableTerm) { -// argumentTerm.selfLinearRightNormalize(); -// return; -// } -// DependencyTerm dependencyTerm = (DependencyTerm) dependingTerm; -// if(! dependencyTerm.isLinearRightNormalized()) { -// dependencyTerm.selfLinearRightNormalize(); -// } -// if(! isLinearRightNormalized()) { -// EvaluatableTerm childArgumentTerm = dependencyTerm.getArgumentTerm(); -// DependencyTerm nextDependencyTerm = new DependencyTerm(childArgumentTerm, dependedVariable, argumentTerm); -// this.dependingTerm = dependencyTerm.getDependingTerm(); -// this.dependedVariable = dependencyTerm.getDependedVariable(); -// this.argumentTerm = nextDependencyTerm; -// this.setChild(2, nextDependencyTerm); -// this.setChild(0, dependencyTerm.getDependingTerm()); -// this.setChild(1, dependencyTerm.getDependedVariable()); -// } -// argumentTerm.selfLinearRightNormalize(); - - } - - private boolean isLinearRightNormaled(int depth) { -// if(dependingTerm instanceof ResourceVariable || dependingTerm instanceof SetEvaluatableTerm) { -// return dependingTerm.getOrder() == dependedVariable.getOrder(); -// } -// DependencyTerm dependencyTerm = (DependencyTerm) dependingTerm; -// if( -// dependencyTerm.isLinearRightNormaled(depth + 1) && -// dependencyTerm.getDependedVariable().getOrder() - 1 == dependedVariable.getOrder() && -// dependencyTerm.getOrder() == dependedVariable.getOrder() && -// argumentTerm.getOrder() <= dependencyTerm.getOrder() && -// depth == 0 -// ) { -// return true; -// } -// if( -// dependencyTerm.isLinearRightNormaled(depth + 1) && -// dependencyTerm.getDependedVariable().getOrder() - 1 == dependedVariable.getOrder() && -// dependencyTerm.getOrder() == dependedVariable.getOrder() && -// argumentTerm.getOrder() < dependencyTerm.getOrder() -// ) { -// return true; -// } - - return false; - } - - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append('['); - sb.append(getDependingTerm().toString()); - sb.append(" : "); - for (int i = 0; i < dependedResources.size(); i++) { - sb.append(dependedResources.get(i).toString()); - sb.append(" -> "); - sb.append(argumentTerms.get(i).toString()); - sb.append(", "); - } - sb.deleteCharAt(sb.length() - 1); - sb.deleteCharAt(sb.length() - 1); - sb.append(']'); - return sb.toString(); - } - - @Override - public String toStringWithOrder() { - StringBuilder sb = new StringBuilder(); - sb.append('['); - sb.append(getDependingTerm().toStringWithOrder()); - sb.append(" : "); - for (int i = 0; i < dependedResources.size(); i++) { - sb.append(dependedResources.get(i).toStringWithOrder()); - sb.append(" -> "); - sb.append(argumentTerms.get(i).toStringWithOrder()); - sb.append(", "); - } - sb.deleteCharAt(sb.length() - 1); - sb.append(']'); - sb.append('('); - sb.append(order); - sb.append(')'); - return sb.toString(); - } - - @Override - public boolean equals(Object another) { - if(! (another instanceof DependencyTerm)) { - return false; - } - DependencyTerm term = (DependencyTerm) another; - - return dependingTerm.equals(term.getDependingTerm()) && - dependedResources.stream().sorted().toList().equals(term.getDependedResources().stream().sorted().toList()) && - argumentTerms.stream().sorted().toList().equals(term.getArgumentTerms().stream().sorted().toList()); - } - - @Override - public int hashCode() { - return ("DT" + toString()).hashCode(); - } - - @Override - public Object clone() { - return new DependencyTerm( - (EvaluatableTerm) dependingTerm.clone(), - new ArrayList<>(dependedResources), - new ArrayList<>(argumentTerms) - ); - } - - -} diff --git a/src/models/terms/EvaluatableTerm.java b/src/models/terms/EvaluatableTerm.java deleted file mode 100644 index 84169f6..0000000 --- a/src/models/terms/EvaluatableTerm.java +++ /dev/null @@ -1,22 +0,0 @@ -package models.terms; - -import models.algebra.Symbol; - -public abstract class EvaluatableTerm extends RDLTerm{ - - protected EvaluatableTerm(Symbol symbol, int order, int size) { - super(symbol, order, size); - } - - public abstract boolean isLinearRightNormalized(); - public LinearRightNormalizedType getLinearRightNormalizedType() { - if (isLinearRightNormalized()) { - return LinearRightNormalizedType.LINEAR_RIGHT_NORMALIZED; - } - return LinearRightNormalizedType.NOT_LINEAR_RIGHT_NORMALIZED; - } - - public abstract EvaluatableTerm linearRightNormalize(); - public abstract void selfLinearRightNormalize(); - -} diff --git a/src/models/terms/LinearRightNormalizedType.java b/src/models/terms/LinearRightNormalizedType.java deleted file mode 100644 index e043c08..0000000 --- a/src/models/terms/LinearRightNormalizedType.java +++ /dev/null @@ -1,9 +0,0 @@ -package models.terms; - -public enum LinearRightNormalizedType { - - LINEAR_RIGHT_NORMALIZED, - NOT_LINEAR_RIGHT_NORMALIZED, - UNDEFINED - -} diff --git a/src/models/terms/PrimedTerm.java b/src/models/terms/PrimedTerm.java deleted file mode 100644 index 6de8ae5..0000000 --- a/src/models/terms/PrimedTerm.java +++ /dev/null @@ -1,52 +0,0 @@ -package models.terms; - -import lombok.Getter; - -@Getter -public class PrimedTerm extends EvaluatableTerm { - - private EvaluatableTerm primedTerm; - - public PrimedTerm(EvaluatableTerm term) { - super(term.getSymbol(), term.getOrder(), term.getSize()); - this.primedTerm = term; - } - - @Override - public String toString() { - return primedTerm.toString() + "'"; - } - - @Override - public String toStringWithOrder() { - return toString() + "(" + primedTerm.getOrder() + ")"; - } - - @Override - public int hashCode() { - return toStringWithOrder().hashCode(); - } - - @Override - public Object clone() { - return new PrimedTerm(primedTerm); - } - - @Override - public boolean isLinearRightNormalized() { - return primedTerm.isLinearRightNormalized(); - } - - @Override - public EvaluatableTerm linearRightNormalize() { - return new PrimedTerm(primedTerm.linearRightNormalize()); - } - - @Override - public void selfLinearRightNormalize() { - primedTerm.selfLinearRightNormalize(); - } - - - -} diff --git a/src/models/terms/RDLTerm.java b/src/models/terms/RDLTerm.java deleted file mode 100644 index 629839c..0000000 --- a/src/models/terms/RDLTerm.java +++ /dev/null @@ -1,48 +0,0 @@ -package models.terms; - -import lombok.Getter; -import models.algebra.Symbol; -import models.algebra.Term; - -@Getter -public abstract class RDLTerm extends Term implements Comparable{ - - protected int order; - protected int size; - - protected RDLTerm(Symbol symbol, int order, int size) { - super(symbol); - this.order = order; - this.size = size; - } - - public int getTermOrder() { - return getOrder(); - } - - @Override - public abstract String toString(); - - public abstract String toStringWithOrder(); - - public String toTermString() { - return toString(); - } - - @Override - public int compareTo(RDLTerm other) { - return toString().compareTo(other.toString()); - } - - @Override - public boolean equals(Object another) { - return super.equals(another); - } - - @Override - public abstract int hashCode(); - - @Override - public abstract Object clone(); - -} diff --git a/src/models/terms/Resource.java b/src/models/terms/Resource.java deleted file mode 100644 index e5274fb..0000000 --- a/src/models/terms/Resource.java +++ /dev/null @@ -1,63 +0,0 @@ -package models.terms; - -import lombok.Getter; -import models.algebra.Symbol; -import models.algebra.Type; - -@Getter -public class Resource extends EvaluatableTerm { - - private String name; - private Type type; - - public Resource(String name, Type type, int order) { - super(new Symbol("", 0), order, 1); - this.name = name; - this.type = type; - } - - @Override - public EvaluatableTerm linearRightNormalize() { - return (Resource) clone(); - } - - @Override - public void selfLinearRightNormalize() { - } - - @Override - public boolean isLinearRightNormalized() { - return true; - } - - - @Override - public boolean equals(Object another) { - if(! (another instanceof Resource)) { - return false; - } - var vari = (Resource) another; - return vari.getOrder() == getOrder() && vari.getName().equals(getName()) && vari.getType().equals(getType()); - } - - @Override - public int hashCode() { - return ("Vari" + toStringWithOrder()).hashCode(); - } - - @Override - public String toString() { - return this.name; - } - - @Override - public String toStringWithOrder() { - return this.name + "(" + order + ")"; - } - - @Override - public Object clone() { - return new Resource(name, type, order); - } - -} diff --git a/src/models/terms/ResourceConstant.java b/src/models/terms/ResourceConstant.java deleted file mode 100644 index 1158b84..0000000 --- a/src/models/terms/ResourceConstant.java +++ /dev/null @@ -1,70 +0,0 @@ -package models.terms; - -import lombok.Getter; -import models.algebra.Symbol; -import models.algebra.Type; - -@Getter -public class ResourceConstant extends EvaluatableTerm{ - - private String name; - private Type type; - - public ResourceConstant(String name) { - super(new Symbol("", 0), 0, 1); - this.name = name; - this.type = null; - } - - public ResourceConstant(String name, Type type) { - super(new Symbol("", 0), 0, 1); - this.name = name; - this.type = type; - } - - @Override - public boolean isLinearRightNormalized() { - return true; - } - - @Override - public EvaluatableTerm linearRightNormalize() { - return (ResourceConstant) clone(); - } - - @Override - public void selfLinearRightNormalize() { - } - - - @Override - public boolean equals(Object another) { - if(! (another instanceof ResourceConstant)) { - return false; - } - var cons = (ResourceConstant) another; - return cons.getOrder() == getOrder() && cons.getName().equals(getName()); - } - - @Override - public int hashCode() { - return ("Const" + toStringWithOrder()).hashCode(); - } - - @Override - public String toString() { - return this.name; - } - - @Override - public String toStringWithOrder() { - return this.name + "(" + order + ")"; - } - - @Override - public Object clone() { - return new ResourceConstant(name, type); - } - - -} diff --git a/src/models/terms/SetEvaluatableTerm.java b/src/models/terms/SetEvaluatableTerm.java deleted file mode 100644 index 05fc8e2..0000000 --- a/src/models/terms/SetEvaluatableTerm.java +++ /dev/null @@ -1,86 +0,0 @@ -package models.terms; - -import lombok.Getter; -import models.algebra.Symbol; - -@Getter -public class SetEvaluatableTerm extends EvaluatableTerm{ - - private EvaluatableTerm term; - - public SetEvaluatableTerm(EvaluatableTerm term) { - super(new Symbol("", 1), term.getOrder() - 1, term.getSize()); - this.term = term; - this.addChild(term); - } - - public SetEvaluatableTerm(EvaluatableTerm term, int order) { - super(new Symbol("", 1), order, term.getSize()); - if(term.getOrder() > order + 1) { - var childTerm = new SetEvaluatableTerm(term, order+1); - this.term = childTerm; - this.addChild(childTerm); - } else { - this.term = term; - this.addChild(term); - } - } - - public void setTerm(EvaluatableTerm newTerm) { - setChild(0, newTerm); - this.term = newTerm; - } - - @Override - public EvaluatableTerm linearRightNormalize() { - return (SetEvaluatableTerm) clone(); - } - - @Override - public void selfLinearRightNormalize() { - } - - @Override - public boolean isLinearRightNormalized() { - return term.isLinearRightNormalized(); - } - - - @Override - public boolean equals(Object another) { - if(! (another instanceof SetEvaluatableTerm)) { - return false; - } - var term = (SetEvaluatableTerm) another; - return term.getTerm().equals(getTerm()); - } - - @Override - public int hashCode() { - return ("SET" + toString()).hashCode(); - } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append('{'); - sb.append(term.toString()); - sb.append('}'); - return sb.toString(); - } - - @Override - public String toStringWithOrder() { - StringBuilder sb = new StringBuilder(); - sb.append('{'); - sb.append(term.toStringWithOrder()); - sb.append('}'); - return sb.toString() + "(" + order + ")"; - } - - @Override - public Object clone() { - return new SetEvaluatableTerm((EvaluatableTerm) term.clone(), order); - } - -} diff --git a/src/models/terms/meta/MetaDependencyTermVariable.java b/src/models/terms/meta/MetaDependencyTermVariable.java deleted file mode 100644 index fc23e3a..0000000 --- a/src/models/terms/meta/MetaDependencyTermVariable.java +++ /dev/null @@ -1,24 +0,0 @@ -package models.terms.meta; - -import lombok.Getter; -import models.algebra.Constant; -import models.algebra.Expression; -import models.algebra.Symbol; -import models.algebra.Variable; - -@Getter -public class MetaDependencyTermVariable extends MetaVariable { - - public MetaDependencyTermVariable(Variable variableName, OrderConstraint constraint, Expression order) { - super(new Symbol(":", 3), MetaRDLTerm.TermType.META_DEPENDENCY_TERM_VARIABLE, variableName, constraint, order); - } - - public MetaDependencyTermVariable(Variable variableName) { - super(new Symbol(":", 3), MetaRDLTerm.TermType.META_DEPENDENCY_TERM_VARIABLE, variableName, OrderConstraint.ANY, new Constant("0")); - } - - public MetaDependencyTermVariable(Variable variableName, Expression order) { - super(new Symbol(":", 3), MetaRDLTerm.TermType.META_DEPENDENCY_TERM_VARIABLE, variableName, OrderConstraint.EQ, order); - } - -} diff --git a/src/models/terms/meta/MetaDependencyVariable.java b/src/models/terms/meta/MetaDependencyVariable.java deleted file mode 100644 index 477e338..0000000 --- a/src/models/terms/meta/MetaDependencyVariable.java +++ /dev/null @@ -1,24 +0,0 @@ -package models.terms.meta; - -import lombok.Getter; -import models.algebra.Constant; -import models.algebra.Expression; -import models.algebra.Symbol; -import models.algebra.Variable; - -@Getter -public class MetaDependencyVariable extends MetaVariable { - - public MetaDependencyVariable(Variable variableName, OrderConstraint constraint, Expression order) { - super(new Symbol(":", 2), MetaRDLTerm.TermType.META_DEPENDENCY_VARIABLE, variableName, constraint, order); - } - - public MetaDependencyVariable(Variable variableName) { - super(new Symbol(":", 2), MetaRDLTerm.TermType.META_DEPENDENCY_VARIABLE, variableName, OrderConstraint.ANY, new Constant("0")); - } - - public MetaDependencyVariable(Variable variableName, Expression order) { - super(new Symbol(":", 2), MetaRDLTerm.TermType.META_DEPENDENCY_VARIABLE, variableName, OrderConstraint.EQ, order); - } - -} diff --git a/src/models/terms/meta/MetaEvaluatableTermSet.java b/src/models/terms/meta/MetaEvaluatableTermSet.java deleted file mode 100644 index 8611340..0000000 --- a/src/models/terms/meta/MetaEvaluatableTermSet.java +++ /dev/null @@ -1,22 +0,0 @@ -package models.terms.meta; - -import models.algebra.Constant; -import models.algebra.Expression; -import models.algebra.Symbol; -import models.algebra.Variable; - -public class MetaEvaluatableTermSet extends MetaVariable{ - - public MetaEvaluatableTermSet(Variable name, OrderConstraint constraint, Expression order) { - super(new Symbol(":", 1), TermType.META_EVALUATABLE_TERM_SET_VARIABLE, name, constraint, order); - } - - public MetaEvaluatableTermSet(Variable variableName) { - super(new Symbol(":", 1), MetaRDLTerm.TermType.META_EVALUATABLE_TERM_SET_VARIABLE, variableName, OrderConstraint.ANY, new Constant("0")); - } - - public MetaEvaluatableTermSet(Variable variableName, Expression order) { - super(new Symbol(":", 1), MetaRDLTerm.TermType.META_EVALUATABLE_TERM_SET_VARIABLE, variableName, OrderConstraint.EQ, order); - } - -} diff --git a/src/models/terms/meta/MetaEvaluatableTermVariable.java b/src/models/terms/meta/MetaEvaluatableTermVariable.java deleted file mode 100644 index dd049b4..0000000 --- a/src/models/terms/meta/MetaEvaluatableTermVariable.java +++ /dev/null @@ -1,35 +0,0 @@ -package models.terms.meta; - -import models.algebra.Constant; -import models.algebra.Expression; -import models.algebra.Symbol; -import models.algebra.Variable; -import models.terms.LinearRightNormalizedType; - -public class MetaEvaluatableTermVariable extends MetaVariable { - - public MetaEvaluatableTermVariable(Variable variableName, OrderConstraint constraint, Expression order) { - super(new Symbol(":", 2), MetaRDLTerm.TermType.META_EVALUATABLE_TERM_VARIABLE, variableName, constraint, order); - } - - public MetaEvaluatableTermVariable(Variable variableName) { - super(new Symbol(":", 2), MetaRDLTerm.TermType.META_EVALUATABLE_TERM_VARIABLE, variableName, OrderConstraint.ANY, new Constant("0")); - } - - public MetaEvaluatableTermVariable(Variable variableName, Expression order) { - super(new Symbol(":", 2), MetaRDLTerm.TermType.META_EVALUATABLE_TERM_VARIABLE, variableName, OrderConstraint.EQ, order); - } - - public MetaEvaluatableTermVariable(Variable variableName, OrderConstraint constraint, Expression order, LinearRightNormalizedType linearRIghtNormalizedType) { - super(new Symbol(":", 2), MetaRDLTerm.TermType.META_EVALUATABLE_TERM_VARIABLE, variableName, constraint, order, linearRIghtNormalizedType); - } - - public MetaEvaluatableTermVariable(Variable variableName, LinearRightNormalizedType linearRIghtNormalizedType) { - super(new Symbol(":", 2), MetaRDLTerm.TermType.META_EVALUATABLE_TERM_VARIABLE, variableName, OrderConstraint.ANY, new Constant("0"), linearRIghtNormalizedType); - } - - public MetaEvaluatableTermVariable(Variable variableName, Expression order, LinearRightNormalizedType linearRIghtNormalizedType) { - super(new Symbol(":", 2), MetaRDLTerm.TermType.META_EVALUATABLE_TERM_VARIABLE, variableName, OrderConstraint.EQ, order, linearRIghtNormalizedType); - } - -} diff --git a/src/models/terms/meta/MetaRDLTerm.java b/src/models/terms/meta/MetaRDLTerm.java deleted file mode 100644 index 2072bd5..0000000 --- a/src/models/terms/meta/MetaRDLTerm.java +++ /dev/null @@ -1,344 +0,0 @@ -package models.terms.meta; - -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; - -import exceptions.IllegalTypeException; -import exceptions.SubstituteFailedException; -import lombok.Getter; -import models.algebra.Symbol; -import models.algebra.Variable; -import models.terms.Dependency; -import models.terms.DependencyTerm; -import models.terms.EvaluatableTerm; -import models.terms.LinearRightNormalizedType; -import models.terms.RDLTerm; -import models.terms.Resource; -import models.terms.SetEvaluatableTerm; - -@Getter -public class MetaRDLTerm extends RDLTerm { - - protected TermType termType; - protected LinearRightNormalizedType linearRightNormalizedType = LinearRightNormalizedType.UNDEFINED; - - protected MetaRDLTerm(Symbol symbol, TermType termType, int size) { - super(symbol, -1, size); - this.termType = termType; - if (isResourceVariable()) { - linearRightNormalizedType = LinearRightNormalizedType.LINEAR_RIGHT_NORMALIZED; - } - } - - //dependency - public MetaRDLTerm(RDLTerm dependingTerm, MetaResource dependedVariable) { - super(new Symbol(":", 2), dependedVariable.getOrder(), dependingTerm.getSize() + dependedVariable.getSize()); - addChild(dependingTerm); - addChild(dependedVariable); - this.termType = TermType.META_DEPENDENCY; - } - - public MetaRDLTerm(MetaRDLTerm dependingTerm, Resource dependedVariable) { - super(new Symbol(":", 2), dependedVariable.getOrder(), dependingTerm.getSize() + dependedVariable.getSize()); - addChild(dependingTerm); - addChild(dependedVariable); - this.termType = TermType.META_DEPENDENCY; - } - - public MetaRDLTerm(MetaRDLTerm dependingTerm, MetaResource dependedVariable) { - super(new Symbol(":", 2), dependedVariable.getOrder(), dependingTerm.getSize() + dependedVariable.getSize()); - addChild(dependingTerm); - addChild(dependedVariable); - this.termType = TermType.META_DEPENDENCY; - } - - //list type dependency or set term - public MetaRDLTerm(MetaRDLTerm term) { - super(new Symbol(":", 1), term.getOrder() - 1, term.getSize()); - if (term.isDependency()) { - this.termType = TermType.META_DEPENDENCY_LIST; - } else if (term.isEvaluatableTerm()) { - this.termType = TermType.META_EVALUATABLE_TERM_SET; - } - addChild(term); - } - - //dependency term - public MetaRDLTerm(MetaRDLTerm dependingTerm, MetaResource dependedVariable, MetaRDLTerm argumentTerm) { - super(new Symbol(":", 3), -1, dependingTerm.getSize() + dependedVariable.getSize() + argumentTerm.getSize()); - if (! EvaluatableTerm.class.isAssignableFrom(dependingTerm.getTermType().getBaseTermClass())) { - throw new IllegalTypeException(); - } - if(! EvaluatableTerm.class.isAssignableFrom(argumentTerm.getTermType().getBaseTermClass())) { - throw new IllegalTypeException(); - } - addChild(dependingTerm); - addChild(dependedVariable); - addChild(argumentTerm); - this.termType = TermType.META_DEPENDENCY_TERM; - } - - public MetaRDLTerm(EvaluatableTerm dependingTerm, MetaRDLTerm dependedVariable, MetaRDLTerm argumentTerm) { - super(new Symbol(":", 3), -1, dependingTerm.getSize() + dependedVariable.getSize() + argumentTerm.getSize()); - if(! EvaluatableTerm.class.isAssignableFrom(argumentTerm.getTermType().getBaseTermClass())) { - throw new IllegalTypeException(); - } - addChild(dependingTerm); - addChild(dependedVariable); - addChild(argumentTerm); - this.termType = TermType.META_DEPENDENCY_TERM; - } - - public MetaRDLTerm(MetaRDLTerm dependingTerm, Resource dependedVariable, MetaRDLTerm argumentTerm) { - super(new Symbol(":", 3), -1, dependingTerm.getSize() + dependedVariable.getSize() + argumentTerm.getSize()); - if (! EvaluatableTerm.class.isAssignableFrom(dependingTerm.getTermType().getBaseTermClass())) { - throw new IllegalTypeException(); - } - if(! EvaluatableTerm.class.isAssignableFrom(argumentTerm.getTermType().getBaseTermClass())) { - throw new IllegalTypeException(); - } - addChild(dependingTerm); - addChild(dependedVariable); - addChild(argumentTerm); - this.termType = TermType.META_DEPENDENCY_TERM; - } - - public MetaRDLTerm(MetaRDLTerm dependingTerm, MetaRDLTerm dependedVariable, EvaluatableTerm argumentTerm) { - super(new Symbol(":", 3), -1, dependingTerm.getSize() + dependedVariable.getSize() + argumentTerm.getSize()); - if (! EvaluatableTerm.class.isAssignableFrom(dependingTerm.getTermType().getBaseTermClass())) { - throw new IllegalTypeException(); - } - addChild(dependingTerm); - addChild(dependedVariable); - addChild(argumentTerm); - this.termType = TermType.META_DEPENDENCY_TERM; - } - - public MetaRDLTerm(MetaRDLTerm dependingTerm, Resource dependedVariable, EvaluatableTerm argumentTerm) { - super(new Symbol(":", 3), -1, dependingTerm.getSize() + dependedVariable.getSize() + argumentTerm.getSize()); - if (! EvaluatableTerm.class.isAssignableFrom(dependingTerm.getTermType().getBaseTermClass())) { - throw new IllegalTypeException(); - } - addChild(dependingTerm); - addChild(dependedVariable); - addChild(argumentTerm); - this.termType = TermType.META_DEPENDENCY_TERM; - } - - public MetaRDLTerm(EvaluatableTerm dependingTerm, MetaResource dependedVariable, EvaluatableTerm argumentTerm) { - super(new Symbol(":", 3), -1, dependingTerm.getSize() + dependedVariable.getSize() + argumentTerm.getSize()); - addChild(dependingTerm); - addChild(dependedVariable); - addChild(argumentTerm); - this.termType = TermType.META_DEPENDENCY_TERM; - } - - public MetaRDLTerm(EvaluatableTerm dependingTerm, Resource dependedVariable, MetaRDLTerm argumentTerm) { - super(new Symbol(":", 3), -1, dependingTerm.getSize() + dependedVariable.getSize() + argumentTerm.getSize()); - if(! EvaluatableTerm.class.isAssignableFrom(argumentTerm.getTermType().getBaseTermClass())) { - throw new IllegalTypeException(); - } - addChild(dependingTerm); - addChild(dependedVariable); - addChild(argumentTerm); - this.termType = TermType.META_DEPENDENCY_TERM; - } - - public RDLTerm substitute(Map binding) { - if (isDependency()) { - RDLTerm dependingTerm = (RDLTerm) getChild(0); - RDLTerm dependedVariable = (RDLTerm) getChild(1); - if (dependingTerm instanceof MetaRDLTerm) { - dependingTerm = ((MetaRDLTerm) dependingTerm).substitute(binding); - } - if (dependedVariable instanceof MetaRDLTerm) { - dependedVariable = ((MetaRDLTerm) dependedVariable).substitute(binding); - } - if (dependedVariable instanceof Resource) { - return new Dependency(dependingTerm, (Resource) dependedVariable); - } - } - else if (isDependencyTerm()) { - RDLTerm dependingTerm = (RDLTerm) getChild(0); - RDLTerm dependedVariable = (RDLTerm) getChild(1); - RDLTerm argumentTerm = (RDLTerm) getChild(2); - if (dependingTerm instanceof MetaRDLTerm) { - dependingTerm = ((MetaRDLTerm) dependingTerm).substitute(binding); - } - if (dependedVariable instanceof MetaRDLTerm) { - dependedVariable = ((MetaRDLTerm) dependedVariable).substitute(binding); - } - if (argumentTerm instanceof MetaRDLTerm) { - argumentTerm = ((MetaRDLTerm) argumentTerm).substitute(binding); - } - return new DependencyTerm((EvaluatableTerm) dependingTerm, (Resource) dependedVariable, (EvaluatableTerm) argumentTerm); - } else if (isSetTerm()) { - RDLTerm term = (RDLTerm) getChild(0); - if (term instanceof MetaRDLTerm) { - term = ((MetaRDLTerm) term).substitute(binding); - } - return new SetEvaluatableTerm((EvaluatableTerm) term); - } - throw new SubstituteFailedException(); - } - - public boolean isVariable() { - return false; - } - - public boolean isMatchedBy(RDLTerm another) { - return isMatchedBy(another, new HashMap<>(), new HashMap<>()); - } - - public boolean isMatchedBy(RDLTerm another, Map binding, Map orderConstraint) { - if (! another.getClass().isAssignableFrom(this.termType.getBaseTermClass())) { - return false; - } - if (this.getChildren().size() != another.getChildren().size()) { - return false; - } - if (isDependencyTerm() && (! islinearRightNormalizedMatchedBy(another))) { - return false; - } - for (int i = 0; i < this.getChildren().size(); i++) { - RDLTerm child = (RDLTerm) this.getChild(i); - RDLTerm anotherChild = (RDLTerm) another.getChild(i); - if (child instanceof MetaRDLTerm) { - MetaRDLTerm metaChild = (MetaRDLTerm) child; - if (! metaChild.isMatchedBy(anotherChild, binding, orderConstraint)) { - return false; - } - } else { - if (!(child.equals(anotherChild))) { - return false; - } - } - } - return true; - } - - public boolean checkTermType(Class clazz) { - return clazz.isAssignableFrom(termType.getBaseTermClass()); - } - - public boolean isDependency() { - return checkTermType(Dependency.class); - } - - public boolean isEvaluatableTerm() { - return checkTermType(EvaluatableTerm.class); - } - - public boolean isDependencyTerm() { - return checkTermType(DependencyTerm.class); - } - - public boolean isSetTerm() { - return checkTermType(SetEvaluatableTerm.class); - } - - public boolean isResourceVariable() { - return checkTermType(Resource.class); - } - - public void setLinearRightNormalizedType(LinearRightNormalizedType next) { - if (isDependency()) { - return; - } - this.linearRightNormalizedType = next; - } - - public Collection getAllVariables() { - return getSubTerms(MetaVariable.class).values(); - } - - protected boolean islinearRightNormalizedMatchedBy(RDLTerm another) { - if (linearRightNormalizedType != LinearRightNormalizedType.UNDEFINED) { - if (another instanceof DependencyTerm) { - if (((DependencyTerm) another).getLinearRightNormalizedType() != linearRightNormalizedType) { - return false; - } - } - else if (another instanceof MetaRDLTerm) { - if (((MetaRDLTerm) another).getLinearRightNormalizedType() != linearRightNormalizedType) { - return false; - } - } - } - return true; - } - - @Override - public String toString() { - switch(termType) { - case META_DEPENDENCY: - return "[" + getChild(0).toString() + " : " + getChild(1).toString() + "]"; - case META_DEPENDENCY_LIST: - return "[" + getChild(0).toString() + "]"; - case META_DEPENDENCY_TERM: - return "[" + getChild(0).toString() + " : " + getChild(1).toString() + " -> " + getChild(2).toString() + "]"; - case META_EVALUATABLE_TERM_SET: - return "{" + getChild(0).toString() + "}"; - default: - return ""; - } - } - - @Override - public String toStringWithOrder() { - switch(termType) { - case META_DEPENDENCY: - return "[" + ((RDLTerm) getChild(0)).toStringWithOrder() + " : " + ((RDLTerm) getChild(1)).toStringWithOrder() + "]"; - case META_DEPENDENCY_LIST: - return "[" + ((RDLTerm) getChild(0)).toStringWithOrder() + "]"; - case META_DEPENDENCY_TERM: - return "[" + ((RDLTerm) getChild(0)).toStringWithOrder() + " : " - + ((RDLTerm) getChild(1)).toStringWithOrder() + " -> " + ((RDLTerm) getChild(2)).toStringWithOrder() + "]"; - default: - return ""; - } - } - - @Override - public boolean equals(Object another) { - if(! (another instanceof MetaRDLTerm)) { - return false; - } - MetaRDLTerm anotherTerm = (MetaRDLTerm) another; - return super.equals(another) && termType == anotherTerm.getTermType(); - } - - @Override - public int hashCode() { - return (termType.toString() + toStringWithOrder()).hashCode(); - } - - @Override - public Object clone() { - - return null; - } - - protected static enum TermType { - META_RDL_TERM(RDLTerm.class), - META_DEPENDENCY(Dependency.class), - META_DEPENDENCY_LIST(Dependency.class), - META_DEPENDENCY_VARIABLE(Dependency.class), - META_DEPENDENCY_TERM(DependencyTerm.class), - META_DEPENDENCY_TERM_VARIABLE(DependencyTerm.class), - META_EVALUATABLE_TERM_VARIABLE(EvaluatableTerm.class), - META_EVALUATABLE_TERM_SET(SetEvaluatableTerm.class), - META_EVALUATABLE_TERM_SET_VARIABLE(SetEvaluatableTerm.class), - META_RESOURCE_VARIABLE(Resource.class); - - @Getter - private Class baseTermClass; - - private TermType(Class clazz) { - this.baseTermClass = clazz; - } - - } - -} diff --git a/src/models/terms/meta/MetaRDLTermVariable.java b/src/models/terms/meta/MetaRDLTermVariable.java deleted file mode 100644 index 1205c21..0000000 --- a/src/models/terms/meta/MetaRDLTermVariable.java +++ /dev/null @@ -1,22 +0,0 @@ -package models.terms.meta; - -import models.algebra.Constant; -import models.algebra.Expression; -import models.algebra.Symbol; -import models.algebra.Variable; - -public class MetaRDLTermVariable extends MetaVariable { - - public MetaRDLTermVariable(Variable variableName, OrderConstraint constraint, Expression order) { - super(new Symbol("", -1), MetaRDLTerm.TermType.META_RDL_TERM, variableName, constraint, order); - } - - public MetaRDLTermVariable(Variable variableName) { - super(new Symbol("", -1), MetaRDLTerm.TermType.META_RDL_TERM, variableName, OrderConstraint.ANY, new Constant("0")); - } - - public MetaRDLTermVariable(Variable variableName, Expression order) { - super(new Symbol("", -1), MetaRDLTerm.TermType.META_RDL_TERM, variableName, OrderConstraint.EQ, order); - } - -} diff --git a/src/models/terms/meta/MetaResource.java b/src/models/terms/meta/MetaResource.java deleted file mode 100644 index d28b163..0000000 --- a/src/models/terms/meta/MetaResource.java +++ /dev/null @@ -1,50 +0,0 @@ -package models.terms.meta; - -import java.util.Map; - -import lombok.Getter; -import models.algebra.Constant; -import models.algebra.Expression; -import models.algebra.Symbol; -import models.algebra.Variable; -import models.terms.RDLTerm; -import models.terms.ResourceConstant; -import models.terms.Resource; - -@Getter -public class MetaResource extends MetaVariable { - - public MetaResource(Variable variableName, OrderConstraint constraint, Expression order) { - super(new Symbol("", 0), MetaRDLTerm.TermType.META_RESOURCE_VARIABLE, variableName, constraint, order); - } - - public MetaResource(Variable variableName) { - super(new Symbol("", 0), MetaRDLTerm.TermType.META_RESOURCE_VARIABLE, variableName, OrderConstraint.ANY, new Constant("0")); - } - - public MetaResource(Variable variableName, Expression order) { - super(new Symbol("", 0), MetaRDLTerm.TermType.META_RESOURCE_VARIABLE, variableName, OrderConstraint.EQ, order); - } - - @Override - public boolean isMatchedBy(RDLTerm another, Map binding, - Map orderConstraint) { - if ((! (another instanceof Resource)) && (! (another instanceof ResourceConstant))) { - return false; - } - - if (! orderConstraintCheck(another, orderConstraint)) { - return false; - } - - if (! islinearRightNormalizedMatchedBy(another)) { - return false; - } - - if (! binding.containsKey(this.variableName)) { - binding.put(this.variableName, another); - return true; - } - return binding.get(this.variableName).equals(another); - } -} diff --git a/src/models/terms/meta/MetaVariable.java b/src/models/terms/meta/MetaVariable.java deleted file mode 100644 index 804f1c2..0000000 --- a/src/models/terms/meta/MetaVariable.java +++ /dev/null @@ -1,189 +0,0 @@ -package models.terms.meta; - -import java.util.HashMap; -import java.util.Map; - -import exceptions.CoefficientNotOneException; -import exceptions.SubstituteFailedException; -import exceptions.TooManyVariablesException; -import lombok.Getter; -import models.algebra.Expression; -import models.algebra.Symbol; -import models.algebra.Variable; -import models.terms.LinearRightNormalizedType; -import models.terms.RDLTerm; -import utils.ExpressionUitls; - -@Getter -public abstract class MetaVariable extends MetaRDLTerm { - - protected Variable variableName; - protected OrderConstraint constraint; - protected Variable orderVariable; - protected int orderConstant; - protected Expression orderExpression; - - protected MetaVariable(Symbol symbol, TermType termType, Variable name, OrderConstraint constraint, Expression order) { - super(symbol, termType, 1); - this.variableName = name; - this.constraint = constraint; - this.orderExpression = order; - Map coefficients = new HashMap<>(); - int constant = ExpressionUitls.getCoefficientAndConstantsFromExpression(order, coefficients, 1); - if (coefficients.size() > 1) { - // todo: create exception - throw new TooManyVariablesException("Too many variables"); - } - if (coefficients.size() == 1) { - orderVariable = coefficients.keySet().iterator().next(); - if (coefficients.get(orderVariable) != 1) { - throw new CoefficientNotOneException(); - } - } else { - orderVariable = null; - } - orderConstant = constant; - } - - protected MetaVariable(Symbol symbol, TermType termType, Variable name, OrderConstraint constraint, Expression order, LinearRightNormalizedType linearRIghtNormalizedType) { - super(symbol, termType, 1); - this.variableName = name; - this.constraint = constraint; - this.orderExpression = order; - Map coefficients = new HashMap<>(); - int constant = ExpressionUitls.getCoefficientAndConstantsFromExpression(order, coefficients, 1); - if (coefficients.size() > 1) { - // todo: create exception - throw new TooManyVariablesException("Too many variables"); - } - if (coefficients.size() == 1) { - orderVariable = coefficients.keySet().iterator().next(); - if (coefficients.get(orderVariable) != 1) { - throw new CoefficientNotOneException(); - } - } else { - orderVariable = null; - } - orderConstant = constant; - this.linearRightNormalizedType = linearRIghtNormalizedType; - } - - @Override - public boolean isVariable() { - return true; - } - - @Override - public boolean isMatchedBy(RDLTerm another, Map binding, - Map orderConstraint) { - if (! this.termType.getBaseTermClass().isAssignableFrom(another.getClass())) { - return false; - } - - if (! orderConstraintCheck(another, orderConstraint)) { - return false; - } - - if (! islinearRightNormalizedMatchedBy(another)) { - return false; - } - - if (! binding.containsKey(this.variableName)) { - binding.put(this.variableName, another); - return true; - } - return binding.get(this.variableName).equals(another); - } - - @Override - public RDLTerm substitute(Map binding) { - if (binding.containsKey(variableName)) { - return binding.get(variableName); - } - throw new SubstituteFailedException(); - } - - protected boolean orderConstraintCheck(RDLTerm another, Map orderConstraints) { - if (orderVariable == null) { - switch (constraint) { - case ANY: - return true; - case EQ: - return another.getOrder() == orderConstant; - case GE: - return another.getOrder() >= orderConstant; - case GT: - return another.getOrder() > orderConstant; - case LE: - return another.getOrder() <= orderConstant; - case LT: - return another.getOrder() < orderConstant; - } - } else { - if (! orderConstraints.containsKey(orderVariable)) { - orderConstraints.put(orderVariable, new OrderVariableConstraint()); - } - var orderVarConst = orderConstraints.get(orderVariable); - return orderVarConst.setConstraint(another.getOrder() - orderConstant, constraint); - } - return false; - } - - - - - @Override - public String toString() { - return variableName.toString(); - } - - @Override - public String toStringWithOrder() { - return toString() +getOrderString(); - } - - protected String getOrderString() { - switch(constraint) { - case ANY: - return "(*)"; - case EQ: - return "(= " + orderExpression.toString() + ")"; - case GE: - return "(>= " + orderExpression.toString() + ")"; - case GT: - return "(> " + orderExpression.toString() + ")"; - case LE: - return "(<= " + orderExpression.toString() + ")"; - case LT: - return "(< " + orderExpression.toString() + ")"; - } - return ""; - } - - @Override - public boolean equals(Object another) { - if (another instanceof MetaVariable) { - return false; - } - MetaVariable anotherVar = (MetaVariable) another; - return super.equals(another) - && variableName.equals(another) - && constraint == anotherVar.getConstraint() - && orderVariable.equals(anotherVar.getOrderVariable()) - && orderConstant == anotherVar.getOrderConstant(); - } - - @Override - public int hashCode() { - return (termType.name() + toString()).hashCode(); - } - - @Override - public Object clone() { - // TODO 自動生成されたメソッド・スタブ - return super.clone(); - } - - - -} diff --git a/src/models/terms/meta/OrderConstraint.java b/src/models/terms/meta/OrderConstraint.java deleted file mode 100644 index fbd7320..0000000 --- a/src/models/terms/meta/OrderConstraint.java +++ /dev/null @@ -1,22 +0,0 @@ -package models.terms.meta; - -public enum OrderConstraint { - - EQ("=="), - LT("<"), - LE("<="), - GT(">"), - GE(">="), - ANY(""); - - private final String operator; - - private OrderConstraint(String operator) { - this.operator = operator; - } - - public String getOperator() { - return this.operator; - } - -} diff --git a/src/models/terms/meta/OrderVariableConstraint.java b/src/models/terms/meta/OrderVariableConstraint.java deleted file mode 100644 index 7a80c79..0000000 --- a/src/models/terms/meta/OrderVariableConstraint.java +++ /dev/null @@ -1,71 +0,0 @@ -package models.terms.meta; - -import lombok.Getter; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@Getter -public class OrderVariableConstraint implements Cloneable{ - - // lower <= x <= upper - private int upper = 100000000; - private int lower = -1; - private boolean isOk = true; - - public boolean setConstraint(int value, OrderConstraint constraint) { - switch (constraint) { - case ANY: - return true; - case EQ: - return setEq(value); - case GE: - return setUpper(value); - case GT: - return setUpper(value - 1); - case LE: - return setLower(value); - case LT: - return setLower(value + 1); - } - return false; - } - - public int getOrder() { - if (isOk) { - return lower; - } - return -1; - } - - private boolean setEq(int eq) { - return setUpper(eq) && setLower(eq); - } - - private boolean setUpper(int upper) { - if (isOk && this.lower <= upper && upper <= this.upper) { - this.upper = upper; - return true; - } - isOk = false; - return false; - } - - private boolean setLower(int lower) { - if (isOk && this.lower <= lower && lower <= this.upper) { - this.lower = lower; - return true; - } - isOk = false; - return false; - } - - @Override - public Object clone() { - OrderVariableConstraint constraint = new OrderVariableConstraint(); - constraint.isOk = isOk; - constraint.lower = lower; - constraint.upper = upper; - return constraint; - } - -} diff --git a/src/test/java/equivalence/SubstituteTest.java b/src/test/java/equivalence/SubstituteTest.java new file mode 100644 index 0000000..b46ea79 --- /dev/null +++ b/src/test/java/equivalence/SubstituteTest.java @@ -0,0 +1,78 @@ +package equivalence; + +import org.junit.jupiter.api.Test; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import inference.equivalence.MetaSemanticEquivalenceRelation; +import inference.equivalence.SemanticEquivalenceRelation; +import models.algebra.Variable; +import models.terms.DependencyTerm; +import models.terms.LinearRightNormalizedType; +import models.terms.RDLTerm; +import models.terms.Resource; +import models.terms.meta.MetaEvaluatableTermVariable; +import models.terms.meta.MetaRDLTerm; +import models.terms.meta.MetaResource; +import models.terms.meta.OrderConstraint; +import models.terms.meta.OrderVariableConstraint; +import utils.Utils; + +public class SubstituteTest { + + Resource A = new Resource("A", Utils.INT, 2); + Resource Ap = new Resource("A'", Utils.INT, 2); + Resource B = new Resource("B", Utils.INT, 2); + Resource Bp = new Resource("B'", Utils.INT, 2); + Resource C = new Resource("C", Utils.INT, 2); + Resource Cp = new Resource("C'", Utils.INT, 2); + Resource D = new Resource("D", Utils.INT, 2); + Resource E = new Resource("E", Utils.INT, 1); + Resource F = new Resource("F", Utils.INT, 1); + Resource G = new Resource("G", Utils.INT, 0); + + @Test + void SubstituteTest1() { + MetaResource v = new MetaResource(new Variable("v"), Utils.parse("n + 1")); + MetaEvaluatableTermVariable t = new MetaEvaluatableTermVariable(new Variable("t"), Utils.parse("n")); + t.setLinearRightNormalizedType(LinearRightNormalizedType.LINEAR_RIGHT_NORMALIZED); + MetaSemanticEquivalenceRelation r1 = new MetaSemanticEquivalenceRelation(new MetaRDLTerm(v, v, t), t, new Variable("n")); + DependencyTerm t1 = new DependencyTerm(A, A, E); + var tmp = r1.substitute(t1, List.of(Ap, Bp, C, Cp, D, E, F, G)); + for(var a : tmp) { + System.out.println(a); + } + } + + @Test + void SubstituteTest2() { + MetaEvaluatableTermVariable t = new MetaEvaluatableTermVariable(new Variable("t"), Utils.parse("n + 1")); + t.setLinearRightNormalizedType(LinearRightNormalizedType.LINEAR_RIGHT_NORMALIZED); + MetaEvaluatableTermVariable tp = new MetaEvaluatableTermVariable(new Variable("t'"), Utils.parse("n + 1")); + tp.setLinearRightNormalizedType(LinearRightNormalizedType.LINEAR_RIGHT_NORMALIZED); + MetaSemanticEquivalenceRelation r1 = new MetaSemanticEquivalenceRelation(t, tp, Utils.parse("n + 1")); + DependencyTerm t1 = new DependencyTerm(A, B, C); + DependencyTerm t2 = new DependencyTerm(Ap, Bp, Cp); + SemanticEquivalenceRelation r2 = new SemanticEquivalenceRelation(t1, t2, 2); + MetaResource v = new MetaResource(new Variable("v"), Utils.parse("n + 1")); + MetaEvaluatableTermVariable s = new MetaEvaluatableTermVariable(new Variable("s"), OrderConstraint.LT, Utils.parse("n + 1")); + MetaSemanticEquivalenceRelation r3 = new MetaSemanticEquivalenceRelation( + new MetaRDLTerm(t, v, s), + new MetaRDLTerm(tp, v, s), + Utils.parse("n") + ); + + Map binding = new HashMap<>(); + Map orderConstraint = new HashMap<>(); + r1.isMatchedBy(r2, binding, orderConstraint); + var tmp = r3.substitute(binding, orderConstraint, List.of(D, E, F, G)); + System.out.println(); + System.out.println(binding); + for(var a : tmp) { + System.out.println(a); + } + } + +} diff --git a/src/test/java/formulas/meta/MetaEquationFormulaTest.java b/src/test/java/formulas/meta/MetaEquationFormulaTest.java new file mode 100644 index 0000000..e77d072 --- /dev/null +++ b/src/test/java/formulas/meta/MetaEquationFormulaTest.java @@ -0,0 +1,67 @@ +package formulas.meta; + +import static org.junit.jupiter.api.Assertions.*; +import static utils.Utils.*; + +import org.junit.jupiter.api.Test; + +import models.algebra.Variable; +import models.formulas.DependencyFormula; +import models.formulas.EquationFormula; +import models.formulas.meta.MetaDependencyFormula; +import models.formulas.meta.MetaEquationFormula; +import models.terms.Dependency; +import models.terms.DependencyTerm; +import models.terms.EvaluatableTerm; +import models.terms.Resource; +import models.terms.meta.MetaEvaluatableTermVariable; +import models.terms.meta.MetaRDLTerm; +import models.terms.meta.MetaResource; + +public class MetaEquationFormulaTest { + + @Test + void MetaEquationFormulaMatchingTest() { + + Resource a = new Resource("a", INT, 0); + Resource b = new Resource("b", INT, 0); + Resource c = new Resource("c", INT, 0); + Resource d = new Resource("d", INT, 0); + EvaluatableTerm te1 = new DependencyTerm(a, b, c); + EvaluatableTerm te2 = new DependencyTerm(a, b, d); + EquationFormula formula = new EquationFormula(te1, te2); + + + MetaEvaluatableTermVariable se = new MetaEvaluatableTermVariable(new Variable("se")); + MetaResource v = new MetaResource(new Variable("v")); + MetaEvaluatableTermVariable te = new MetaEvaluatableTermVariable(new Variable("te")); + MetaEvaluatableTermVariable ue = new MetaEvaluatableTermVariable(new Variable("ue")); + MetaRDLTerm left = new MetaRDLTerm(se, v, te); + MetaRDLTerm right = new MetaRDLTerm(se, v, ue); + MetaEquationFormula metaFormula = new MetaEquationFormula(left, right); + + // [a : b -> c] = [a : b -> d] matches [se : v -> te] = [se : v -> ue] + assertTrue(metaFormula.isMatchedBy(formula)); + + } + + @Test + void MetaDependencyFormulaMatchingTest() { + Resource a = new Resource("a", INT, 0); + Resource b = new Resource("b", INT, 0); + Resource c = new Resource("c", INT, 0); + EvaluatableTerm te1 = new DependencyTerm(a, b, c); + Resource d = new Resource("d", INT, 0); + Dependency d1 = new Dependency(te1, d); + DependencyFormula depF = new DependencyFormula(d1); + + MetaEvaluatableTermVariable te = new MetaEvaluatableTermVariable(new Variable("te")); + MetaResource w = new MetaResource(new Variable("w")); + MetaRDLTerm dep = new MetaRDLTerm(te, w); + MetaDependencyFormula metaDepF = new MetaDependencyFormula(dep); + + //[a : b -> c] : d matches te : w + assertTrue(metaDepF.isMatchedBy(depF)); + } + +} diff --git a/src/test/java/inferencerule/InferenceRuleTest.java b/src/test/java/inferencerule/InferenceRuleTest.java new file mode 100644 index 0000000..c6ea6b0 --- /dev/null +++ b/src/test/java/inferencerule/InferenceRuleTest.java @@ -0,0 +1,78 @@ +package inferencerule; + +import static org.junit.jupiter.api.Assertions.*; +import static utils.Utils.*; + +import org.junit.jupiter.api.Test; + +import java.util.List; + +import inference.InferenceRule; +import models.algebra.Variable; +import models.formulas.DependencyFormula; +import models.formulas.EquationFormula; +import models.formulas.meta.MetaDependencyFormula; +import models.formulas.meta.MetaEquationFormula; +import models.terms.Dependency; +import models.terms.DependencyTerm; +import models.terms.Resource; +import models.terms.meta.MetaEvaluatableTermVariable; +import models.terms.meta.MetaRDLTerm; +import models.terms.meta.MetaResource; +public class InferenceRuleTest { + + @Test + void InferenceRuleTerst1() { + MetaEvaluatableTermVariable te = new MetaEvaluatableTermVariable(new Variable("te")); + MetaResource v = new MetaResource(new Variable("v")); + MetaResource w = new MetaResource(new Variable("w")); + MetaRDLTerm metaD1 = new MetaRDLTerm(te, v); + MetaRDLTerm metaD2 = new MetaRDLTerm(v, w); + MetaRDLTerm metaD3 = new MetaRDLTerm(te, w); + MetaDependencyFormula metaDf1 = new MetaDependencyFormula(metaD1); + MetaDependencyFormula metaDf2 = new MetaDependencyFormula(metaD2); + MetaDependencyFormula metaDf3 = new MetaDependencyFormula(metaD3); + InferenceRule goseShazo = new InferenceRule(List.of(metaDf1, metaDf2), metaDf3); + + Resource a = new Resource("a", INT, 0); + Resource b = new Resource("b", INT, 0); + Resource c = new Resource("c", INT, 0); + Dependency d1 = new Dependency(a, b); + Dependency d2 = new Dependency(b, c); + Dependency d3 = new Dependency(a, c); + DependencyFormula df1 = new DependencyFormula(d1); // a : b + DependencyFormula df2 = new DependencyFormula(d2); // b : c + DependencyFormula df3 = new DependencyFormula(d3); // a : c + assertTrue(goseShazo.check(List.of(df1, df2), df3)); + + } + + @Test + void InferencuRuleTest2() { + MetaEvaluatableTermVariable te = new MetaEvaluatableTermVariable(new Variable("te")); + MetaEvaluatableTermVariable ue = new MetaEvaluatableTermVariable(new Variable("ue")); + MetaEvaluatableTermVariable se = new MetaEvaluatableTermVariable(new Variable("se")); + MetaResource v = new MetaResource(new Variable("v")); + MetaEquationFormula assump1 = new MetaEquationFormula(te, ue); + MetaEquationFormula concl1 = new MetaEquationFormula(new MetaRDLTerm(se, v, te), new MetaRDLTerm(se, v, ue)); + /* + * te = ue + * ---------------------------------------- + * [se : v -> te] = [se : v -> ue] + */ + InferenceRule rightReplacement = new InferenceRule(List.of(assump1), concl1); + + Resource a = new Resource("a", INT, 0); + Resource c = new Resource("c", INT, 0); + Resource d = new Resource("d", INT, 0); + Resource x = new Resource("x", INT, 0); + Resource y = new Resource("y", INT, 0); + Resource z = new Resource("z", INT, 0); + DependencyTerm xyz = new DependencyTerm(x, y, z); + EquationFormula assump2 = new EquationFormula(a, xyz); // a = [x : y -> z] + EquationFormula concl2 = new EquationFormula(new DependencyTerm(c, d, a), new DependencyTerm(c, d, xyz)); // [c : d -> a] = [c : d -> [x : y -> z]] + + assertTrue(rightReplacement.check(List.of(assump2), concl2)); + } + +} diff --git a/src/test/java/terms/EqualsTest.java b/src/test/java/terms/EqualsTest.java new file mode 100644 index 0000000..f58b834 --- /dev/null +++ b/src/test/java/terms/EqualsTest.java @@ -0,0 +1,26 @@ +package terms; + +import static org.junit.jupiter.api.Assertions.*; + +import org.junit.jupiter.api.Test; + +import models.terms.DependencyTerm; +import models.terms.Resource; +import utils.Utils; +public class EqualsTest { + + @Test + void DependencyTermEqualsTest() { + Resource A = new Resource("A", Utils.INT, 1); + Resource B = new Resource("B", Utils.INT, 1); + Resource C = new Resource("C", Utils.INT, 1); + Resource D = new Resource("D", Utils.INT, 1); + Resource E = new Resource("E", Utils.INT, 1); + + DependencyTerm t1 = new DependencyTerm(A, B, C, D, E); + DependencyTerm t2 = new DependencyTerm(A, D, E, B, C); + assertTrue(t1.equals(t2)); + + } + +} diff --git a/src/test/java/terms/LinearRightNormalTest.java b/src/test/java/terms/LinearRightNormalTest.java new file mode 100644 index 0000000..1b48e72 --- /dev/null +++ b/src/test/java/terms/LinearRightNormalTest.java @@ -0,0 +1,96 @@ +package terms; + +import static org.junit.jupiter.api.Assertions.*; + +import org.junit.jupiter.api.Test; + +import models.algebra.Type; +import models.algebra.Variable; +import models.dataConstraintModel.DataConstraintModel; +import models.terms.DependencyTerm; +import models.terms.EvaluatableTerm; +import models.terms.LinearRightNormalizedType; +import models.terms.Resource; +import models.terms.meta.MetaEvaluatableTermVariable; +import models.terms.meta.MetaRDLTerm; +import models.terms.meta.MetaResource; + +public class LinearRightNormalTest { + + Type INT = DataConstraintModel.typeInt; + + @Test + void linearRightNormalTest() { + + + Resource a = new Resource("A", INT, 2); + Resource b = new Resource("B", INT, 2); + Resource c = new Resource("C", INT, 2); + Resource d = new Resource("D", INT, 2); + Resource e = new Resource("E", INT, 2); + Resource f = new Resource("F", INT, 2); + Resource g = new Resource("G", INT, 1); + + EvaluatableTerm te1 = new DependencyTerm(e, f, g); + EvaluatableTerm te2 = new DependencyTerm(c, d, te1); + EvaluatableTerm te3 = new DependencyTerm(a, b, te2); + //[a:b->[c:d->[e:f->g]]] + assertEquals(te3.isLinearRightNormalized(), true); + + EvaluatableTerm te4 = new DependencyTerm(a, b, c); + EvaluatableTerm te5 = new DependencyTerm(te4, d, e); + EvaluatableTerm te6 = new DependencyTerm(te5, f, g); + //[[[a:b->c]:d->e]:f->g] + assertEquals(te6.isLinearRightNormalized(), false); + } + + @Test + void linearRightNormalizeTest() { + + Resource a = new Resource("A", INT, 2); + Resource b = new Resource("B", INT, 2); + Resource c = new Resource("C", INT, 2); + Resource d = new Resource("D", INT, 2); + Resource e = new Resource("E", INT, 2); + Resource f = new Resource("F", INT, 2); + Resource g = new Resource("G", INT, 1); + + EvaluatableTerm te1 = new DependencyTerm(a, b, c); + EvaluatableTerm te2 = new DependencyTerm(te1, d, e); + EvaluatableTerm te3 = new DependencyTerm(te2, f, g); + + assertEquals(te3.isLinearRightNormalized(), false); + te3.selfLinearRightNormalize(); + assertEquals(te3.isLinearRightNormalized(), true); + } + + @Test + void linearRightNomalizedMatchTest() { + Resource a = new Resource("A", INT, 2); + Resource b = new Resource("B", INT, 2); + Resource c = new Resource("C", INT, 2); + Resource d = new Resource("D", INT, 2); + Resource e = new Resource("E", INT, 2); + Resource f = new Resource("F", INT, 2); + Resource g = new Resource("G", INT, 1); + + EvaluatableTerm te1 = new DependencyTerm(a, b, c); + EvaluatableTerm te2 = new DependencyTerm(te1, d, e); + EvaluatableTerm te3 = new DependencyTerm(te2, f, g); + + MetaEvaluatableTermVariable metaTerm = new MetaEvaluatableTermVariable(new Variable("x")); + MetaResource metaA = new MetaResource(new Variable("ma")); + MetaResource metaB = new MetaResource(new Variable("mb")); + MetaResource metaC = new MetaResource(new Variable("mc")); + MetaRDLTerm metaTerm2 = new MetaRDLTerm(metaA, metaB, metaC); + metaTerm2.setLinearRightNormalizedType(LinearRightNormalizedType.LINEAR_RIGHT_NORMALIZED); + + + metaTerm.setLinearRightNormalizedType(LinearRightNormalizedType.LINEAR_RIGHT_NORMALIZED); + assertEquals(metaTerm.isMatchedBy(te3), false); + te3.selfLinearRightNormalize(); + assertEquals(metaTerm.isMatchedBy(te3), true); + assertEquals(metaTerm2.isMatchedBy(te1), true); + } + +} diff --git a/src/test/java/terms/meta/MetaDependencyVariableTest.java b/src/test/java/terms/meta/MetaDependencyVariableTest.java new file mode 100644 index 0000000..e04205f --- /dev/null +++ b/src/test/java/terms/meta/MetaDependencyVariableTest.java @@ -0,0 +1,129 @@ +package terms.meta; + +import static org.junit.jupiter.api.Assertions.*; +import static utils.Utils.*; + +import org.junit.jupiter.api.Test; + +import models.algebra.Constant; +import models.algebra.Variable; +import models.terms.Dependency; +import models.terms.DependencyTerm; +import models.terms.Resource; +import models.terms.meta.MetaDependencyVariable; +import models.terms.meta.OrderConstraint; + +public class MetaDependencyVariableTest { + + @Test + void MetaDependencyVariableMatchingWithoutOrderTest() { + Resource a = new Resource("a", INT, 1); + Resource b = new Resource("b", INT, 1); + Resource c = new Resource("c", INT, 1); + Dependency dep1 = new Dependency(a, b); + Dependency dep2 = new Dependency(dep1); + DependencyTerm te1 = new DependencyTerm(a, b, c); + + MetaDependencyVariable d = new MetaDependencyVariable(new Variable("d")); + // [a : b] mathces d(dependency) + assertTrue(d.isMatchedBy(dep1)); + // [[a : b]] mathces d(dependency) + assertTrue(d.isMatchedBy(dep2)); + // a does not mathc d(dependency) + assertFalse(d.isMatchedBy(a)); + // [a : b -> c] does not mathc d(dependency) + assertFalse(d.isMatchedBy(te1)); + } + + @Test + void MetaDependencyVariableMatchingWithConstantOrderEQTest() { + Resource a = new Resource("a", INT, 1); + Resource b = new Resource("b", INT, 1); + Resource c = new Resource("c", INT, 2); + Dependency dep1 = new Dependency(a, b); + Dependency dep2 = new Dependency(a, c); + + MetaDependencyVariable d = new MetaDependencyVariable(new Variable("d"), new Constant("1")); + // [a : b](1) mathces d(=1) + assertTrue(d.isMatchedBy(dep1)); + // [a : c](2) does not mathc d(=1) + assertFalse(d.isMatchedBy(dep2)); + } + + @Test + void MetaDependencyVariableMatchingWithConstantOrderLTTest() { + Resource a = new Resource("a", INT, 0); + Resource b = new Resource("b", INT, 1); + Resource c = new Resource("c", INT, 2); + Resource e = new Resource("e", INT, 0); + Dependency dep1 = new Dependency(a, b); + Dependency dep2 = new Dependency(a, c); + Dependency dep3 = new Dependency(a, e); + + MetaDependencyVariable d = new MetaDependencyVariable(new Variable("d"), OrderConstraint.LT, new Constant("1")); + // [a : b](1) does not match d(<1) + assertFalse(d.isMatchedBy(dep1)); + // [a : c](2) does not match d(<1) + assertFalse(d.isMatchedBy(dep2)); + // [a : e](0) matches d(<1) + assertTrue(d.isMatchedBy(dep3)); + } + + @Test + void MetaDependencyVariableMatchingWithConstantOrderLETest() { + Resource a = new Resource("a", INT, 0); + Resource b = new Resource("b", INT, 1); + Resource c = new Resource("c", INT, 2); + Resource e = new Resource("e", INT, 0); + Dependency dep1 = new Dependency(a, b); + Dependency dep2 = new Dependency(a, c); + Dependency dep3 = new Dependency(a, e); + + MetaDependencyVariable d = new MetaDependencyVariable(new Variable("d"), OrderConstraint.LE, new Constant("1")); + // [a : b](1) matches d(<=1) + assertTrue(d.isMatchedBy(dep1)); + // [a : c](2) does not match d(<=1) + assertFalse(d.isMatchedBy(dep2)); + // [a : e](0) matches d(<=1) + assertTrue(d.isMatchedBy(dep3)); + } + + @Test + void MetaDependencyVariableMatchingWithConstantOrderGTTest() { + Resource a = new Resource("a", INT, 0); + Resource b = new Resource("b", INT, 1); + Resource c = new Resource("c", INT, 2); + Resource e = new Resource("e", INT, 0); + Dependency dep1 = new Dependency(a, b); + Dependency dep2 = new Dependency(a, c); + Dependency dep3 = new Dependency(a, e); + + MetaDependencyVariable d = new MetaDependencyVariable(new Variable("d"), OrderConstraint.GT, new Constant("1")); + // [a : b](1) does not match d(>1) + assertFalse(d.isMatchedBy(dep1)); + // [a : c](2) matches d(>1) + assertTrue(d.isMatchedBy(dep2)); + // [a : e](0) does not match d(>1) + assertFalse(d.isMatchedBy(dep3)); + } + + @Test + void MetaDependencyVariableMatchingWithConstantOrderGETest() { + Resource a = new Resource("a", INT, 0); + Resource b = new Resource("b", INT, 1); + Resource c = new Resource("c", INT, 2); + Resource e = new Resource("e", INT, 0); + Dependency dep1 = new Dependency(a, b); + Dependency dep2 = new Dependency(a, c); + Dependency dep3 = new Dependency(a, e); + + MetaDependencyVariable d = new MetaDependencyVariable(new Variable("d"), OrderConstraint.GE, new Constant("1")); + // [a : b](1) matches d(>=1) + assertTrue(d.isMatchedBy(dep1)); + // [a : c](2) matches d(>=1) + assertTrue(d.isMatchedBy(dep2)); + // [a : e](0) does not match d(>=1) + assertFalse(d.isMatchedBy(dep3)); + } + +} diff --git a/src/test/java/terms/meta/MetaEvaluatableTermVariableTest.java b/src/test/java/terms/meta/MetaEvaluatableTermVariableTest.java new file mode 100644 index 0000000..804a07f --- /dev/null +++ b/src/test/java/terms/meta/MetaEvaluatableTermVariableTest.java @@ -0,0 +1,32 @@ +package terms.meta; + +import static org.junit.jupiter.api.Assertions.*; + +import org.junit.jupiter.api.Test; + +import models.algebra.Variable; +import models.terms.DependencyTerm; +import models.terms.Resource; +import models.terms.ResourceConstant; +import models.terms.meta.MetaEvaluatableTermVariable; +import utils.Utils; + + +public class MetaEvaluatableTermVariableTest { + + @Test + void isMatchedByTest() { + MetaEvaluatableTermVariable se = new MetaEvaluatableTermVariable(new Variable("se")); + + Resource a = new Resource("a", Utils.INT, 1); + Resource b = new Resource("b", Utils.INT, 1); + Resource c = new Resource("c", Utils.INT, 1); + ResourceConstant one = new ResourceConstant("1"); + DependencyTerm t1 = new DependencyTerm(a, b, c); + + assertTrue(se.isMatchedBy(a)); + assertTrue(se.isMatchedBy(one)); + assertTrue(se.isMatchedBy(t1)); + } + +} diff --git a/src/test/java/terms/meta/MetaRDLTermTest.java b/src/test/java/terms/meta/MetaRDLTermTest.java new file mode 100644 index 0000000..0aca615 --- /dev/null +++ b/src/test/java/terms/meta/MetaRDLTermTest.java @@ -0,0 +1,98 @@ +package terms.meta; + +import static org.junit.jupiter.api.Assertions.*; +import static utils.Utils.*; + +import org.junit.jupiter.api.Test; + +import models.algebra.Constant; +import models.algebra.Variable; +import models.terms.Dependency; +import models.terms.DependencyTerm; +import models.terms.Resource; +import models.terms.meta.MetaDependencyTermVariable; +import models.terms.meta.MetaRDLTerm; +import models.terms.meta.MetaResource; +public class MetaRDLTermTest { + + @Test + void MetaDependencyMatchingWithoutOrderTest() { + Resource a = new Resource("a", INT, 1); + Resource b = new Resource("b", INT, 1); + Resource c = new Resource("c", INT, 1); + Dependency dep1 = new Dependency(a, b); + DependencyTerm te1 = new DependencyTerm(a, b, c); + Dependency dep2 = new Dependency(te1, b); + + MetaResource v1 = new MetaResource(new Variable("v1")); + MetaResource v2 = new MetaResource(new Variable("v2")); + MetaResource v3 = new MetaResource(new Variable("v3")); + MetaDependencyTermVariable vte = new MetaDependencyTermVariable(new Variable("vte")); + MetaRDLTerm metaDep = new MetaRDLTerm(v1, v2); + MetaRDLTerm metaDep2 = new MetaRDLTerm(vte, v2); + MetaRDLTerm metaTe = new MetaRDLTerm(v1, v2, v3); + MetaRDLTerm metaDep3 = new MetaRDLTerm(metaTe, v2); + MetaRDLTerm metaDep4 = new MetaRDLTerm(metaTe, v3); + + //[a : b] matches [v1 : v2] + assertTrue(metaDep.isMatchedBy(dep1)); + //[[a : b -> c] : b] does not match [v1 : v2] + assertFalse(metaDep.isMatchedBy(dep2)); + //[[a : b -> c] : b] matches [vte : v2] + assertTrue(metaDep2.isMatchedBy(dep2)); + //[[a : b -> c] : b] matches [[v1 : v2 -> v3] : v2] + assertTrue(metaDep3.isMatchedBy(dep2)); + //[[a : b -> c] : b] does not match [[v1 : v2 -> v3] : v3] + assertFalse(metaDep4.isMatchedBy(dep2)); + } + + @Test + void MetaDependencyMatchingWithConstantOrderTest() { + MetaResource v1 = new MetaResource(new Variable("v1"), new Constant("1")); + MetaResource v2 = new MetaResource(new Variable("v2"), new Constant("2")); + MetaRDLTerm vd1 = new MetaRDLTerm(v1, v2); + + Resource a1 = new Resource("a1", INT, 1); + Resource a2 = new Resource("a2", INT, 2); + Dependency d1 = new Dependency(a1, a2); + //[1 : 2] matches [1 : 2] + assertTrue(vd1.isMatchedBy(d1)); + + Resource b1 = new Resource("b1", INT, 1); + Dependency d2 = new Dependency(a1, b1); + //[1 : 1] does not match [1 : 2] + assertFalse(vd1.isMatchedBy(d2)); + } + + @Test + void MetaDependencyMatchingWithVariableOrderTest() { + MetaResource v1 = new MetaResource(new Variable("v1"), parse("x")); + MetaResource v2 = new MetaResource(new Variable("v2"), parse("x")); + MetaResource v3 = new MetaResource(new Variable("v3"), parse("y")); + MetaRDLTerm vd1 = new MetaRDLTerm(v1, v2); + MetaRDLTerm vd2 = new MetaRDLTerm(v1, v3); + MetaRDLTerm vd3 = new MetaRDLTerm(new MetaRDLTerm(v3, v1), v2); + + Resource a1 = new Resource("a1", INT, 1); + Resource a2 = new Resource("a2", INT, 2); + Resource b1 = new Resource("b1", INT, 1); + Resource b2 = new Resource("b2", INT, 2); + Dependency d1 = new Dependency(a1, a2); + Dependency d2 = new Dependency(a1, b1); + Dependency d3 = new Dependency(new Dependency(a1, b1), a2); + Dependency d4 = new Dependency(new Dependency(a1, a2), b2); + //[1 : 2] does not match [x : x] + assertFalse(vd1.isMatchedBy(d1)); + //[1 : 1] matches [x : x] + assertTrue(vd1.isMatchedBy(d2)); + //[1 : 2] matches [x : y] + assertTrue(vd2.isMatchedBy(d1)); + //[1 : 1] matches [x : y] + assertTrue(vd2.isMatchedBy(d2)); + //[[1 : 1] : 2] does not match [[y : x] : x] + assertFalse(vd3.isMatchedBy(d3)); + //[[1 : 2] : 2] matches [[y : x] : x] + assertTrue(vd3.isMatchedBy(d4)); + } + +} diff --git a/src/test/java/terms/meta/MetaResourceVariableTest.java b/src/test/java/terms/meta/MetaResourceVariableTest.java new file mode 100644 index 0000000..f076729 --- /dev/null +++ b/src/test/java/terms/meta/MetaResourceVariableTest.java @@ -0,0 +1,162 @@ +package terms.meta; + +import static org.junit.jupiter.api.Assertions.*; +import static utils.Utils.*; + +import org.junit.jupiter.api.Test; + +import models.algebra.Variable; +import models.terms.Dependency; +import models.terms.DependencyTerm; +import models.terms.Resource; +import models.terms.meta.MetaDependencyTermVariable; +import models.terms.meta.MetaDependencyVariable; +import models.terms.meta.MetaEvaluatableTermVariable; +import models.terms.meta.MetaRDLTermVariable; +import models.terms.meta.MetaResource; +import models.terms.meta.OrderConstraint; +public class MetaResourceVariableTest { + + @Test + void MetaResourceVariableMathcingWithoutOrder() { + Resource a = new Resource("a", INT, 0); + Resource b = new Resource("b", INT, 0); + Resource c = new Resource("c", INT, 0); + Dependency dep = new Dependency(a, b); + DependencyTerm depTerm = new DependencyTerm(a, b, c); + + MetaResource x = new MetaResource(new Variable("x")); + MetaDependencyVariable d = new MetaDependencyVariable(new Variable("d")); + MetaDependencyTermVariable dte = new MetaDependencyTermVariable(new Variable("dte")); + MetaEvaluatableTermVariable te = new MetaEvaluatableTermVariable(new Variable("te")); + MetaRDLTermVariable t = new MetaRDLTermVariable(new Variable("t")); + + // a matches x(resource variable) + assertTrue(x.isMatchedBy(a)); + // a does not match d(dependency) + assertFalse(d.isMatchedBy(a)); + // a does not match dte(dependency term) + assertFalse(dte.isMatchedBy(a)); + // a matches te(evaluatable term) + assertTrue(te.isMatchedBy(a)); + // a matches t(term) + assertTrue(t.isMatchedBy(a)); + // [a : b] does not match x(resource variable) + assertFalse(x.isMatchedBy(dep)); + // [a : b -> c] does not match x(resource variable) + assertFalse(x.isMatchedBy(depTerm)); + } + + @Test + void MetaResourceVariableMathcingWithConstantOrderEQ() { + Resource a = new Resource("a", INT, 1); + MetaResource x = new MetaResource(new Variable("x"), parse("0")); + MetaResource y = new MetaResource(new Variable("y"), parse("1")); + //a(1) does not match x(=0) + assertFalse(x.isMatchedBy(a)); + //a(1) matches y(=1) + assertTrue(y.isMatchedBy(a)); + } + + @Test + void MetaResourceVariableMathcingWithConstantOrderLT() { + Resource a = new Resource("a", INT, 1); + MetaResource x = new MetaResource(new Variable("x"), OrderConstraint.LT, parse("0")); + MetaResource y = new MetaResource(new Variable("y"), OrderConstraint.LT, parse("1")); + MetaResource z = new MetaResource(new Variable("z"), OrderConstraint.LT, parse("2")); + //a(1) does not match x(<0) + assertFalse(x.isMatchedBy(a)); + //a(1) matches y(<1) + assertFalse(y.isMatchedBy(a)); + //a(1) matches z(<2) + assertTrue(z.isMatchedBy(a)); + } + + @Test + void MetaResourceVariableMathcingWithConstantOrderLE() { + Resource a = new Resource("a", INT, 1); + MetaResource x = new MetaResource(new Variable("x"), OrderConstraint.LE, parse("0")); + MetaResource y = new MetaResource(new Variable("y"), OrderConstraint.LE, parse("1")); + MetaResource z = new MetaResource(new Variable("z"), OrderConstraint.LE, parse("2")); + //a(1) does not match x(<=0) + assertFalse(x.isMatchedBy(a)); + //a(1) matches y(<=1) + assertTrue(y.isMatchedBy(a)); + //a(1) matches z(<=2) + assertTrue(z.isMatchedBy(a)); + } + + @Test + void MetaResourceVariableMathcingWithConstantOrderGT() { + Resource a = new Resource("a", INT, 1); + MetaResource x = new MetaResource(new Variable("x"), OrderConstraint.GT, parse("0")); + MetaResource y = new MetaResource(new Variable("y"), OrderConstraint.GT, parse("1")); + MetaResource z = new MetaResource(new Variable("z"), OrderConstraint.GT, parse("2")); + //a(1) does not match x(>0) + assertTrue(x.isMatchedBy(a)); + //a(1) matches y(>1) + assertFalse(y.isMatchedBy(a)); + //a(1) matches z(>2) + assertFalse(z.isMatchedBy(a)); + } + + @Test + void MetaResourceVariableMathcingWithConstantOrderGE() { + Resource a = new Resource("a", INT, 1); + MetaResource x = new MetaResource(new Variable("x"), OrderConstraint.GE, parse("0")); + MetaResource y = new MetaResource(new Variable("y"), OrderConstraint.GE, parse("1")); + MetaResource z = new MetaResource(new Variable("z"), OrderConstraint.GE, parse("2")); + //a(1) does not match x(>=0) + assertTrue(x.isMatchedBy(a)); + //a(1) matches y(>=1) + assertTrue(y.isMatchedBy(a)); + //a(1) matches z(>2) + assertFalse(z.isMatchedBy(a)); + } + + @Test + void MetaResourceVariableMathcingWithVariableOrderEq() { + Resource a = new Resource("a", INT, 0); + MetaResource x = new MetaResource(new Variable("x"), parse("x")); + + //a(0) matches x(=x) + assertTrue(x.isMatchedBy(a)); + } + + @Test + void MetaResourceVariableMathcingWithVariableOrderLT() { + Resource a = new Resource("a", INT, 2); + MetaResource x = new MetaResource(new Variable("x"), OrderConstraint.LT, parse("x")); + + //a(2) matches x(x) + assertTrue(x.isMatchedBy(a)); + } + + @Test + void MetaResourceVariableMathcingWithVariableOrderGE() { + Resource a = new Resource("a", INT, 2); + MetaResource x = new MetaResource(new Variable("x"), OrderConstraint.GE, parse("x")); + + //a(2) matches x( binding = new HashMap<>(); + Map orderConstraint = new HashMap<>(); + metaTerm1.isMatchedBy(t1, binding, orderConstraint); + RDLTerm assignedTerm = metaTerm1.substitute(binding); + assertEquals(t1, assignedTerm); + binding.clear(); + orderConstraint.clear(); + metaTerm1.isMatchedBy(t2, binding, orderConstraint); + assertEquals(t2, metaTerm1.substitute(binding)); + } + +} diff --git a/src/test/java/utils/DynamicDSUTest.java b/src/test/java/utils/DynamicDSUTest.java new file mode 100644 index 0000000..a73d5d7 --- /dev/null +++ b/src/test/java/utils/DynamicDSUTest.java @@ -0,0 +1,25 @@ +package utils; + +import static org.junit.jupiter.api.Assertions.*; + +import org.junit.jupiter.api.Test; + +import utils.DynamicDisjointSetUnion; + +public class DynamicDSUTest { + + @Test + void DDSUTest() { + DynamicDisjointSetUnion dsu = new DynamicDisjointSetUnion<>(); + dsu.add("a"); + dsu.add("b"); + dsu.add("c"); + dsu.union("a", "b"); + assertTrue(dsu.same("a", "b")); + assertFalse(dsu.same("a", "c")); + assertFalse(dsu.same("b", "c")); + + + } + +} diff --git a/src/test/java/utils/ProductTest.java b/src/test/java/utils/ProductTest.java new file mode 100644 index 0000000..8046d81 --- /dev/null +++ b/src/test/java/utils/ProductTest.java @@ -0,0 +1,31 @@ +package utils; + +import static org.junit.jupiter.api.Assertions.*; + +import org.junit.jupiter.api.Test; + +import java.util.List; + +public class ProductTest { + + @Test + void product() { + List> input = List.of( + List.of(1, 2), + List.of(3, 4), + List.of(5) + ); + + List> result = Product.product(input); + + List> expected = List.of( + List.of(1, 3, 5), + List.of(1, 4, 5), + List.of(2, 3, 5), + List.of(2, 4, 5) + ); + + assertEquals(expected, result); + } + +} diff --git a/src/test/java/utils/Utils.java b/src/test/java/utils/Utils.java new file mode 100644 index 0000000..fcf7adc --- /dev/null +++ b/src/test/java/utils/Utils.java @@ -0,0 +1,32 @@ +package utils; + + +import models.algebra.Expression; +import models.algebra.Type; +import models.dataConstraintModel.DataConstraintModel; +import models.dataFlowModel.DataTransferModel; +import parser.Parser; +import parser.Parser.TokenStream; +import parser.exceptions.ExpectedColon; +import parser.exceptions.ExpectedDoubleQuotation; +import parser.exceptions.ExpectedRightBracket; +import parser.exceptions.WrongJsonExpression; + +public class Utils { + + public static Type INT = DataConstraintModel.typeInt; + private static TokenStream stream = new Parser.TokenStream(); + private static Parser parser = new Parser(stream); + private static DataTransferModel model = new DataTransferModel(); + + public static Expression parse(String expr) { + stream.addLine(expr); + try { + return parser.parseTerm(stream, model); + } catch (ExpectedRightBracket | WrongJsonExpression | ExpectedColon | ExpectedDoubleQuotation e) { + e.printStackTrace(); + return null; + } + } + +} diff --git a/src/tests/Utils.java b/src/tests/Utils.java deleted file mode 100644 index d9e754e..0000000 --- a/src/tests/Utils.java +++ /dev/null @@ -1,31 +0,0 @@ -package tests; - -import models.algebra.Expression; -import models.algebra.Type; -import models.dataConstraintModel.DataConstraintModel; -import models.dataFlowModel.DataTransferModel; -import parser.Parser; -import parser.Parser.TokenStream; -import parser.exceptions.ExpectedColon; -import parser.exceptions.ExpectedDoubleQuotation; -import parser.exceptions.ExpectedRightBracket; -import parser.exceptions.WrongJsonExpression; - -public class Utils { - - public static Type INT = DataConstraintModel.typeInt; - private static TokenStream stream = new Parser.TokenStream(); - private static Parser parser = new Parser(stream); - private static DataTransferModel model = new DataTransferModel(); - - public static Expression parse(String expr) { - stream.addLine(expr); - try { - return parser.parseTerm(stream, model); - } catch (ExpectedRightBracket | WrongJsonExpression | ExpectedColon | ExpectedDoubleQuotation e) { - e.printStackTrace(); - return null; - } - } - -} diff --git a/src/tests/equivalence/SubstituteTest.java b/src/tests/equivalence/SubstituteTest.java deleted file mode 100644 index 15dfd37..0000000 --- a/src/tests/equivalence/SubstituteTest.java +++ /dev/null @@ -1,78 +0,0 @@ -package tests.equivalence; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.junit.jupiter.api.Test; - -import inference.equivalence.MetaSemanticEquivalenceRelation; -import inference.equivalence.SemanticEquivalenceRelation; -import models.algebra.Variable; -import models.terms.DependencyTerm; -import models.terms.LinearRightNormalizedType; -import models.terms.RDLTerm; -import models.terms.Resource; -import models.terms.meta.MetaEvaluatableTermVariable; -import models.terms.meta.MetaRDLTerm; -import models.terms.meta.MetaResource; -import models.terms.meta.OrderConstraint; -import models.terms.meta.OrderVariableConstraint; -import tests.Utils; - -public class SubstituteTest { - - Resource A = new Resource("A", Utils.INT, 2); - Resource Ap = new Resource("A'", Utils.INT, 2); - Resource B = new Resource("B", Utils.INT, 2); - Resource Bp = new Resource("B'", Utils.INT, 2); - Resource C = new Resource("C", Utils.INT, 2); - Resource Cp = new Resource("C'", Utils.INT, 2); - Resource D = new Resource("D", Utils.INT, 2); - Resource E = new Resource("E", Utils.INT, 1); - Resource F = new Resource("F", Utils.INT, 1); - Resource G = new Resource("G", Utils.INT, 0); - - @Test - void SubstituteTest1() { - MetaResource v = new MetaResource(new Variable("v"), Utils.parse("n + 1")); - MetaEvaluatableTermVariable t = new MetaEvaluatableTermVariable(new Variable("t"), Utils.parse("n")); - t.setLinearRightNormalizedType(LinearRightNormalizedType.LINEAR_RIGHT_NORMALIZED); - MetaSemanticEquivalenceRelation r1 = new MetaSemanticEquivalenceRelation(new MetaRDLTerm(v, v, t), t, new Variable("n")); - DependencyTerm t1 = new DependencyTerm(A, A, E); - var tmp = r1.substitute(t1, List.of(Ap, Bp, C, Cp, D, E, F, G)); - for(var a : tmp) { - System.out.println(a); - } - } - - @Test - void SubstituteTest2() { - MetaEvaluatableTermVariable t = new MetaEvaluatableTermVariable(new Variable("t"), Utils.parse("n + 1")); - t.setLinearRightNormalizedType(LinearRightNormalizedType.LINEAR_RIGHT_NORMALIZED); - MetaEvaluatableTermVariable tp = new MetaEvaluatableTermVariable(new Variable("t'"), Utils.parse("n + 1")); - tp.setLinearRightNormalizedType(LinearRightNormalizedType.LINEAR_RIGHT_NORMALIZED); - MetaSemanticEquivalenceRelation r1 = new MetaSemanticEquivalenceRelation(t, tp, Utils.parse("n + 1")); - DependencyTerm t1 = new DependencyTerm(A, B, C); - DependencyTerm t2 = new DependencyTerm(Ap, Bp, Cp); - SemanticEquivalenceRelation r2 = new SemanticEquivalenceRelation(t1, t2, 2); - MetaResource v = new MetaResource(new Variable("v"), Utils.parse("n + 1")); - MetaEvaluatableTermVariable s = new MetaEvaluatableTermVariable(new Variable("s"), OrderConstraint.LT, Utils.parse("n + 1")); - MetaSemanticEquivalenceRelation r3 = new MetaSemanticEquivalenceRelation( - new MetaRDLTerm(t, v, s), - new MetaRDLTerm(tp, v, s), - Utils.parse("n") - ); - - Map binding = new HashMap<>(); - Map orderConstraint = new HashMap<>(); - r1.isMatchedBy(r2, binding, orderConstraint); - var tmp = r3.substitute(binding, orderConstraint, List.of(D, E, F, G)); - System.out.println(); - System.out.println(binding); - for(var a : tmp) { - System.out.println(a); - } - } - -} diff --git a/src/tests/formulas/meta/MetaEquationFormulaTest.java b/src/tests/formulas/meta/MetaEquationFormulaTest.java deleted file mode 100644 index 16f2126..0000000 --- a/src/tests/formulas/meta/MetaEquationFormulaTest.java +++ /dev/null @@ -1,67 +0,0 @@ -package tests.formulas.meta; - -import static org.junit.jupiter.api.Assertions.*; -import static tests.Utils.*; - -import org.junit.jupiter.api.Test; - -import models.algebra.Variable; -import models.formulas.DependencyFormula; -import models.formulas.EquationFormula; -import models.formulas.meta.MetaDependencyFormula; -import models.formulas.meta.MetaEquationFormula; -import models.terms.Dependency; -import models.terms.DependencyTerm; -import models.terms.EvaluatableTerm; -import models.terms.Resource; -import models.terms.meta.MetaEvaluatableTermVariable; -import models.terms.meta.MetaRDLTerm; -import models.terms.meta.MetaResource; - -public class MetaEquationFormulaTest { - - @Test - void MetaEquationFormulaMatchingTest() { - - Resource a = new Resource("a", INT, 0); - Resource b = new Resource("b", INT, 0); - Resource c = new Resource("c", INT, 0); - Resource d = new Resource("d", INT, 0); - EvaluatableTerm te1 = new DependencyTerm(a, b, c); - EvaluatableTerm te2 = new DependencyTerm(a, b, d); - EquationFormula formula = new EquationFormula(te1, te2); - - - MetaEvaluatableTermVariable se = new MetaEvaluatableTermVariable(new Variable("se")); - MetaResource v = new MetaResource(new Variable("v")); - MetaEvaluatableTermVariable te = new MetaEvaluatableTermVariable(new Variable("te")); - MetaEvaluatableTermVariable ue = new MetaEvaluatableTermVariable(new Variable("ue")); - MetaRDLTerm left = new MetaRDLTerm(se, v, te); - MetaRDLTerm right = new MetaRDLTerm(se, v, ue); - MetaEquationFormula metaFormula = new MetaEquationFormula(left, right); - - // [a : b -> c] = [a : b -> d] matches [se : v -> te] = [se : v -> ue] - assertTrue(metaFormula.isMatchedBy(formula)); - - } - - @Test - void MetaDependencyFormulaMatchingTest() { - Resource a = new Resource("a", INT, 0); - Resource b = new Resource("b", INT, 0); - Resource c = new Resource("c", INT, 0); - EvaluatableTerm te1 = new DependencyTerm(a, b, c); - Resource d = new Resource("d", INT, 0); - Dependency d1 = new Dependency(te1, d); - DependencyFormula depF = new DependencyFormula(d1); - - MetaEvaluatableTermVariable te = new MetaEvaluatableTermVariable(new Variable("te")); - MetaResource w = new MetaResource(new Variable("w")); - MetaRDLTerm dep = new MetaRDLTerm(te, w); - MetaDependencyFormula metaDepF = new MetaDependencyFormula(dep); - - //[a : b -> c] : d matches te : w - assertTrue(metaDepF.isMatchedBy(depF)); - } - -} diff --git a/src/tests/inferencerule/InferenceRuleTest.java b/src/tests/inferencerule/InferenceRuleTest.java deleted file mode 100644 index dd70b94..0000000 --- a/src/tests/inferencerule/InferenceRuleTest.java +++ /dev/null @@ -1,79 +0,0 @@ -package tests.inferencerule; - -import static org.junit.jupiter.api.Assertions.*; -import static tests.Utils.*; - -import java.util.List; - -import org.junit.jupiter.api.Test; - -import inference.InferenceRule; -import models.algebra.Variable; -import models.formulas.DependencyFormula; -import models.formulas.EquationFormula; -import models.formulas.meta.MetaDependencyFormula; -import models.formulas.meta.MetaEquationFormula; -import models.terms.Dependency; -import models.terms.DependencyTerm; -import models.terms.Resource; -import models.terms.meta.MetaEvaluatableTermVariable; -import models.terms.meta.MetaRDLTerm; -import models.terms.meta.MetaResource; - -public class InferenceRuleTest { - - @Test - void InferenceRuleTerst1() { - MetaEvaluatableTermVariable te = new MetaEvaluatableTermVariable(new Variable("te")); - MetaResource v = new MetaResource(new Variable("v")); - MetaResource w = new MetaResource(new Variable("w")); - MetaRDLTerm metaD1 = new MetaRDLTerm(te, v); - MetaRDLTerm metaD2 = new MetaRDLTerm(v, w); - MetaRDLTerm metaD3 = new MetaRDLTerm(te, w); - MetaDependencyFormula metaDf1 = new MetaDependencyFormula(metaD1); - MetaDependencyFormula metaDf2 = new MetaDependencyFormula(metaD2); - MetaDependencyFormula metaDf3 = new MetaDependencyFormula(metaD3); - InferenceRule goseShazo = new InferenceRule(List.of(metaDf1, metaDf2), metaDf3); - - Resource a = new Resource("a", INT, 0); - Resource b = new Resource("b", INT, 0); - Resource c = new Resource("c", INT, 0); - Dependency d1 = new Dependency(a, b); - Dependency d2 = new Dependency(b, c); - Dependency d3 = new Dependency(a, c); - DependencyFormula df1 = new DependencyFormula(d1); // a : b - DependencyFormula df2 = new DependencyFormula(d2); // b : c - DependencyFormula df3 = new DependencyFormula(d3); // a : c - assertTrue(goseShazo.check(List.of(df1, df2), df3)); - - } - - @Test - void InferencuRuleTest2() { - MetaEvaluatableTermVariable te = new MetaEvaluatableTermVariable(new Variable("te")); - MetaEvaluatableTermVariable ue = new MetaEvaluatableTermVariable(new Variable("ue")); - MetaEvaluatableTermVariable se = new MetaEvaluatableTermVariable(new Variable("se")); - MetaResource v = new MetaResource(new Variable("v")); - MetaEquationFormula assump1 = new MetaEquationFormula(te, ue); - MetaEquationFormula concl1 = new MetaEquationFormula(new MetaRDLTerm(se, v, te), new MetaRDLTerm(se, v, ue)); - /* - * te = ue - * ---------------------------------------- - * [se : v -> te] = [se : v -> ue] - */ - InferenceRule rightReplacement = new InferenceRule(List.of(assump1), concl1); - - Resource a = new Resource("a", INT, 0); - Resource c = new Resource("c", INT, 0); - Resource d = new Resource("d", INT, 0); - Resource x = new Resource("x", INT, 0); - Resource y = new Resource("y", INT, 0); - Resource z = new Resource("z", INT, 0); - DependencyTerm xyz = new DependencyTerm(x, y, z); - EquationFormula assump2 = new EquationFormula(a, xyz); // a = [x : y -> z] - EquationFormula concl2 = new EquationFormula(new DependencyTerm(c, d, a), new DependencyTerm(c, d, xyz)); // [c : d -> a] = [c : d -> [x : y -> z]] - - assertTrue(rightReplacement.check(List.of(assump2), concl2)); - } - -} diff --git a/src/tests/terms/EqualsTest.java b/src/tests/terms/EqualsTest.java deleted file mode 100644 index 282f58c..0000000 --- a/src/tests/terms/EqualsTest.java +++ /dev/null @@ -1,27 +0,0 @@ -package tests.terms; - -import static org.junit.jupiter.api.Assertions.*; - -import org.junit.jupiter.api.Test; - -import models.terms.DependencyTerm; -import models.terms.Resource; -import tests.Utils; - -public class EqualsTest { - - @Test - void DependencyTermEqualsTest() { - Resource A = new Resource("A", Utils.INT, 1); - Resource B = new Resource("B", Utils.INT, 1); - Resource C = new Resource("C", Utils.INT, 1); - Resource D = new Resource("D", Utils.INT, 1); - Resource E = new Resource("E", Utils.INT, 1); - - DependencyTerm t1 = new DependencyTerm(A, B, C, D, E); - DependencyTerm t2 = new DependencyTerm(A, D, E, B, C); - assertTrue(t1.equals(t2)); - - } - -} diff --git a/src/tests/terms/LinearRightNormalTest.java b/src/tests/terms/LinearRightNormalTest.java deleted file mode 100644 index 872a1f5..0000000 --- a/src/tests/terms/LinearRightNormalTest.java +++ /dev/null @@ -1,96 +0,0 @@ -package tests.terms; - -import static org.junit.jupiter.api.Assertions.*; - -import org.junit.jupiter.api.Test; - -import models.algebra.Type; -import models.algebra.Variable; -import models.dataConstraintModel.DataConstraintModel; -import models.terms.DependencyTerm; -import models.terms.EvaluatableTerm; -import models.terms.LinearRightNormalizedType; -import models.terms.Resource; -import models.terms.meta.MetaEvaluatableTermVariable; -import models.terms.meta.MetaRDLTerm; -import models.terms.meta.MetaResource; - -public class LinearRightNormalTest { - - Type INT = DataConstraintModel.typeInt; - - @Test - void linearRightNormalTest() { - - - Resource a = new Resource("A", INT, 2); - Resource b = new Resource("B", INT, 2); - Resource c = new Resource("C", INT, 2); - Resource d = new Resource("D", INT, 2); - Resource e = new Resource("E", INT, 2); - Resource f = new Resource("F", INT, 2); - Resource g = new Resource("G", INT, 1); - - EvaluatableTerm te1 = new DependencyTerm(e, f, g); - EvaluatableTerm te2 = new DependencyTerm(c, d, te1); - EvaluatableTerm te3 = new DependencyTerm(a, b, te2); - //[a:b->[c:d->[e:f->g]]] - assertEquals(te3.isLinearRightNormalized(), true); - - EvaluatableTerm te4 = new DependencyTerm(a, b, c); - EvaluatableTerm te5 = new DependencyTerm(te4, d, e); - EvaluatableTerm te6 = new DependencyTerm(te5, f, g); - //[[[a:b->c]:d->e]:f->g] - assertEquals(te6.isLinearRightNormalized(), false); - } - - @Test - void linearRightNormalizeTest() { - - Resource a = new Resource("A", INT, 2); - Resource b = new Resource("B", INT, 2); - Resource c = new Resource("C", INT, 2); - Resource d = new Resource("D", INT, 2); - Resource e = new Resource("E", INT, 2); - Resource f = new Resource("F", INT, 2); - Resource g = new Resource("G", INT, 1); - - EvaluatableTerm te1 = new DependencyTerm(a, b, c); - EvaluatableTerm te2 = new DependencyTerm(te1, d, e); - EvaluatableTerm te3 = new DependencyTerm(te2, f, g); - - assertEquals(te3.isLinearRightNormalized(), false); - te3.selfLinearRightNormalize(); - assertEquals(te3.isLinearRightNormalized(), true); - } - - @Test - void linearRightNomalizedMatchTest() { - Resource a = new Resource("A", INT, 2); - Resource b = new Resource("B", INT, 2); - Resource c = new Resource("C", INT, 2); - Resource d = new Resource("D", INT, 2); - Resource e = new Resource("E", INT, 2); - Resource f = new Resource("F", INT, 2); - Resource g = new Resource("G", INT, 1); - - EvaluatableTerm te1 = new DependencyTerm(a, b, c); - EvaluatableTerm te2 = new DependencyTerm(te1, d, e); - EvaluatableTerm te3 = new DependencyTerm(te2, f, g); - - MetaEvaluatableTermVariable metaTerm = new MetaEvaluatableTermVariable(new Variable("x")); - MetaResource metaA = new MetaResource(new Variable("ma")); - MetaResource metaB = new MetaResource(new Variable("mb")); - MetaResource metaC = new MetaResource(new Variable("mc")); - MetaRDLTerm metaTerm2 = new MetaRDLTerm(metaA, metaB, metaC); - metaTerm2.setLinearRightNormalizedType(LinearRightNormalizedType.LINEAR_RIGHT_NORMALIZED); - - - metaTerm.setLinearRightNormalizedType(LinearRightNormalizedType.LINEAR_RIGHT_NORMALIZED); - assertEquals(metaTerm.isMatchedBy(te3), false); - te3.selfLinearRightNormalize(); - assertEquals(metaTerm.isMatchedBy(te3), true); - assertEquals(metaTerm2.isMatchedBy(te1), true); - } - -} diff --git a/src/tests/terms/meta/MetaDependencyVariableTest.java b/src/tests/terms/meta/MetaDependencyVariableTest.java deleted file mode 100644 index e893131..0000000 --- a/src/tests/terms/meta/MetaDependencyVariableTest.java +++ /dev/null @@ -1,129 +0,0 @@ -package tests.terms.meta; - -import static org.junit.jupiter.api.Assertions.*; -import static tests.Utils.*; - -import org.junit.jupiter.api.Test; - -import models.algebra.Constant; -import models.algebra.Variable; -import models.terms.Dependency; -import models.terms.DependencyTerm; -import models.terms.Resource; -import models.terms.meta.MetaDependencyVariable; -import models.terms.meta.OrderConstraint; - -public class MetaDependencyVariableTest { - - @Test - void MetaDependencyVariableMatchingWithoutOrderTest() { - Resource a = new Resource("a", INT, 1); - Resource b = new Resource("b", INT, 1); - Resource c = new Resource("c", INT, 1); - Dependency dep1 = new Dependency(a, b); - Dependency dep2 = new Dependency(dep1); - DependencyTerm te1 = new DependencyTerm(a, b, c); - - MetaDependencyVariable d = new MetaDependencyVariable(new Variable("d")); - // [a : b] mathces d(dependency) - assertTrue(d.isMatchedBy(dep1)); - // [[a : b]] mathces d(dependency) - assertTrue(d.isMatchedBy(dep2)); - // a does not mathc d(dependency) - assertFalse(d.isMatchedBy(a)); - // [a : b -> c] does not mathc d(dependency) - assertFalse(d.isMatchedBy(te1)); - } - - @Test - void MetaDependencyVariableMatchingWithConstantOrderEQTest() { - Resource a = new Resource("a", INT, 1); - Resource b = new Resource("b", INT, 1); - Resource c = new Resource("c", INT, 2); - Dependency dep1 = new Dependency(a, b); - Dependency dep2 = new Dependency(a, c); - - MetaDependencyVariable d = new MetaDependencyVariable(new Variable("d"), new Constant("1")); - // [a : b](1) mathces d(=1) - assertTrue(d.isMatchedBy(dep1)); - // [a : c](2) does not mathc d(=1) - assertFalse(d.isMatchedBy(dep2)); - } - - @Test - void MetaDependencyVariableMatchingWithConstantOrderLTTest() { - Resource a = new Resource("a", INT, 0); - Resource b = new Resource("b", INT, 1); - Resource c = new Resource("c", INT, 2); - Resource e = new Resource("e", INT, 0); - Dependency dep1 = new Dependency(a, b); - Dependency dep2 = new Dependency(a, c); - Dependency dep3 = new Dependency(a, e); - - MetaDependencyVariable d = new MetaDependencyVariable(new Variable("d"), OrderConstraint.LT, new Constant("1")); - // [a : b](1) does not match d(<1) - assertFalse(d.isMatchedBy(dep1)); - // [a : c](2) does not match d(<1) - assertFalse(d.isMatchedBy(dep2)); - // [a : e](0) matches d(<1) - assertTrue(d.isMatchedBy(dep3)); - } - - @Test - void MetaDependencyVariableMatchingWithConstantOrderLETest() { - Resource a = new Resource("a", INT, 0); - Resource b = new Resource("b", INT, 1); - Resource c = new Resource("c", INT, 2); - Resource e = new Resource("e", INT, 0); - Dependency dep1 = new Dependency(a, b); - Dependency dep2 = new Dependency(a, c); - Dependency dep3 = new Dependency(a, e); - - MetaDependencyVariable d = new MetaDependencyVariable(new Variable("d"), OrderConstraint.LE, new Constant("1")); - // [a : b](1) matches d(<=1) - assertTrue(d.isMatchedBy(dep1)); - // [a : c](2) does not match d(<=1) - assertFalse(d.isMatchedBy(dep2)); - // [a : e](0) matches d(<=1) - assertTrue(d.isMatchedBy(dep3)); - } - - @Test - void MetaDependencyVariableMatchingWithConstantOrderGTTest() { - Resource a = new Resource("a", INT, 0); - Resource b = new Resource("b", INT, 1); - Resource c = new Resource("c", INT, 2); - Resource e = new Resource("e", INT, 0); - Dependency dep1 = new Dependency(a, b); - Dependency dep2 = new Dependency(a, c); - Dependency dep3 = new Dependency(a, e); - - MetaDependencyVariable d = new MetaDependencyVariable(new Variable("d"), OrderConstraint.GT, new Constant("1")); - // [a : b](1) does not match d(>1) - assertFalse(d.isMatchedBy(dep1)); - // [a : c](2) matches d(>1) - assertTrue(d.isMatchedBy(dep2)); - // [a : e](0) does not match d(>1) - assertFalse(d.isMatchedBy(dep3)); - } - - @Test - void MetaDependencyVariableMatchingWithConstantOrderGETest() { - Resource a = new Resource("a", INT, 0); - Resource b = new Resource("b", INT, 1); - Resource c = new Resource("c", INT, 2); - Resource e = new Resource("e", INT, 0); - Dependency dep1 = new Dependency(a, b); - Dependency dep2 = new Dependency(a, c); - Dependency dep3 = new Dependency(a, e); - - MetaDependencyVariable d = new MetaDependencyVariable(new Variable("d"), OrderConstraint.GE, new Constant("1")); - // [a : b](1) matches d(>=1) - assertTrue(d.isMatchedBy(dep1)); - // [a : c](2) matches d(>=1) - assertTrue(d.isMatchedBy(dep2)); - // [a : e](0) does not match d(>=1) - assertFalse(d.isMatchedBy(dep3)); - } - -} diff --git a/src/tests/terms/meta/MetaEvaluatableTermVariableTest.java b/src/tests/terms/meta/MetaEvaluatableTermVariableTest.java deleted file mode 100644 index 042f101..0000000 --- a/src/tests/terms/meta/MetaEvaluatableTermVariableTest.java +++ /dev/null @@ -1,31 +0,0 @@ -package tests.terms.meta; - -import static org.junit.jupiter.api.Assertions.*; - -import org.junit.jupiter.api.Test; - -import models.algebra.Variable; -import models.terms.DependencyTerm; -import models.terms.ResourceConstant; -import models.terms.Resource; -import models.terms.meta.MetaEvaluatableTermVariable; -import tests.Utils; - -public class MetaEvaluatableTermVariableTest { - - @Test - void isMatchedByTest() { - MetaEvaluatableTermVariable se = new MetaEvaluatableTermVariable(new Variable("se")); - - Resource a = new Resource("a", Utils.INT, 1); - Resource b = new Resource("b", Utils.INT, 1); - Resource c = new Resource("c", Utils.INT, 1); - ResourceConstant one = new ResourceConstant("1"); - DependencyTerm t1 = new DependencyTerm(a, b, c); - - assertTrue(se.isMatchedBy(a)); - assertTrue(se.isMatchedBy(one)); - assertTrue(se.isMatchedBy(t1)); - } - -} diff --git a/src/tests/terms/meta/MetaRDLTermTest.java b/src/tests/terms/meta/MetaRDLTermTest.java deleted file mode 100644 index 2c5f28b..0000000 --- a/src/tests/terms/meta/MetaRDLTermTest.java +++ /dev/null @@ -1,99 +0,0 @@ -package tests.terms.meta; - -import static org.junit.jupiter.api.Assertions.*; -import static tests.Utils.*; - -import org.junit.jupiter.api.Test; - -import models.algebra.Constant; -import models.algebra.Variable; -import models.terms.Dependency; -import models.terms.DependencyTerm; -import models.terms.Resource; -import models.terms.meta.MetaDependencyTermVariable; -import models.terms.meta.MetaRDLTerm; -import models.terms.meta.MetaResource; - -public class MetaRDLTermTest { - - @Test - void MetaDependencyMatchingWithoutOrderTest() { - Resource a = new Resource("a", INT, 1); - Resource b = new Resource("b", INT, 1); - Resource c = new Resource("c", INT, 1); - Dependency dep1 = new Dependency(a, b); - DependencyTerm te1 = new DependencyTerm(a, b, c); - Dependency dep2 = new Dependency(te1, b); - - MetaResource v1 = new MetaResource(new Variable("v1")); - MetaResource v2 = new MetaResource(new Variable("v2")); - MetaResource v3 = new MetaResource(new Variable("v3")); - MetaDependencyTermVariable vte = new MetaDependencyTermVariable(new Variable("vte")); - MetaRDLTerm metaDep = new MetaRDLTerm(v1, v2); - MetaRDLTerm metaDep2 = new MetaRDLTerm(vte, v2); - MetaRDLTerm metaTe = new MetaRDLTerm(v1, v2, v3); - MetaRDLTerm metaDep3 = new MetaRDLTerm(metaTe, v2); - MetaRDLTerm metaDep4 = new MetaRDLTerm(metaTe, v3); - - //[a : b] matches [v1 : v2] - assertTrue(metaDep.isMatchedBy(dep1)); - //[[a : b -> c] : b] does not match [v1 : v2] - assertFalse(metaDep.isMatchedBy(dep2)); - //[[a : b -> c] : b] matches [vte : v2] - assertTrue(metaDep2.isMatchedBy(dep2)); - //[[a : b -> c] : b] matches [[v1 : v2 -> v3] : v2] - assertTrue(metaDep3.isMatchedBy(dep2)); - //[[a : b -> c] : b] does not match [[v1 : v2 -> v3] : v3] - assertFalse(metaDep4.isMatchedBy(dep2)); - } - - @Test - void MetaDependencyMatchingWithConstantOrderTest() { - MetaResource v1 = new MetaResource(new Variable("v1"), new Constant("1")); - MetaResource v2 = new MetaResource(new Variable("v2"), new Constant("2")); - MetaRDLTerm vd1 = new MetaRDLTerm(v1, v2); - - Resource a1 = new Resource("a1", INT, 1); - Resource a2 = new Resource("a2", INT, 2); - Dependency d1 = new Dependency(a1, a2); - //[1 : 2] matches [1 : 2] - assertTrue(vd1.isMatchedBy(d1)); - - Resource b1 = new Resource("b1", INT, 1); - Dependency d2 = new Dependency(a1, b1); - //[1 : 1] does not match [1 : 2] - assertFalse(vd1.isMatchedBy(d2)); - } - - @Test - void MetaDependencyMatchingWithVariableOrderTest() { - MetaResource v1 = new MetaResource(new Variable("v1"), parse("x")); - MetaResource v2 = new MetaResource(new Variable("v2"), parse("x")); - MetaResource v3 = new MetaResource(new Variable("v3"), parse("y")); - MetaRDLTerm vd1 = new MetaRDLTerm(v1, v2); - MetaRDLTerm vd2 = new MetaRDLTerm(v1, v3); - MetaRDLTerm vd3 = new MetaRDLTerm(new MetaRDLTerm(v3, v1), v2); - - Resource a1 = new Resource("a1", INT, 1); - Resource a2 = new Resource("a2", INT, 2); - Resource b1 = new Resource("b1", INT, 1); - Resource b2 = new Resource("b2", INT, 2); - Dependency d1 = new Dependency(a1, a2); - Dependency d2 = new Dependency(a1, b1); - Dependency d3 = new Dependency(new Dependency(a1, b1), a2); - Dependency d4 = new Dependency(new Dependency(a1, a2), b2); - //[1 : 2] does not match [x : x] - assertFalse(vd1.isMatchedBy(d1)); - //[1 : 1] matches [x : x] - assertTrue(vd1.isMatchedBy(d2)); - //[1 : 2] matches [x : y] - assertTrue(vd2.isMatchedBy(d1)); - //[1 : 1] matches [x : y] - assertTrue(vd2.isMatchedBy(d2)); - //[[1 : 1] : 2] does not match [[y : x] : x] - assertFalse(vd3.isMatchedBy(d3)); - //[[1 : 2] : 2] matches [[y : x] : x] - assertTrue(vd3.isMatchedBy(d4)); - } - -} diff --git a/src/tests/terms/meta/MetaResourceVariableTest.java b/src/tests/terms/meta/MetaResourceVariableTest.java deleted file mode 100644 index 35f422a..0000000 --- a/src/tests/terms/meta/MetaResourceVariableTest.java +++ /dev/null @@ -1,163 +0,0 @@ -package tests.terms.meta; - -import static org.junit.jupiter.api.Assertions.*; -import static tests.Utils.*; - -import org.junit.jupiter.api.Test; - -import models.algebra.Variable; -import models.terms.Dependency; -import models.terms.DependencyTerm; -import models.terms.Resource; -import models.terms.meta.MetaDependencyTermVariable; -import models.terms.meta.MetaDependencyVariable; -import models.terms.meta.MetaEvaluatableTermVariable; -import models.terms.meta.MetaRDLTermVariable; -import models.terms.meta.MetaResource; -import models.terms.meta.OrderConstraint; - -public class MetaResourceVariableTest { - - @Test - void MetaResourceVariableMathcingWithoutOrder() { - Resource a = new Resource("a", INT, 0); - Resource b = new Resource("b", INT, 0); - Resource c = new Resource("c", INT, 0); - Dependency dep = new Dependency(a, b); - DependencyTerm depTerm = new DependencyTerm(a, b, c); - - MetaResource x = new MetaResource(new Variable("x")); - MetaDependencyVariable d = new MetaDependencyVariable(new Variable("d")); - MetaDependencyTermVariable dte = new MetaDependencyTermVariable(new Variable("dte")); - MetaEvaluatableTermVariable te = new MetaEvaluatableTermVariable(new Variable("te")); - MetaRDLTermVariable t = new MetaRDLTermVariable(new Variable("t")); - - // a matches x(resource variable) - assertTrue(x.isMatchedBy(a)); - // a does not match d(dependency) - assertFalse(d.isMatchedBy(a)); - // a does not match dte(dependency term) - assertFalse(dte.isMatchedBy(a)); - // a matches te(evaluatable term) - assertTrue(te.isMatchedBy(a)); - // a matches t(term) - assertTrue(t.isMatchedBy(a)); - // [a : b] does not match x(resource variable) - assertFalse(x.isMatchedBy(dep)); - // [a : b -> c] does not match x(resource variable) - assertFalse(x.isMatchedBy(depTerm)); - } - - @Test - void MetaResourceVariableMathcingWithConstantOrderEQ() { - Resource a = new Resource("a", INT, 1); - MetaResource x = new MetaResource(new Variable("x"), parse("0")); - MetaResource y = new MetaResource(new Variable("y"), parse("1")); - //a(1) does not match x(=0) - assertFalse(x.isMatchedBy(a)); - //a(1) matches y(=1) - assertTrue(y.isMatchedBy(a)); - } - - @Test - void MetaResourceVariableMathcingWithConstantOrderLT() { - Resource a = new Resource("a", INT, 1); - MetaResource x = new MetaResource(new Variable("x"), OrderConstraint.LT, parse("0")); - MetaResource y = new MetaResource(new Variable("y"), OrderConstraint.LT, parse("1")); - MetaResource z = new MetaResource(new Variable("z"), OrderConstraint.LT, parse("2")); - //a(1) does not match x(<0) - assertFalse(x.isMatchedBy(a)); - //a(1) matches y(<1) - assertFalse(y.isMatchedBy(a)); - //a(1) matches z(<2) - assertTrue(z.isMatchedBy(a)); - } - - @Test - void MetaResourceVariableMathcingWithConstantOrderLE() { - Resource a = new Resource("a", INT, 1); - MetaResource x = new MetaResource(new Variable("x"), OrderConstraint.LE, parse("0")); - MetaResource y = new MetaResource(new Variable("y"), OrderConstraint.LE, parse("1")); - MetaResource z = new MetaResource(new Variable("z"), OrderConstraint.LE, parse("2")); - //a(1) does not match x(<=0) - assertFalse(x.isMatchedBy(a)); - //a(1) matches y(<=1) - assertTrue(y.isMatchedBy(a)); - //a(1) matches z(<=2) - assertTrue(z.isMatchedBy(a)); - } - - @Test - void MetaResourceVariableMathcingWithConstantOrderGT() { - Resource a = new Resource("a", INT, 1); - MetaResource x = new MetaResource(new Variable("x"), OrderConstraint.GT, parse("0")); - MetaResource y = new MetaResource(new Variable("y"), OrderConstraint.GT, parse("1")); - MetaResource z = new MetaResource(new Variable("z"), OrderConstraint.GT, parse("2")); - //a(1) does not match x(>0) - assertTrue(x.isMatchedBy(a)); - //a(1) matches y(>1) - assertFalse(y.isMatchedBy(a)); - //a(1) matches z(>2) - assertFalse(z.isMatchedBy(a)); - } - - @Test - void MetaResourceVariableMathcingWithConstantOrderGE() { - Resource a = new Resource("a", INT, 1); - MetaResource x = new MetaResource(new Variable("x"), OrderConstraint.GE, parse("0")); - MetaResource y = new MetaResource(new Variable("y"), OrderConstraint.GE, parse("1")); - MetaResource z = new MetaResource(new Variable("z"), OrderConstraint.GE, parse("2")); - //a(1) does not match x(>=0) - assertTrue(x.isMatchedBy(a)); - //a(1) matches y(>=1) - assertTrue(y.isMatchedBy(a)); - //a(1) matches z(>2) - assertFalse(z.isMatchedBy(a)); - } - - @Test - void MetaResourceVariableMathcingWithVariableOrderEq() { - Resource a = new Resource("a", INT, 0); - MetaResource x = new MetaResource(new Variable("x"), parse("x")); - - //a(0) matches x(=x) - assertTrue(x.isMatchedBy(a)); - } - - @Test - void MetaResourceVariableMathcingWithVariableOrderLT() { - Resource a = new Resource("a", INT, 2); - MetaResource x = new MetaResource(new Variable("x"), OrderConstraint.LT, parse("x")); - - //a(2) matches x(x) - assertTrue(x.isMatchedBy(a)); - } - - @Test - void MetaResourceVariableMathcingWithVariableOrderGE() { - Resource a = new Resource("a", INT, 2); - MetaResource x = new MetaResource(new Variable("x"), OrderConstraint.GE, parse("x")); - - //a(2) matches x( binding = new HashMap<>(); - Map orderConstraint = new HashMap<>(); - metaTerm1.isMatchedBy(t1, binding, orderConstraint); - RDLTerm assignedTerm = metaTerm1.substitute(binding); - assertEquals(t1, assignedTerm); - binding.clear(); - orderConstraint.clear(); - metaTerm1.isMatchedBy(t2, binding, orderConstraint); - assertEquals(t2, metaTerm1.substitute(binding)); - } - -} diff --git a/src/tests/utils/DynamicDSUTest.java b/src/tests/utils/DynamicDSUTest.java deleted file mode 100644 index fe15816..0000000 --- a/src/tests/utils/DynamicDSUTest.java +++ /dev/null @@ -1,25 +0,0 @@ -package tests.utils; - -import static org.junit.jupiter.api.Assertions.*; - -import org.junit.jupiter.api.Test; - -import utils.DynamicDisjointSetUnion; - -public class DynamicDSUTest { - - @Test - void DDSUTest() { - DynamicDisjointSetUnion dsu = new DynamicDisjointSetUnion<>(); - dsu.add("a"); - dsu.add("b"); - dsu.add("c"); - dsu.union("a", "b"); - assertTrue(dsu.same("a", "b")); - assertFalse(dsu.same("a", "c")); - assertFalse(dsu.same("b", "c")); - - - } - -} diff --git a/src/tests/utils/ProductTest.java b/src/tests/utils/ProductTest.java deleted file mode 100644 index 0747642..0000000 --- a/src/tests/utils/ProductTest.java +++ /dev/null @@ -1,33 +0,0 @@ -package tests.utils; - -import static org.junit.Assert.*; - -import java.util.List; - -import org.junit.jupiter.api.Test; - -import utils.Product; - -public class ProductTest { - - @Test - void product() { - List> input = List.of( - List.of(1, 2), - List.of(3, 4), - List.of(5) - ); - - List> result = Product.product(input); - - List> expected = List.of( - List.of(1, 3, 5), - List.of(1, 4, 5), - List.of(2, 3, 5), - List.of(2, 4, 5) - ); - - assertEquals(expected, result); - } - -} diff --git a/src/utils/DynamicDisjointSetUnion.java b/src/utils/DynamicDisjointSetUnion.java deleted file mode 100644 index 06cc58e..0000000 --- a/src/utils/DynamicDisjointSetUnion.java +++ /dev/null @@ -1,66 +0,0 @@ -package utils; - -import java.util.HashMap; -import java.util.Map; - -public class DynamicDisjointSetUnion { - - private Map parent; - private Map size; - - public DynamicDisjointSetUnion() { - parent = new HashMap<>(); - size = new HashMap<>(); - } - - public void add(T x) { - if (! parent.containsKey(x)) { - parent.put(x, x); - size.put(x, 1); - } - } - - public T find(T x) { - if (! parent.containsKey(x)) { - throw new RuntimeException(x.toString() + " does not exist"); - } - - if (! parent.get(x).equals(x)) { - parent.put(x, find(parent.get(x))); - } - return parent.get(x); - } - - public void union(T x, T y) { - add(x); - add(y); - - T rx = find(x); - T ry = find(y); - - if (rx.equals(ry)) { - return; - } - - if (size.get(rx) < size.get(ry)) { - T tmp = rx; - rx = ry; - ry = tmp; - } - - parent.put(ry, rx); - size.put(rx, size.get(rx) + size.get(ry)); - } - - public boolean same(T x, T y) { - if ((! parent.containsKey(x)) || (! parent.containsKey(y))) { - return false; - } - return find(x).equals(find(y)); - } - - public int componentSize(T x) { - return size.get(x); - } - -} diff --git a/src/utils/ExpressionUitls.java b/src/utils/ExpressionUitls.java deleted file mode 100644 index 7981932..0000000 --- a/src/utils/ExpressionUitls.java +++ /dev/null @@ -1,71 +0,0 @@ -package utils; - -import java.util.Map; - -import exceptions.NonLinearExpressionException; -import models.algebra.Constant; -import models.algebra.Expression; -import models.algebra.Symbol; -import models.algebra.Term; -import models.algebra.Variable; -import models.dataConstraintModel.DataConstraintModel; - -public class ExpressionUitls { - - - public static int getCoefficientAndConstantsFromExpression(Expression expression, Map coefficients, int curWeight) { - int res = 0; - if(expression instanceof Constant) { - return getConstantValue((Constant) expression) * curWeight; - } else if(expression instanceof Variable) { - coefficients.put((Variable) expression, coefficients.getOrDefault((Variable) expression, 0) + curWeight); - return 0; - } - Term term = (Term) expression; - Symbol symbol = term.getSymbol(); - if(symbol.equals(DataConstraintModel.add)) { - Expression c1 = term.getChild(0); - Expression c2 = term.getChild(1); - res += getCoefficientAndConstantsFromExpression(c1, coefficients, curWeight); - res += getCoefficientAndConstantsFromExpression(c2, coefficients, curWeight); - } else if(symbol.equals(DataConstraintModel.sub)) { - Expression c1 = term.getChild(0); - Expression c2 = term.getChild(1); - res += getCoefficientAndConstantsFromExpression(c1, coefficients, curWeight); - res += getCoefficientAndConstantsFromExpression(c2, coefficients, -curWeight); - } else if(symbol.equals(DataConstraintModel.mul)) { - Expression c1 = term.getChild(0); - Expression c2 = term.getChild(1); - if(c1.getVariables().size() == 0 && c2.getVariables().size() == 0) { - res += getCoefficientAndConstantsFromExpression(c1, coefficients, curWeight) * - getCoefficientAndConstantsFromExpression(c2, coefficients, curWeight); - } else if(c1.getVariables().size() == 0) { - res += getCoefficientAndConstantsFromExpression( - c2, - coefficients, - getCoefficientAndConstantsFromExpression(c1, coefficients, curWeight) - ); - } else if(c2.getVariables().size() == 0){ - res += getCoefficientAndConstantsFromExpression( - c1, - coefficients, - getCoefficientAndConstantsFromExpression(c2, coefficients, curWeight) - ); - } else { - throw new NonLinearExpressionException("Order expression must be linear expression."); - } - } else if(symbol.equals(DataConstraintModel.minus)) { - Expression c1 = term.getChild(0); - res += getCoefficientAndConstantsFromExpression(c1, coefficients, -curWeight); - } else { - throw new NonLinearExpressionException("Order expression must be linear expression."); - } - return res; - - } - - public static int getConstantValue(Constant constant) { - return Integer.parseInt((String) constant.getValue()); - } - -} diff --git a/src/utils/Permutation.java b/src/utils/Permutation.java deleted file mode 100644 index 039b9f9..0000000 --- a/src/utils/Permutation.java +++ /dev/null @@ -1,33 +0,0 @@ -package utils; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -public class Permutation { - - public static List> permutation(Collection list, int n) { - List> res = new ArrayList<>(); - permutation(list, n, new ArrayList<>(), new HashSet<>(), res); - return res; - } - - private static void permutation(Collection all, int n, List current, Set used, List> result) { - if (current.size() == n) { - result.add(new ArrayList<>(current)); - return; - } - for (T elem : all) { - if (! used.contains(elem)) { - current.add(elem); - used.add(elem); - permutation(all, n, current, used, result); - current.remove(current.size() - 1); - used.remove(elem); - } - } - } - -} diff --git a/src/utils/Product.java b/src/utils/Product.java deleted file mode 100644 index 89238fb..0000000 --- a/src/utils/Product.java +++ /dev/null @@ -1,37 +0,0 @@ -package utils; - -import java.util.ArrayList; -import java.util.List; - -public class Product { - - public static List> product(List> lists) { - List> result = new ArrayList<>(); - - if (lists == null || lists.isEmpty()) { - return result; - } - - backtrack(lists, result, 0, new ArrayList<>()); - return result; - } - - private static void backtrack( - List> lists, - List> result, - int depth, - List current) { - - if (depth == lists.size()) { - result.add(new ArrayList<>(current)); - return; - } - - for (T element : lists.get(depth)) { - current.add(element); - backtrack(lists, result, depth + 1, current); - current.remove(current.size() - 1); - } - } - -}