diff --git a/src/inference/InferenceRule.java b/src/inference/InferenceRule.java index e99e7c4..db3985d 100644 --- a/src/inference/InferenceRule.java +++ b/src/inference/InferenceRule.java @@ -53,15 +53,46 @@ } public boolean check(Collection assumptions, Formula conclusion) { + if (this.assumptions.size() > assumptions.size()) { return false; } - for(List assumption : permutation(assumptions, this.assumptions.size())) { - if (check(assumption, conclusion)) { - return true; + + 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; } } - 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) { diff --git a/src/tests/inferencerule/InferenceRuleTest.java b/src/tests/inferencerule/InferenceRuleTest.java index f1e89bb..7cb7b04 100644 --- a/src/tests/inferencerule/InferenceRuleTest.java +++ b/src/tests/inferencerule/InferenceRuleTest.java @@ -3,10 +3,10 @@ import static org.junit.jupiter.api.Assertions.*; import static tests.Utils.*; -import org.junit.jupiter.api.Test; - import java.util.List; +import org.junit.jupiter.api.Test; + import inference.InferenceRule; import models.algebra.Variable; import models.formulas.DependencyFormula;