aboutsummaryrefslogtreecommitdiffstats
path: root/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics
diff options
context:
space:
mode:
authorLibravatar Kristóf Marussy <kristof@marussy.com>2024-06-17 00:48:56 +0200
committerLibravatar Kristóf Marussy <kristof@marussy.com>2024-06-17 00:48:56 +0200
commit20377189894ab40298513441f07080477b1cccfd (patch)
tree9294708b2a7eebf152e76fdfbf2c1edfd3fa12ec /subprojects/language-semantics/src/main/java/tools/refinery/language/semantics
parentfeat(language): validate quantification in rules (diff)
downloadrefinery-20377189894ab40298513441f07080477b1cccfd.tar.gz
refinery-20377189894ab40298513441f07080477b1cccfd.tar.zst
refinery-20377189894ab40298513441f07080477b1cccfd.zip
refactor(language): allow rules without preconditions
Diffstat (limited to 'subprojects/language-semantics/src/main/java/tools/refinery/language/semantics')
-rw-r--r--subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/ModelInitializer.java45
1 files changed, 31 insertions, 14 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 bd6a8ec9..c9e7dea3 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
@@ -938,18 +938,30 @@ public class ModelInitializer {
938 } 938 }
939 939
940 private void collectRule(RuleDefinition ruleDefinition, ModelStoreBuilder storeBuilder) { 940 private void collectRule(RuleDefinition ruleDefinition, ModelStoreBuilder storeBuilder) {
941 var name = semanticsUtils.getNameWithoutRootPrefix(ruleDefinition) 941 try {
942 .orElseGet(() -> "::rule" + ruleCount); 942 var name = semanticsUtils.getNameWithoutRootPrefix(ruleDefinition)
943 ruleCount++; 943 .orElseGet(() -> "::rule" + ruleCount);
944 var rule = toRule(name, ruleDefinition); 944 ruleCount++;
945 switch (ruleDefinition.getKind()) { 945 var rule = toRule(name, ruleDefinition);
946 case DECISION -> storeBuilder.tryGetAdapter(DesignSpaceExplorationBuilder.class) 946 switch (ruleDefinition.getKind()) {
947 .ifPresent(dseBuilder -> dseBuilder.transformation(rule)); 947 case DECISION -> storeBuilder.tryGetAdapter(DesignSpaceExplorationBuilder.class)
948 case PROPAGATION -> storeBuilder.tryGetAdapter(PropagationBuilder.class) 948 .ifPresent(dseBuilder -> dseBuilder.transformation(rule));
949 .ifPresent(propagationBuilder -> propagationBuilder.rule(rule)); 949 case PROPAGATION -> storeBuilder.tryGetAdapter(PropagationBuilder.class)
950 case REFINEMENT -> { 950 .ifPresent(propagationBuilder -> propagationBuilder.rule(rule));
951 // Rules not marked for decision or propagation are not invoked automatically. 951 case REFINEMENT -> {
952 } 952 // Rules not marked for decision or propagation are not invoked automatically.
953 }
954 }
955 } catch (InvalidClauseException e) {
956 int clauseIndex = e.getClauseIndex();
957 var bodies = ruleDefinition.getPreconditions();
958 if (clauseIndex < bodies.size()) {
959 throw new TracedException(bodies.get(clauseIndex), e);
960 } else {
961 throw new TracedException(ruleDefinition, e);
962 }
963 } catch (RuntimeException e) {
964 throw TracedException.addTrace(ruleDefinition, e);
953 } 965 }
954 } 966 }
955 967
@@ -981,8 +993,13 @@ public class ModelInitializer {
981 } 993 }
982 } 994 }
983 var builder = Rule.builder(name).parameters(parameters); 995 var builder = Rule.builder(name).parameters(parameters);
984 for (var precondition : ruleDefinition.getPreconditions()) { 996 var preconditions = ruleDefinition.getPreconditions();
985 buildConjunction(precondition, parameterMap, commonLiterals, builder); 997 if (preconditions.isEmpty()) {
998 builder.clause(commonLiterals);
999 } else {
1000 for (var precondition : preconditions) {
1001 buildConjunction(precondition, parameterMap, commonLiterals, builder);
1002 }
986 } 1003 }
987 for (var consequent : ruleDefinition.getConsequents()) { 1004 for (var consequent : ruleDefinition.getConsequents()) {
988 buildConsequent(consequent, parameterMap, parametersToFocus, builder); 1005 buildConsequent(consequent, parameterMap, parametersToFocus, builder);