private void ReplacePreOrPostStateVars()
            {
                var sub = new Dictionary <Variable, Expr>();

                foreach (var v in trc.allInParams)
                {
                    sub[varCopies[v][0]] = Expr.Ident(v);
                }
                foreach (var v in trc.frame)
                {
                    sub[varCopies[v][0]] = ExprHelper.Old(Expr.Ident(v));
                }

                if (!trc.ignorePostState)
                {
                    foreach (var v in trc.PostStateVars)
                    {
                        var lastCopy = varCopies[v].Last();
                        if (sub.ContainsKey(lastCopy))
                        {
                            Debug.Assert(trc.frame.Contains(v) && lastCopy == varCopies[v][0]);
                            pathExprs.Add(Expr.Eq(Expr.Ident(v), sub[lastCopy]));
                        }
                        // In case of conflict we prefer "v" instead of "old(v)"
                        sub[lastCopy] = Expr.Ident(v);
                    }
                }

                pathExprs = SubstitutionHelper.Apply(sub, pathExprs).ToList();
            }
            private void AddBoundVariablesForRemainingVars()
            {
                var remainingVars = NotEliminatedVars.Except(IntermediateFrameWithWitnesses);

                existsVarMap = remainingVars.ToDictionary(v => (Variable)VarHelper.BoundVariable(v.Name, v.TypedIdent.Type));
                pathExprs    = SubstitutionHelper.Apply(existsVarMap, pathExprs).ToList();
            }
            private void TryElimination(IEnumerable <Variable> extraDefinedVariables)
            {
                bool Defined(Variable v) => varToExpr.ContainsKey(v) || extraDefinedVariables.Contains(v);

                bool changed;

                do
                {
                    changed = false;
                    var remainingAssignments = new List <Assignment>();
                    foreach (var assignment in assignments)
                    {
                        if (!Defined(assignment.Var) &&
                            VariableCollector.Collect(assignment.Expr).
                            Intersect(AllIntroducedVariables).All(Defined))
                        {
                            varToExpr[assignment.Var] = SubstitutionHelper.Apply(varToExpr, assignment.Expr);
                            changed = true;
                        }
                        else
                        {
                            remainingAssignments.Add(assignment);
                        }
                    }
                    Substitution sub = Substituter.SubstitutionFromHashtable(varToExpr);
                    foreach (var assignment in remainingAssignments)
                    {
                        assignment.Expr = Substituter.Apply(sub, assignment.Expr);
                    }
                    assignments = remainingAssignments;
                    assumes     = SubstitutionHelper.Apply(sub, assumes).ToList();
                } while (changed);
            }
Beispiel #4
0
 private static QKeyValue CloneAttributes(QKeyValue kv, Dictionary <Variable, Variable> substMap)
 {
     if (kv == null)
     {
         return(null);
     }
     return(new QKeyValue(kv.tok, kv.Key,
                          kv.Params.Select(p => p is Expr ? SubstitutionHelper.Apply(substMap, (Expr)p) : p).ToList(),
                          CloneAttributes(kv.Next, substMap)));
 }
Beispiel #5
0
            private void AddBoundVariablesForRemainingVars()
            {
                var remainingVars = NotEliminatedVars.Except(IntermediateFrameWithWitnesses);

                existsVarMap = remainingVars.ToDictionary(v => v, v => (Variable)VarHelper.BoundVariable(v.Name, v.TypedIdent.Type));
                var substMap = remainingVars.ToDictionary(v => copyToOriginalVar[v], v => existsVarMap[v]);

                existsVarMap.Iter(kv => kv.Value.Attributes = CloneAttributes(copyToOriginalVar[kv.Key].Attributes, substMap));
                pathExprs = SubstitutionHelper.Apply(existsVarMap, pathExprs).ToList();
            }
            private void ComputeWitnessedTransitionRelationExprs()
            {
                witnessedTransitionRelations = new List <Expr>();
                Dictionary <Variable, List <CommutativityWitness> > varToWitnesses = trc.FrameWithWitnesses.
                                                                                     Where(x => NotEliminatedVars.Contains(frameIntermediateCopy[x])).
                                                                                     ToDictionary(
                    x => frameIntermediateCopy[x],
                    x => trc.globalVarToWitnesses[(GlobalVariable)x]);

                foreach (var witnessSet in varToWitnesses.Values.CartesianProduct())
                {
                    Dictionary <Variable, Expr> witnessSubst = new Dictionary <Variable, Expr>();
                    foreach (Tuple <Variable, CommutativityWitness> pair in
                             Enumerable.Zip(varToWitnesses.Keys, witnessSet, Tuple.Create))
                    {
                        CommutativityWitness witness = pair.Item2;
                        witnessSubst[pair.Item1] = ExprHelper.FunctionCall(
                            witness.function, witness.args.ToArray()
                            );
                    }
                    witnessedTransitionRelations.Add(
                        SubstitutionHelper.Apply(witnessSubst, TransitionRelationExpr));
                }
            }