diff options
author | Kristóf Marussy <kristof@marussy.com> | 2024-06-17 01:41:26 +0200 |
---|---|---|
committer | Kristóf Marussy <kristof@marussy.com> | 2024-06-17 01:41:26 +0200 |
commit | fca741703a6374a564463ce7b8d7cdd4f2764b02 (patch) | |
tree | b18352429b332a79d38ab13ff7bcbb7d8affdb50 | |
parent | feat(language): warn about partial references (diff) | |
download | refinery-fca741703a6374a564463ce7b8d7cdd4f2764b02.tar.gz refinery-fca741703a6374a564463ce7b8d7cdd4f2764b02.tar.zst refinery-fca741703a6374a564463ce7b8d7cdd4f2764b02.zip |
fix: allow predicates in rule actions
We must mark any predicate definition in a rule action as mutable so that we can
collect assertions created by rules during model generation.
-rw-r--r-- | subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/ModelInitializer.java | 15 |
1 files changed, 14 insertions, 1 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 c9e7dea3..10138c2f 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 | |||
@@ -14,6 +14,7 @@ import tools.refinery.language.scoping.imports.ImportCollector; | |||
14 | import tools.refinery.language.semantics.internal.MutableSeed; | 14 | import tools.refinery.language.semantics.internal.MutableSeed; |
15 | import tools.refinery.language.utils.BuiltinSymbols; | 15 | import tools.refinery.language.utils.BuiltinSymbols; |
16 | import tools.refinery.language.utils.ProblemUtil; | 16 | import tools.refinery.language.utils.ProblemUtil; |
17 | import tools.refinery.language.validation.ActionTargetCollector; | ||
17 | import tools.refinery.logic.Constraint; | 18 | import tools.refinery.logic.Constraint; |
18 | import tools.refinery.logic.dnf.*; | 19 | import tools.refinery.logic.dnf.*; |
19 | import tools.refinery.logic.literal.*; | 20 | import tools.refinery.logic.literal.*; |
@@ -67,6 +68,9 @@ public class ModelInitializer { | |||
67 | @Inject | 68 | @Inject |
68 | private ImportAdapterProvider importAdapterProvider; | 69 | private ImportAdapterProvider importAdapterProvider; |
69 | 70 | ||
71 | @Inject | ||
72 | private ActionTargetCollector actionTargetCollector; | ||
73 | |||
70 | private Problem problem; | 74 | private Problem problem; |
71 | 75 | ||
72 | private final Set<Problem> importedProblems = new HashSet<>(); | 76 | private final Set<Problem> importedProblems = new HashSet<>(); |
@@ -593,7 +597,7 @@ public class ModelInitializer { | |||
593 | private void collectPredicateDefinition(PredicateDefinition predicateDefinition, ModelStoreBuilder storeBuilder) { | 597 | private void collectPredicateDefinition(PredicateDefinition predicateDefinition, ModelStoreBuilder storeBuilder) { |
594 | var partialRelation = getPartialRelation(predicateDefinition); | 598 | var partialRelation = getPartialRelation(predicateDefinition); |
595 | var query = toQuery(partialRelation.name(), predicateDefinition); | 599 | var query = toQuery(partialRelation.name(), predicateDefinition); |
596 | boolean mutable = targetTypes.contains(partialRelation); | 600 | boolean mutable = targetTypes.contains(partialRelation) || isActionTarget(predicateDefinition); |
597 | TruthValue defaultValue; | 601 | TruthValue defaultValue; |
598 | if (predicateDefinition.isError()) { | 602 | if (predicateDefinition.isError()) { |
599 | defaultValue = TruthValue.FALSE; | 603 | defaultValue = TruthValue.FALSE; |
@@ -608,6 +612,15 @@ public class ModelInitializer { | |||
608 | storeBuilder.with(translator); | 612 | storeBuilder.with(translator); |
609 | } | 613 | } |
610 | 614 | ||
615 | private boolean isActionTarget(PredicateDefinition predicateDefinition) { | ||
616 | for (var importedProblem : importedProblems) { | ||
617 | if (actionTargetCollector.isActionTarget(importedProblem, predicateDefinition)) { | ||
618 | return true; | ||
619 | } | ||
620 | } | ||
621 | return false; | ||
622 | } | ||
623 | |||
611 | private RelationalQuery toQuery(String name, PredicateDefinition predicateDefinition) { | 624 | private RelationalQuery toQuery(String name, PredicateDefinition predicateDefinition) { |
612 | var problemParameters = predicateDefinition.getParameters(); | 625 | var problemParameters = predicateDefinition.getParameters(); |
613 | int arity = problemParameters.size(); | 626 | int arity = problemParameters.size(); |