diff options
author | Kristóf Marussy <kristof@marussy.com> | 2024-06-17 01:56:02 +0200 |
---|---|---|
committer | Kristóf Marussy <kristof@marussy.com> | 2024-06-17 01:56:02 +0200 |
commit | b4c17c94105bece10118ab656ead66becd4b1325 (patch) | |
tree | 83f16cad44fcd76167da4a3b3227ad1feda23982 /subprojects/language-semantics/src/main/java | |
parent | fix: allow predicates in rule actions (diff) | |
download | refinery-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/language-semantics/src/main/java')
-rw-r--r-- | subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/ModelInitializer.java | 17 |
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; | |||
36 | import tools.refinery.store.reasoning.literal.Concreteness; | 36 | import tools.refinery.store.reasoning.literal.Concreteness; |
37 | import tools.refinery.store.reasoning.literal.ModalConstraint; | 37 | import tools.refinery.store.reasoning.literal.ModalConstraint; |
38 | import tools.refinery.store.reasoning.literal.Modality; | 38 | import tools.refinery.store.reasoning.literal.Modality; |
39 | import tools.refinery.store.reasoning.literal.PartialLiterals; | ||
39 | import tools.refinery.store.reasoning.representation.PartialRelation; | 40 | import tools.refinery.store.reasoning.representation.PartialRelation; |
40 | import tools.refinery.store.reasoning.scope.ScopePropagator; | 41 | import tools.refinery.store.reasoning.scope.ScopePropagator; |
41 | import tools.refinery.store.reasoning.seed.ModelSeed; | 42 | import 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) { |