diff options
author | 2024-06-17 00:48:56 +0200 | |
---|---|---|
committer | 2024-06-17 00:48:56 +0200 | |
commit | 20377189894ab40298513441f07080477b1cccfd (patch) | |
tree | 9294708b2a7eebf152e76fdfbf2c1edfd3fa12ec /subprojects/language-semantics/src/main/java/tools/refinery/language/semantics | |
parent | feat(language): validate quantification in rules (diff) | |
download | refinery-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.java | 45 |
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); |