aboutsummaryrefslogtreecommitdiffstats
path: root/subprojects
diff options
context:
space:
mode:
authorLibravatar Kristóf Marussy <kristof@marussy.com>2024-06-17 01:56:02 +0200
committerLibravatar Kristóf Marussy <kristof@marussy.com>2024-06-17 01:56:02 +0200
commitb4c17c94105bece10118ab656ead66becd4b1325 (patch)
tree83f16cad44fcd76167da4a3b3227ad1feda23982 /subprojects
parentfix: allow predicates in rule actions (diff)
downloadrefinery-b4c17c94105bece10118ab656ead66becd4b1325.tar.gz
refinery-b4c17c94105bece10118ab656ead66becd4b1325.tar.zst
refinery-b4c17c94105bece10118ab656ead66becd4b1325.zip
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.
Diffstat (limited to 'subprojects')
-rw-r--r--subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/ModelInitializer.java17
1 files changed, 17 insertions, 0 deletions
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;
36import tools.refinery.store.reasoning.literal.Concreteness; 36import tools.refinery.store.reasoning.literal.Concreteness;
37import tools.refinery.store.reasoning.literal.ModalConstraint; 37import tools.refinery.store.reasoning.literal.ModalConstraint;
38import tools.refinery.store.reasoning.literal.Modality; 38import tools.refinery.store.reasoning.literal.Modality;
39import tools.refinery.store.reasoning.literal.PartialLiterals;
39import tools.refinery.store.reasoning.representation.PartialRelation; 40import tools.refinery.store.reasoning.representation.PartialRelation;
40import tools.refinery.store.reasoning.scope.ScopePropagator; 41import tools.refinery.store.reasoning.scope.ScopePropagator;
41import tools.refinery.store.reasoning.seed.ModelSeed; 42import tools.refinery.store.reasoning.seed.ModelSeed;
@@ -1005,6 +1006,7 @@ public class ModelInitializer {
1005 parametersToFocus.add(problemParameter); 1006 parametersToFocus.add(problemParameter);
1006 } 1007 }
1007 } 1008 }
1009 toMonomorphicMatchingLiterals(parametersToFocus, parameterMap, commonLiterals);
1008 var builder = Rule.builder(name).parameters(parameters); 1010 var builder = Rule.builder(name).parameters(parameters);
1009 var preconditions = ruleDefinition.getPreconditions(); 1011 var preconditions = ruleDefinition.getPreconditions();
1010 if (preconditions.isEmpty()) { 1012 if (preconditions.isEmpty()) {
@@ -1020,6 +1022,21 @@ public class ModelInitializer {
1020 return builder.build(); 1022 return builder.build();
1021 } 1023 }
1022 1024
1025 private static void toMonomorphicMatchingLiterals(
1026 ArrayList<tools.refinery.language.model.problem.Variable> parametersToFocus,
1027 HashMap<tools.refinery.language.model.problem.Variable, NodeVariable> parameterMap,
1028 ArrayList<Literal> commonLiterals) {
1029 int focusCount = parametersToFocus.size();
1030 for (int i = 0; i < focusCount; i++) {
1031 var leftFocus = parameterMap.get(parametersToFocus.get(i));
1032 for (int j = i + 1; j < focusCount; j++) {
1033 var rightFocus = parameterMap.get(parametersToFocus.get(j));
1034 commonLiterals.add(Literals.not(PartialLiterals.must(
1035 ReasoningAdapter.EQUALS_SYMBOL.call(leftFocus, rightFocus))));
1036 }
1037 }
1038 }
1039
1023 private void buildConsequent( 1040 private void buildConsequent(
1024 Consequent body, HashMap<tools.refinery.language.model.problem.Variable, NodeVariable> parameterMap, 1041 Consequent body, HashMap<tools.refinery.language.model.problem.Variable, NodeVariable> parameterMap,
1025 Collection<tools.refinery.language.model.problem.Variable> parametersToFocus, RuleBuilder builder) { 1042 Collection<tools.refinery.language.model.problem.Variable> parametersToFocus, RuleBuilder builder) {