From 10b6c4fa59abcde40dfd3c548c4df4a8b08a21d8 Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Wed, 10 Aug 2022 01:00:09 +0200 Subject: feat(language): add support for count operator --- subprojects/frontend/src/language/problem.grammar | 9 +- .../src/language/problemLanguageSupport.ts | 2 +- subprojects/language-model/problem.aird | 279 ++++++++++++++++++--- .../src/main/resources/model/problem.ecore | 16 +- .../src/main/resources/model/problem.genmodel | 17 +- .../java/tools/refinery/language/Problem.xtext | 10 +- .../language/resource/DerivedVariableComputer.java | 18 +- 7 files changed, 302 insertions(+), 49 deletions(-) (limited to 'subprojects') diff --git a/subprojects/frontend/src/language/problem.grammar b/subprojects/frontend/src/language/problem.grammar index 6fb188d8..58c398a3 100644 --- a/subprojects/frontend/src/language/problem.grammar +++ b/subprojects/frontend/src/language/problem.grammar @@ -57,7 +57,12 @@ Conjunction { ("," | Literal)+ } OrOp { ";" } -Literal { Modality? NotOp? Modality? Atom ((":" | "=") LogicValue)? } +Literal { + Modality? ( + NotOp? Modality? Atom ((":" | "=") LogicValue)? | + ckw<"count"> "{" Modality? Atom "}" ComparisonOp int + ) +} Atom { RelationName "+"? ParameterList } @@ -141,6 +146,8 @@ sep1 { content (separator content)* } "\"" (![\\"\n] | "\\" (![\n] | "\n"))* "\"" } + ComparisonOp { ">" | ">=" | "<" | "<=" | "=:=" | "=!=" } + NotOp { "!" } UnknownOp { "?" } diff --git a/subprojects/frontend/src/language/problemLanguageSupport.ts b/subprojects/frontend/src/language/problemLanguageSupport.ts index 550532ef..65fb50dc 100644 --- a/subprojects/frontend/src/language/problemLanguageSupport.ts +++ b/subprojects/frontend/src/language/problemLanguageSupport.ts @@ -30,7 +30,7 @@ const parserWithMetadata = (parser as LRParser).configure({ 'problem class enum pred rule indiv scope': t.definitionKeyword, 'abstract extends refers contains opposite error default': t.modifier, 'true false unknown error': t.keyword, - 'may must current': t.operatorKeyword, + 'may must current count': t.operatorKeyword, 'new delete': t.operatorKeyword, NotOp: t.operator, UnknownOp: t.operator, diff --git a/subprojects/language-model/problem.aird b/subprojects/language-model/problem.aird index 35d8b873..f1332549 100644 --- a/subprojects/language-model/problem.aird +++ b/subprojects/language-model/problem.aird @@ -7,7 +7,7 @@ build/resources/main/model/problem.genmodel - + @@ -546,7 +546,66 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -679,23 +738,23 @@ - + - + - + - + - + @@ -705,7 +764,7 @@ - + @@ -1126,17 +1185,17 @@ - + - + - + - + @@ -1222,18 +1281,18 @@ - + - + - + - - + + @@ -1302,17 +1361,17 @@ - + - + - + - + @@ -1328,7 +1387,7 @@ - + @@ -1763,6 +1822,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2142,14 +2233,15 @@ - - - + + + KEEP_LOCATION KEEP_SIZE KEEP_RATIO - - + + italic + @@ -2178,8 +2270,8 @@ - - + + @@ -2203,8 +2295,8 @@ - - + + @@ -2479,8 +2571,8 @@ - - + + labelSize @@ -3476,6 +3568,127 @@ + + + + KEEP_LOCATION + KEEP_SIZE + KEEP_RATIO + + + + + + + + + KEEP_LOCATION + KEEP_SIZE + KEEP_RATIO + + + + + + + + + + + + + + + + + + + + + + + + + + + + italic + + + + + + + + + + + + italic + + + + + + + + + KEEP_LOCATION + KEEP_SIZE + KEEP_RATIO + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/subprojects/language-model/src/main/resources/model/problem.ecore b/subprojects/language-model/src/main/resources/model/problem.ecore index 16683952..5f42341d 100644 --- a/subprojects/language-model/src/main/resources/model/problem.ecore +++ b/subprojects/language-model/src/main/resources/model/problem.ecore @@ -48,7 +48,7 @@ eType="#//Argument" containment="true"/> - + + + + + + + + + + + + + + diff --git a/subprojects/language-model/src/main/resources/model/problem.genmodel b/subprojects/language-model/src/main/resources/model/problem.genmodel index 5a1da4d4..60dec198 100644 --- a/subprojects/language-model/src/main/resources/model/problem.genmodel +++ b/subprojects/language-model/src/main/resources/model/problem.genmodel @@ -22,6 +22,14 @@ + + + + + + + + @@ -61,8 +69,8 @@ - - + + @@ -153,5 +161,10 @@ + + + + + diff --git a/subprojects/language/src/main/java/tools/refinery/language/Problem.xtext b/subprojects/language/src/main/java/tools/refinery/language/Problem.xtext index ba885e3c..93d066af 100644 --- a/subprojects/language/src/main/java/tools/refinery/language/Problem.xtext +++ b/subprojects/language/src/main/java/tools/refinery/language/Problem.xtext @@ -58,11 +58,17 @@ Consequent: actions+=Action ("," actions+=Action)*; Literal: - Atom | NegativeLiteral; + Atom | NegativeLiteral | CountLiteral; NegativeLiteral: modality=Modality? "!" atom=Atom; +enum ComparisonOp: + LESS="<" | LESS_EQ="<=" | GREATER=">" | GREATER_EQ=">=" | EQ="=:=" | NOT_EQ="=!=" ; + +CountLiteral: + modality=Modality? "count" "{" atom=Atom "}" op=ComparisonOp threshold=INT; + Action: AssertionAction | DeleteAction | NewAction; @@ -174,7 +180,7 @@ QualifiedName hidden(): Identifier: ID | "true" | "false" | "unknown" | "error" | "class" | "abstract" | "extends" | "enum" | "pred" | - "indiv" | "problem" | "new" | "delete" | "rule" | "may" | "must" | "current"; + "indiv" | "problem" | "new" | "delete" | "rule" | "may" | "must" | "current" | "count"; Integer returns ecore::EInt hidden(): "-"? INT; diff --git a/subprojects/language/src/main/java/tools/refinery/language/resource/DerivedVariableComputer.java b/subprojects/language/src/main/java/tools/refinery/language/resource/DerivedVariableComputer.java index 4d19006f..b76c4bf7 100644 --- a/subprojects/language/src/main/java/tools/refinery/language/resource/DerivedVariableComputer.java +++ b/subprojects/language/src/main/java/tools/refinery/language/resource/DerivedVariableComputer.java @@ -18,11 +18,11 @@ import com.google.inject.name.Named; import tools.refinery.language.model.problem.Argument; import tools.refinery.language.model.problem.Atom; +import tools.refinery.language.model.problem.CompoundLiteral; import tools.refinery.language.model.problem.Conjunction; import tools.refinery.language.model.problem.ExistentialQuantifier; import tools.refinery.language.model.problem.ImplicitVariable; import tools.refinery.language.model.problem.Literal; -import tools.refinery.language.model.problem.NegativeLiteral; import tools.refinery.language.model.problem.Parameter; import tools.refinery.language.model.problem.ParametricDefinition; import tools.refinery.language.model.problem.Problem; @@ -76,16 +76,16 @@ public class DerivedVariableComputer { createVariables(conjunction, newVariables); newVariables.addAll(knownVariables); for (Literal literal : conjunction.getLiterals()) { - if (literal instanceof NegativeLiteral negativeLiteral) { - installDeriveNegativeLiteralState(negativeLiteral, newVariables); + if (literal instanceof CompoundLiteral compoundLiteral) { + installDerivedCompoundLiteralState(compoundLiteral, newVariables); } } } - protected void installDeriveNegativeLiteralState(NegativeLiteral negativeLiteral, Set knownVariables) { + protected void installDerivedCompoundLiteralState(CompoundLiteral compoundLiteral, Set knownVariables) { Set newVariables = new HashSet<>(); - createSigletonVariablesAndCollectVariables(negativeLiteral.getAtom(), knownVariables, newVariables); - createVariables(negativeLiteral, newVariables); + createSigletonVariablesAndCollectVariables(compoundLiteral.getAtom(), knownVariables, newVariables); + createVariables(compoundLiteral, newVariables); } protected void createSigletonVariablesAndCollectVariables(Atom atom, Set knownVariables, @@ -169,9 +169,9 @@ public class DerivedVariableComputer { if (literal instanceof Atom atom) { discardDerivedAtomState(atom); } - if (literal instanceof NegativeLiteral negativeLiteral) { - negativeLiteral.getImplicitVariables().clear(); - discardDerivedAtomState(negativeLiteral.getAtom()); + if (literal instanceof CompoundLiteral compoundLiteral) { + compoundLiteral.getImplicitVariables().clear(); + discardDerivedAtomState(compoundLiteral.getAtom()); } } } -- cgit v1.2.3-54-g00ecf