aboutsummaryrefslogtreecommitdiffstats
path: root/subprojects
diff options
context:
space:
mode:
Diffstat (limited to 'subprojects')
-rw-r--r--subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/ModelInitializer.java45
-rw-r--r--subprojects/language/src/main/java/tools/refinery/language/validation/ProblemValidator.java4
2 files changed, 31 insertions, 18 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);
diff --git a/subprojects/language/src/main/java/tools/refinery/language/validation/ProblemValidator.java b/subprojects/language/src/main/java/tools/refinery/language/validation/ProblemValidator.java
index 21dd7218..36a77ac7 100644
--- a/subprojects/language/src/main/java/tools/refinery/language/validation/ProblemValidator.java
+++ b/subprojects/language/src/main/java/tools/refinery/language/validation/ProblemValidator.java
@@ -413,10 +413,6 @@ public class ProblemValidator extends AbstractProblemValidator {
413 413
414 @Check 414 @Check
415 public void checkRuleDefinition(RuleDefinition ruleDefinition) { 415 public void checkRuleDefinition(RuleDefinition ruleDefinition) {
416 if (ruleDefinition.getKind() != RuleKind.REFINEMENT && ruleDefinition.getPreconditions().isEmpty()) {
417 acceptError("Decision and propagation rules must have at least one precondition.", ruleDefinition,
418 ProblemPackage.Literals.NAMED_ELEMENT__NAME, 0, INVALID_RULE_ISSUE);
419 }
420 if (ruleDefinition.getConsequents().size() != 1) { 416 if (ruleDefinition.getConsequents().size() != 1) {
421 acceptError("Rules must have exactly one consequent.", ruleDefinition, 417 acceptError("Rules must have exactly one consequent.", ruleDefinition,
422 ProblemPackage.Literals.NAMED_ELEMENT__NAME, 0, INVALID_RULE_ISSUE); 418 ProblemPackage.Literals.NAMED_ELEMENT__NAME, 0, INVALID_RULE_ISSUE);