diff --git a/src/main/java/de/tlc4b/TLC4BGlobals.java b/src/main/java/de/tlc4b/TLC4BGlobals.java index 3424581e381415f4d7f66be5d7d898ad894a0f59..3872e5eb48979ebe95eba849bc19d78dc5223a4f 100644 --- a/src/main/java/de/tlc4b/TLC4BGlobals.java +++ b/src/main/java/de/tlc4b/TLC4BGlobals.java @@ -15,6 +15,8 @@ public class TLC4BGlobals { private static boolean partialInvariantEvaluation; private static boolean useSymmetry; private static boolean printCoverage; + + private static boolean checkOnlyMainAssertions; private static boolean deleteFilesOnExit; @@ -52,6 +54,7 @@ public class TLC4BGlobals { useSymmetry = false; printCoverage = false; forceTLCToEvalConstants = false; + checkOnlyMainAssertions = true; proBconstantsSetup = false; @@ -257,5 +260,9 @@ public class TLC4BGlobals { public static boolean isPrintCoverage() { return printCoverage; } + + public static boolean isCheckOnlyMainAssertions(){ + return checkOnlyMainAssertions; + } } diff --git a/src/main/java/de/tlc4b/Translator.java b/src/main/java/de/tlc4b/Translator.java index 6900ba98f1162698e343df1a1d4a39e4bba7e4c8..68c6286e2460f6494716615aecec723d72cc9e67 100644 --- a/src/main/java/de/tlc4b/Translator.java +++ b/src/main/java/de/tlc4b/Translator.java @@ -120,6 +120,7 @@ public class Translator { new NotSupportedConstructs(start); DefinitionsEliminator.eliminateDefinitions(start); + //TODO move set comprehension optimizer behind the type checker SetComprehensionOptimizer.optimizeSetComprehensions(start); MachineContext machineContext = new MachineContext(machineName, start, @@ -132,7 +133,7 @@ public class Translator { Typechecker typechecker = new Typechecker(machineContext); UnchangedVariablesFinder unchangedVariablesFinder = new UnchangedVariablesFinder( machineContext); - + ConstantsEliminator constantsEliminator = new ConstantsEliminator( machineContext); constantsEliminator.start(); @@ -146,12 +147,14 @@ public class Translator { TypeRestrictor typeRestrictor = new TypeRestrictor(start, machineContext, typechecker); - + PrecedenceCollector precedenceCollector = new PrecedenceCollector( start, typechecker, machineContext, typeRestrictor); DefinitionsAnalyser deferredSetSizeCalculator = new DefinitionsAnalyser( machineContext); + + Generator generator = new Generator(machineContext, typeRestrictor, constantsEvaluator, deferredSetSizeCalculator, typechecker); diff --git a/src/main/java/de/tlc4b/analysis/UsedStandardModules.java b/src/main/java/de/tlc4b/analysis/UsedStandardModules.java index a8eeceecab5d18aca59f288fa77d66bfc2a690c0..b3f4cda30b9f1c6083d15b666b0ff6cf407b091c 100644 --- a/src/main/java/de/tlc4b/analysis/UsedStandardModules.java +++ b/src/main/java/de/tlc4b/analysis/UsedStandardModules.java @@ -107,7 +107,7 @@ import de.tlc4b.tla.TLAModule; public class UsedStandardModules extends DepthFirstAdapter { public static enum STANDARD_MODULES { - Naturals, Integers, FiniteSets, Sequences, TLC, BBuiltIns, Relations, FunctionsAsRelations, Functions, SequencesExtended, SequencesAsRelations, ExternalFunctions + Naturals, Integers, FiniteSets, Sequences, TLC, BBuiltIns, Relations, FunctionsAsRelations, Functions, SequencesExtended, SequencesAsRelations, ExternalFunctions, Foo } private final static ArrayList<STANDARD_MODULES> modules = new ArrayList<UsedStandardModules.STANDARD_MODULES>(); @@ -167,8 +167,8 @@ public class UsedStandardModules extends DepthFirstAdapter { return list; } - public HashSet<STANDARD_MODULES> getStandardModulesToBeCreated(){ - // dependencies of standard modules + public HashSet<STANDARD_MODULES> getStandardModulesToBeCreated() { + // dependencies of standard modules HashSet<STANDARD_MODULES> res = new HashSet<STANDARD_MODULES>(); for (STANDARD_MODULES module : extendedStandardModules) { switch (module) { @@ -202,10 +202,11 @@ public class UsedStandardModules extends DepthFirstAdapter { default: break; } - + } return res; } + @Override public void inAExpressionDefinitionDefinition( AExpressionDefinitionDefinition node) { diff --git a/src/main/java/de/tlc4b/analysis/transformation/SeesEliminator.java b/src/main/java/de/tlc4b/analysis/transformation/SeesEliminator.java index 22194e8fed6465e686329d355f7dfc8c5202458f..c90ba2108061750fc300fe64a73ca63a47401cb4 100644 --- a/src/main/java/de/tlc4b/analysis/transformation/SeesEliminator.java +++ b/src/main/java/de/tlc4b/analysis/transformation/SeesEliminator.java @@ -10,6 +10,7 @@ import de.be4.classicalb.core.parser.Utils; import de.be4.classicalb.core.parser.analysis.DepthFirstAdapter; import de.be4.classicalb.core.parser.node.AAbstractConstantsMachineClause; import de.be4.classicalb.core.parser.node.AAbstractMachineParseUnit; +import de.be4.classicalb.core.parser.node.AAssertionsMachineClause; import de.be4.classicalb.core.parser.node.AConjunctPredicate; import de.be4.classicalb.core.parser.node.AConstantsMachineClause; import de.be4.classicalb.core.parser.node.ADefinitionsMachineClause; @@ -20,7 +21,9 @@ import de.be4.classicalb.core.parser.node.PDefinition; import de.be4.classicalb.core.parser.node.PExpression; import de.be4.classicalb.core.parser.node.PMachineClause; import de.be4.classicalb.core.parser.node.PParseUnit; +import de.be4.classicalb.core.parser.node.PPredicate; import de.be4.classicalb.core.parser.node.Start; +import de.tlc4b.TLC4BGlobals; public class SeesEliminator extends DepthFirstAdapter { @@ -52,13 +55,14 @@ public class SeesEliminator extends DepthFirstAdapter { LinkedList<PExpression> machineNames = node.getMachineNames(); for (PExpression pExpression : machineNames) { AIdentifierExpression id = (AIdentifierExpression) pExpression; - String machineName = Utils.getIdentifierAsString(id - .getIdentifier()); - if(!resolvedMachines.contains(machineName)){ + String machineName = Utils + .getIdentifierAsString(id.getIdentifier()); + if (!resolvedMachines.contains(machineName)) { resolvedMachines.add(machineName); Start start = parsedMachines.get(machineName); DefinitionsEliminator.eliminateDefinitions(start); - eliminateSeenMachinesRecursively(start, parsedMachines, resolvedMachines); + eliminateSeenMachinesRecursively(start, parsedMachines, + resolvedMachines); new MachineClauseAdder(main, start); if (node.parent() != null) { node.replaceBy(null); @@ -197,5 +201,35 @@ public class SeesEliminator extends DepthFirstAdapter { } } + public void caseAAssertionsMachineClause(AAssertionsMachineClause node) { + if (TLC4BGlobals.isCheckOnlyMainAssertions()) + return; + AAssertionsMachineClause main = (AAssertionsMachineClause) machineClauseHashMap + .get(node.getClass()); + if (main == null) { + additionalMachineClauseList.add(node); + } else { + ArrayList<PPredicate> old = new ArrayList<PPredicate>( + main.getPredicates()); + ArrayList<PPredicate> newList = new ArrayList<PPredicate>(); + for (PPredicate p : old) { + p.replaceBy(null); // delete parent + newList.add(p); + } + ArrayList<PPredicate> otherAssertions = new ArrayList<PPredicate>( + node.getPredicates()); + + for (PPredicate p : otherAssertions) { + if (p.parent() != null) { + p.replaceBy(null); // delete parent + } + newList.add(p); + + } + main.setPredicates(newList); + } + + } + } } diff --git a/src/main/java/de/tlc4b/analysis/transformation/SetComprehensionOptimizer.java b/src/main/java/de/tlc4b/analysis/transformation/SetComprehensionOptimizer.java index 25244227b1b859a00d2ad66683222b9aa6cc8110..2aa937b98f315efbca0e6c767f1262b185033a83 100644 --- a/src/main/java/de/tlc4b/analysis/transformation/SetComprehensionOptimizer.java +++ b/src/main/java/de/tlc4b/analysis/transformation/SetComprehensionOptimizer.java @@ -146,9 +146,9 @@ public class SetComprehensionOptimizer extends DepthFirstAdapter { } else { node.replaceBy(eventBcomprehension); } - // eventBcomprehension.apply(this); + eventBcomprehension.apply(this); } else { - // node.getPredicates().apply(this); + node.getPredicates().apply(this); } } @@ -289,11 +289,11 @@ public class SetComprehensionOptimizer extends DepthFirstAdapter { } } } - + @Override public void caseAIdentifierExpression(AIdentifierExpression node) { String name = Utils.getIdentifierAsString(node.getIdentifier()); - + //todo the name is not a unique of the node PExpression value = values.get(name); if (value != null) { node.replaceBy((PExpression) value.clone()); diff --git a/src/main/java/de/tlc4b/prettyprint/TLAPrinter.java b/src/main/java/de/tlc4b/prettyprint/TLAPrinter.java index 856f54ad76e94b1891ac33e793bbe6d5c1944bfa..d55e8f024fb92cb3d27be63806d45adfb574c2e0 100644 --- a/src/main/java/de/tlc4b/prettyprint/TLAPrinter.java +++ b/src/main/java/de/tlc4b/prettyprint/TLAPrinter.java @@ -458,29 +458,34 @@ public class TLAPrinter extends DepthFirstAdapter { ALabelPredicate label = (ALabelPredicate) assertion; name = label.getName().getText(); } + + if(name == null){ + name = "Assertion" + (i + 1); + } + if (tlaModule.hasInitPredicate()) { - if (name != null) { moduleStringAppend(name); moduleStringAppend(" == "); - } else { - moduleStringAppend("Assertion" + (i + 1) + " == "); - } } else { moduleStringAppend("ASSUME "); - if (name != null) { moduleStringAppend(name); moduleStringAppend(" == "); - } else { - moduleStringAppend("Assertion" + (i + 1) + " == "); - } } + //assertionMode = true; + //assertionName = name; + //parameterCounter = 0; assertion.apply(this); + //assertionMode = false; moduleStringAppend("\n"); } } } + private static boolean assertionMode = false; + private static String assertionName = null; + private static Integer parameterCounter = 0; + private void printInit() { ArrayList<Node> inits = this.tlaModule.getInitPredicates(); if (inits.size() == 0) @@ -1267,19 +1272,76 @@ public class TLAPrinter extends DepthFirstAdapter { List<PExpression> copy = new ArrayList<PExpression>( node.getIdentifiers()); + int start = parameterCounter; + int end = parameterCounter + copy.size(); + parameterCounter = end + 1; + if (assertionMode) { + + moduleStringAppend("("); + moduleStringAppend("TLCSet("); + moduleStringAppend(""+start); + moduleStringAppend(", TRUE) /\\ "); + for (int i = start; i < end; i++) { + moduleStringAppend("TLCSet("); + moduleStringAppend("" + (i + 1)); + moduleStringAppend(", \"NULL\")"); + moduleStringAppend(" /\\ "); + } + } + moduleStringAppend("\\A "); for (int i = 0; i < copy.size(); i++) { PExpression e = copy.get(i); e.apply(this); moduleStringAppend(" \\in "); typeRestrictor.getRestrictedNode(e).apply(this); - ; if (i < copy.size() - 1) { moduleStringAppend(", "); } } moduleStringAppend(" : "); - node.getImplication().apply(this); + if (assertionMode) { + int j = start; + for (int i = 0; i < copy.size(); i++) { + PExpression e = copy.get(i); + moduleStringAppend("TLCSet("); + moduleStringAppend("" + (i + 1)); + moduleStringAppend(", "); + e.apply(this); + moduleStringAppend(")"); + moduleStringAppend(" /\\ "); + j ++; + } + + assertionMode = false; + + moduleStringAppend(" IF "); + node.getImplication().apply(this); + moduleStringAppend(" THEN TRUE "); + moduleStringAppend(" ELSE SaveValue(<< \""); + moduleStringAppend(assertionName); + moduleStringAppend("\", "); + for (int i = start; i < end; i++) { + moduleStringAppend("TLCGet("); + moduleStringAppend("" + (i + 1)); + moduleStringAppend(")"); + if(i<copy.size()-1){ + moduleStringAppend(", "); + } + + } + moduleStringAppend(" >>) "); + moduleStringAppend("/\\ TLCSet("); + moduleStringAppend(""+start); + moduleStringAppend(", FALSE)"); + moduleStringAppend(")"); + moduleStringAppend(" /\\ TLCGet("); + moduleStringAppend("" + start); + moduleStringAppend(")"); + } else { + node.getImplication().apply(this); + } + outAForallPredicate(node); } diff --git a/src/main/resources/standardModules/ExternalFunctions.tla b/src/main/resources/standardModules/ExternalFunctions.tla index 81f00fbcdad3d4ae9ee59c1baafb9d35d2f193f8..b411bce3f70e2ee4de3df62e72ef03cbd53172b2 100644 --- a/src/main/resources/standardModules/ExternalFunctions.tla +++ b/src/main/resources/standardModules/ExternalFunctions.tla @@ -17,28 +17,7 @@ LOCAL SPLIT1(s,c,start,i) == STRING_SPLIT(s, c) == SPLIT1(s,c,1,1) -LOCAL DIGIT_TO_STRING(x) == - CASE x = 0 -> "0" - [] x = 1 -> "1" - [] x= 2 -> "2" - [] x = 3 -> "3" - [] x = 4 -> "4" - [] x= 5 -> "5" - [] x= 6 -> "6" - [] x= 7 -> "7" - [] x=8 -> "8" - [] x=9 -> "9" - -RECURSIVE INT_TO_STRING1(_) -LOCAL INT_TO_STRING1(i) == - IF i < 10 - THEN DIGIT_TO_STRING(i) - ELSE INT_TO_STRING1(i\div10) \o DIGIT_TO_STRING(i%10) - -INT_TO_STRING(i) == - IF i < 0 - THEN "-" \o INT_TO_STRING1(-i) - ELSE INT_TO_STRING1(i) +INT_TO_STRING(i) == ToString(i) LOCAL Max(S) == CHOOSE x \in S : \A p \in S : x >= p RECURSIVE SORT_SET(_) diff --git a/src/test/java/de/tlc4b/analysis/SetComprehensionOptimizerTest.java b/src/test/java/de/tlc4b/analysis/SetComprehensionOptimizerTest.java index e0d860f7124504b885572cd890b133c3ad8d2bee..ef866176c6cf2185ce9975baecfd0056fd979df0 100644 --- a/src/test/java/de/tlc4b/analysis/SetComprehensionOptimizerTest.java +++ b/src/test/java/de/tlc4b/analysis/SetComprehensionOptimizerTest.java @@ -2,6 +2,7 @@ package de.tlc4b.analysis; import static de.tlc4b.util.TestUtil.compare; +import org.junit.Ignore; import org.junit.Test; public class SetComprehensionOptimizerTest { @@ -76,6 +77,7 @@ public class SetComprehensionOptimizerTest { compare(expected, machine); } + @Test public void testDomain() throws Exception { String machine = "MACHINE test\n" @@ -87,6 +89,31 @@ public class SetComprehensionOptimizerTest { compare(expected, machine); } + @Ignore + @Test + public void testDomain2() throws Exception { + String machine = "MACHINE test\n" + + "PROPERTIES {a,b| a : 1..3 & b = dom({x,y| y : 1..10 & x = y+1}) } /= {} \n" + "END"; + String expected = "---- MODULE test----\n" + + "EXTENDS Naturals\n" + + "ASSUME {<<a, {y + 1: y \\in {y \\in ((1 .. 10)): TRUE}}>>: a \\in {a \\in ((1 .. 3)): TRUE}} # {} \n" + + "======"; + compare(expected, machine); + } + + @Ignore + @Test + public void testDomain3() throws Exception { + String machine = "MACHINE test\n" + + "PROPERTIES {a,b| a = 1 & b = dom({a,b| a : 1..10 & a = b+1}) } /= {} \n" + "END"; + String expected = "---- MODULE test----\n" + + "EXTENDS Naturals\n" + + "ASSUME {<<a, {y + 1: y \\in {y \\in ((1 .. 10)): TRUE}}>>: a \\in {a \\in ((1 .. 3)): TRUE}} # {} \n" + + "======"; + compare(expected, machine); + } + + @Test public void testDoubleDomain() throws Exception { String machine = "MACHINE test\n"