From b4c17c94105bece10118ab656ead66becd4b1325 Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Mon, 17 Jun 2024 01:56:02 +0200 Subject: fix: monomorphic matching for focus arguments Since we don't do pre-matching for multi-objects, there's no way to fire a decision rule with multiple focus arguments without creating a new concrete object for each focus argument, even if they match the same multi-object. To be more consistent with the multi-object case, we also don't allow the same concrete object to appear as two distict focus arguments. --- .../refinery/language/semantics/ModelInitializer.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) (limited to 'subprojects/language-semantics/src/main/java') diff --git a/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/ModelInitializer.java b/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/ModelInitializer.java index 10138c2f..486eb89b 100644 --- a/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/ModelInitializer.java +++ b/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/ModelInitializer.java @@ -36,6 +36,7 @@ import tools.refinery.store.reasoning.actions.PartialActionLiterals; import tools.refinery.store.reasoning.literal.Concreteness; import tools.refinery.store.reasoning.literal.ModalConstraint; import tools.refinery.store.reasoning.literal.Modality; +import tools.refinery.store.reasoning.literal.PartialLiterals; import tools.refinery.store.reasoning.representation.PartialRelation; import tools.refinery.store.reasoning.scope.ScopePropagator; import tools.refinery.store.reasoning.seed.ModelSeed; @@ -1005,6 +1006,7 @@ public class ModelInitializer { parametersToFocus.add(problemParameter); } } + toMonomorphicMatchingLiterals(parametersToFocus, parameterMap, commonLiterals); var builder = Rule.builder(name).parameters(parameters); var preconditions = ruleDefinition.getPreconditions(); if (preconditions.isEmpty()) { @@ -1020,6 +1022,21 @@ public class ModelInitializer { return builder.build(); } + private static void toMonomorphicMatchingLiterals( + ArrayList parametersToFocus, + HashMap parameterMap, + ArrayList commonLiterals) { + int focusCount = parametersToFocus.size(); + for (int i = 0; i < focusCount; i++) { + var leftFocus = parameterMap.get(parametersToFocus.get(i)); + for (int j = i + 1; j < focusCount; j++) { + var rightFocus = parameterMap.get(parametersToFocus.get(j)); + commonLiterals.add(Literals.not(PartialLiterals.must( + ReasoningAdapter.EQUALS_SYMBOL.call(leftFocus, rightFocus)))); + } + } + } + private void buildConsequent( Consequent body, HashMap parameterMap, Collection parametersToFocus, RuleBuilder builder) { -- cgit v1.2.3-70-g09d2