diff --git a/src/main/java/de/tla2b/analysis/BOperation.java b/src/main/java/de/tla2b/analysis/BOperation.java index 2a0a2e8d992a6a5e22b35a7b520be41a585190ad..d849dede3ff1b616fcffca3b01be583fcd8f098b 100644 --- a/src/main/java/de/tla2b/analysis/BOperation.java +++ b/src/main/java/de/tla2b/analysis/BOperation.java @@ -53,6 +53,7 @@ public class BOperation extends BuiltInOPs implements ASTConstants, private final ArrayList<ExprOrOpArgNode> beforeAfterPredicates; private LinkedHashMap<SymbolNode, ExprOrOpArgNode> assignments = new LinkedHashMap<SymbolNode, ExprOrOpArgNode>(); private List<OpDeclNode> anyVariables; + private final SpecAnalyser specAnalyser; final int SUBSTITUTE_PARAM = 29; @@ -61,6 +62,7 @@ public class BOperation extends BuiltInOPs implements ASTConstants, this.name = name; this.node = n; this.existQuans = existQuans; + this.specAnalyser = specAnalyser; this.unchangedVariablesList = new ArrayList<OpDeclNode>(); this.guards = new ArrayList<ExprOrOpArgNode>(); this.beforeAfterPredicates = new ArrayList<ExprOrOpArgNode>(); @@ -74,7 +76,6 @@ public class BOperation extends BuiltInOPs implements ASTConstants, } public AOperation getBOperation(BAstCreator bASTCreator) { - AOperation operation = new AOperation(); List<PExpression> paramList = new ArrayList<PExpression>(); ArrayList<PPredicate> whereList = new ArrayList<PPredicate>(); @@ -214,7 +215,14 @@ public class BOperation extends BuiltInOPs implements ASTConstants, } } } + anyVariables = new ArrayList<OpDeclNode>(); + for (OpDeclNode var : specAnalyser.getModuleNode().getVariableDecls()) { + anyVariables.add(var); + } +// for (SymbolNode symbol : primedVariablesFinder.getAllVariables()) { +// anyVariables.add((OpDeclNode) symbol); +// } anyVariables.removeAll(assignments.keySet()); } @@ -305,7 +313,6 @@ public class BOperation extends BuiltInOPs implements ASTConstants, private void findUnchangedVariables() { unchangedVariables = new ArrayList<String>(); findUnchangedVaribalesInSemanticNode(node); - anyVariables.removeAll(unchangedVariablesList); } /** @@ -387,7 +394,7 @@ class PrimedVariablesFinder extends AbstractASTVisitor { this.all = new HashSet<SymbolNode>(); this.twiceUsedVariables = new HashSet<SymbolNode>(); this.table = new Hashtable<SemanticNode, Set<SymbolNode>>(); - + for (ExprOrOpArgNode exprOrOpArgNode : list) { findPrimedVariables(exprOrOpArgNode); } @@ -404,7 +411,7 @@ class PrimedVariablesFinder extends AbstractASTVisitor { case OPCODE_prime: // prime { - if (n.getArgs()[0] instanceof OpApplNode){ + if (n.getArgs()[0] instanceof OpApplNode) { OpApplNode varNode = (OpApplNode) n.getArgs()[0]; SymbolNode var = varNode.getOperator(); @@ -429,4 +436,7 @@ class PrimedVariablesFinder extends AbstractASTVisitor { return this.twiceUsedVariables; } + public Set<SymbolNode> getAllVariables() { + return this.all; + } } diff --git a/src/main/java/de/tla2b/translation/BMacroHandler.java b/src/main/java/de/tla2b/translation/BMacroHandler.java index 21443fb9aed69c4ae5206561b762d7bb1c18bd76..6ef40fabb0796e0702235ba80beaa65a7bb5967d 100644 --- a/src/main/java/de/tla2b/translation/BMacroHandler.java +++ b/src/main/java/de/tla2b/translation/BMacroHandler.java @@ -41,16 +41,6 @@ public class BMacroHandler extends AbstractASTVisitor { } visitAssumptions(moduleNode.getAssumptions()); - - for (BOperation op : specAnalyser.getBOperations()) { - definitionParameters = new HashSet<FormalParamNode>(); - localVariables = new HashSet<FormalParamNode>(); - - visitExprNode(op.getNode()); - - definitionParameters = null; - localVariables = null; - } } private HashSet<FormalParamNode> definitionParameters; @@ -97,10 +87,6 @@ public class BMacroHandler extends AbstractASTVisitor { case OPCODE_sso: // $SubsetOf Represents {x \in S : P} case OPCODE_soa: // $SetOfAll Represents {e : p1 \in S, p2,p3 \in S2} { - ExprNode[] in = n.getBdedQuantBounds(); - for (ExprNode exprNode : in) { - visitExprNode(exprNode); - } FormalParamNode[][] params = n.getBdedQuantSymbolLists(); HashSet<FormalParamNode> set = new HashSet<FormalParamNode>(); @@ -111,6 +97,10 @@ public class BMacroHandler extends AbstractASTVisitor { } } localVariables.addAll(set); + ExprNode[] in = n.getBdedQuantBounds(); + for (ExprNode exprNode : in) { + visitExprNode(exprNode); + } ExprOrOpArgNode[] arguments = n.getArgs(); for (ExprOrOpArgNode exprOrOpArgNode : arguments) { visitExprOrOpArgNode(exprOrOpArgNode); @@ -126,7 +116,7 @@ public class BMacroHandler extends AbstractASTVisitor { } } - + private Set<String> getStringSet(Set<FormalParamNode> set) { HashSet<String> stringSet = new HashSet<String>(); diff --git a/src/main/java/de/tla2bAst/BAstCreator.java b/src/main/java/de/tla2bAst/BAstCreator.java index 3366bc9e3ab857f6c9af06879dcdb9c3fadccf2a..d4da3ff1316d91a0789f08386dd68f26c501834f 100644 --- a/src/main/java/de/tla2bAst/BAstCreator.java +++ b/src/main/java/de/tla2bAst/BAstCreator.java @@ -442,7 +442,7 @@ public class BAstCreator extends BuiltInOPs implements TranslationGlobals, valueList); any.setThen(assign); operation.setOperationBody(any); - //opList.add(operation); + // opList.add(operation); opList.add(op.getBOperation(this)); } @@ -823,7 +823,8 @@ public class BAstCreator extends BuiltInOPs implements TranslationGlobals, .getToolObject(SUBSTITUTE_PARAM); if (e == null) { if (recursiveFunctionHandler.isRecursiveFunction(param)) { - ArrayList<SymbolNode> list = recursiveFunctionHandler.getAdditionalParams(param); + ArrayList<SymbolNode> list = recursiveFunctionHandler + .getAdditionalParams(param); if (list.size() > 0) { AFunctionExpression call = new AFunctionExpression(); call.setIdentifier(createIdentifierNode(param)); @@ -903,7 +904,8 @@ public class BAstCreator extends BuiltInOPs implements TranslationGlobals, } if (specAnalyser.getRecursiveFunctions().contains(def)) { - ArrayList<SymbolNode> list = recursiveFunctionHandler.getAdditionalParams(def); + ArrayList<SymbolNode> list = recursiveFunctionHandler + .getAdditionalParams(def); if (list.size() > 0) { AFunctionExpression call = new AFunctionExpression(); call.setIdentifier(createIdentifierNode(def)); @@ -1426,13 +1428,14 @@ public class BAstCreator extends BuiltInOPs implements TranslationGlobals, lambda.setExpression(visitExprOrOpArgNodeExpression(n.getArgs()[0])); if (recursiveFunctionHandler.isRecursiveFunction(n)) { - - ArrayList<SymbolNode> externParams = recursiveFunctionHandler.getAdditionalParams(n); - if(externParams.size()>0){ + + ArrayList<SymbolNode> externParams = recursiveFunctionHandler + .getAdditionalParams(n); + if (externParams.size() > 0) { ALambdaExpression lambda2 = new ALambdaExpression(); ArrayList<PExpression> shiftedParams = new ArrayList<PExpression>(); List<PPredicate> predList2 = new ArrayList<PPredicate>(); - for (SymbolNode p :externParams) { + for (SymbolNode p : externParams) { shiftedParams.add(createIdentifierNode(p)); AMemberPredicate member = new AMemberPredicate(); @@ -1952,8 +1955,30 @@ public class BAstCreator extends BuiltInOPs implements TranslationGlobals, } case OPCODE_unchanged: { - return new AEqualPredicate(new ABooleanTrueExpression(), - new ABooleanTrueExpression()); + OpApplNode node = (OpApplNode) n.getArgs()[0]; + if (node.getOperator().getKind() == VariableDeclKind) { + AEqualPredicate equal = new AEqualPredicate(); + equal.setLeft(createIdentifierNode(getName(node.getOperator()) + + "_n")); + equal.setRight(createIdentifierNode(node.getOperator())); + return equal; + } else if (node.getOperator().getKind() == UserDefinedOpKind) { + OpDefNode operator = (OpDefNode) node.getOperator(); + ExprNode e = operator.getBody(); + OpApplNode opApplNode = (OpApplNode) e; + node = opApplNode; + } + + ArrayList<PPredicate> list = new ArrayList<PPredicate>(); + for (int i = 0; i < node.getArgs().length; i++) { + OpApplNode var = (OpApplNode) node.getArgs()[i]; + AEqualPredicate equal = new AEqualPredicate(); + equal.setLeft(createIdentifierNode(getName(var.getOperator()) + + "_n")); + equal.setRight(createIdentifierNode(var.getOperator())); + list.add(equal); + } + return createConjunction(list); } case OPCODE_uc: { // CHOOSE x : P diff --git a/src/test/resources/prettyprint/OperationsTest/OperationsTest.mch b/src/test/resources/prettyprint/OperationsTest/OperationsTest.mch index 7d8c2bc85a39abb63edfc6e6a3d3a9580da6d8b2..de6fddd4f7891dfd24e344879dc8bf8663bd231d 100644 --- a/src/test/resources/prettyprint/OperationsTest/OperationsTest.mch +++ b/src/test/resources/prettyprint/OperationsTest/OperationsTest.mch @@ -5,15 +5,15 @@ INVARIANT INITIALISATION a, b, c:((a = 1 & b = 2) & c = 3) OPERATIONS - begin1 = BEGIN skip END; + begin1 = BEGIN a,b,c := 1,2,3 END; - begin2 = BEGIN a,b,c := 1,2,3 END; + any1 = ANY a_n, b_n, c_n WHERE (((a_n : INTEGER & b_n : INTEGER) & c_n : INTEGER) & a_n + 1 = 2) & (b_n = b & c_n = c) THEN a,b,c := a_n,b_n,c_n END; - any1 = ANY a_n WHERE (a_n : INTEGER & a_n + 1 = 2) & TRUE = TRUE THEN a := a_n END; + any2 = ANY a_n, b_n, c_n WHERE ((((1 = 1 & a_n : INTEGER) & b_n : INTEGER) & c_n : INTEGER) & a_n + 1 = 2) & (b_n = b & c_n = c) THEN a,b,c := a_n,b_n,c_n END; - any2 = ANY a_n WHERE ((1 = 1 & a_n : INTEGER) & a_n + 1 = 2) & TRUE = TRUE THEN a := a_n END; + any3 = ANY a_n, b_n, c_n WHERE ((((a_n : INTEGER & b_n : INTEGER) & c_n : INTEGER) & a_n = 2) & a_n > 1) & (b_n = b & c_n = c) THEN a,b,c := a_n,b_n,c_n END; - any3 = ANY a_n WHERE ((a_n : INTEGER & a_n = 2) & a_n > 1) & TRUE = TRUE THEN a := a_n END; + any4 = ANY a_n, b_n, c_n WHERE ((a_n : INTEGER & b_n : INTEGER) & c_n : INTEGER) & ((a_n = a & b_n = b) & c_n = c) THEN a,b,c := a_n,b_n,c_n END; select = SELECT 1 = 1 THEN a,b,c := 1,2,3 END -END +END \ No newline at end of file diff --git a/src/test/resources/prettyprint/OperationsTest/OperationsTest.tla b/src/test/resources/prettyprint/OperationsTest/OperationsTest.tla index 6ba867cafcef0d110efa12a5141af9720017d7ac..2c89bf8f8f33e8bee7b62813316d477cb7508a75 100644 --- a/src/test/resources/prettyprint/OperationsTest/OperationsTest.tla +++ b/src/test/resources/prettyprint/OperationsTest/OperationsTest.tla @@ -3,20 +3,20 @@ EXTENDS Naturals VARIABLES a,b,c Init == a = 1 /\ b = 2 /\ c =3 -begin1 == UNCHANGED<<a,b,c>> -begin2 == a' = 1 /\ b' = 2 /\ c' = 3 + +begin1 == a' = 1 /\ b' = 2 /\ c' = 3 any1 == a' + 1 = 2 /\ UNCHANGED<<b,c>> any2 == 1 = 1 /\ a' + 1 = 2 /\ UNCHANGED<<b,c>> any3 == a'= 2 /\ a' >1 /\ UNCHANGED<<b,c>> - +any4 == UNCHANGED<<a,b,c>> select == 1 = 1 /\ a' = 1 /\ b' = 2 /\ c' =3 Next == \/ begin1 - \/ begin2 \/ any1 \/ any2 \/ any3 + \/ any4 \/ select ================================= \ No newline at end of file