Exemple #1
0
 /// <summary>
 /// For a nullary function, return its value.
 /// </summary>
 public Element GetConstant()
 {
     if (Arity != 0)
     {
         throw new ArgumentException();
     }
     if (apps.Count == 0)
     {
         SetConstant(Model.MkElement("**" + Name));
     }
     return(apps[0].Result);
 }
        public void PopulateModelWithStates()
        {
            Contract.Requires(Model != null);

            Model m = Model;

            ApplyRedirections();

            var mvstates = m.TryGetFunc("$mv_state");

            if (MvInfo == null || mvstates == null || (mvstates.Arity == 1 && mvstates.Apps.Count() == 0))
            {
                return;
            }

            Contract.Assert(mvstates.Arity == 2);

            foreach (Variable v in MvInfo.AllVariables)
            {
                m.InitialState.AddBinding(v.Name, GetModelValue(v));
            }

            var states = new List <int>();

            foreach (var t in mvstates.Apps)
            {
                states.Add(t.Args[1].AsInt());
            }

            states.Sort();

            for (int i = 0; i < states.Count; ++i)
            {
                var s = states[i];
                if (0 <= s && s < MvInfo.CapturePoints.Count)
                {
                    VC.ModelViewInfo.Mapping map = MvInfo.CapturePoints[s];
                    var prevInc = i > 0 ? MvInfo.CapturePoints[states[i - 1]].IncarnationMap : new Dictionary <Variable, Expr>();
                    var cs      = m.MkState(map.Description);

                    foreach (Variable v in MvInfo.AllVariables)
                    {
                        Expr e = map.IncarnationMap.ContainsKey(v) ? map.IncarnationMap[v] : null;
                        if (e == null)
                        {
                            continue;
                        }

                        Expr prevIncV = prevInc.ContainsKey(v) ? prevInc[v] : null;
                        if (prevIncV == e)
                        {
                            continue;    // skip unchanged variables
                        }
                        Model.Element elt;

                        if (e is IdentifierExpr)
                        {
                            IdentifierExpr ide = (IdentifierExpr)e;
                            elt = GetModelValue(ide.Decl);
                        }
                        else if (e is LiteralExpr)
                        {
                            LiteralExpr lit = (LiteralExpr)e;
                            elt = m.MkElement(lit.Val.ToString());
                        }
                        else
                        {
                            elt = m.MkFunc(e.ToString(), 0).GetConstant();
                        }

                        cs.AddBinding(v.Name, elt);
                    }
                }
                else
                {
                    Contract.Assume(false);
                }
            }
        }
Exemple #3
0
        private void GetModelWithStates(Model m, RPFP.Node cex, StratifiedInliningInfo mainInfo,
            List<StateId> orderedStateIds,
            Dictionary<int,Dictionary<string,string>> varSubst)
        {
            if (m == null) return;
            var mvInfo = mainInfo.mvInfo;

            foreach (Variable v in mvInfo.AllVariables)
            {
                m.InitialState.AddBinding(v.Name, GetModelValue(m, v, varSubst[cex.Outgoing.number]));
            }

            Dictionary<int, RPFP.Edge> edgeNumbering = new Dictionary<int,RPFP.Edge>();
            NumberCexEdges(cex, edgeNumbering);

            int lastCandidate = 0;
            int lastCapturePoint = CALL;
            for (int i = 0; i < orderedStateIds.Count; ++i)
            {
                var s = orderedStateIds[i];
                RPFP.Edge edge = s.edge;
                int candidate = edge.number;
                int capturePoint = s.capturePoint;
                Dictionary<string, string> subst = varSubst[candidate];

                string implName = edge.Parent.Name.GetDeclName();
                var info = s.info.mvInfo;

                if (capturePoint == CALL || capturePoint == RETURN)
                {
                    lastCandidate = candidate;
                    lastCapturePoint = capturePoint;
                    continue;
                }

                Contract.Assume(0 <= capturePoint && capturePoint < info.CapturePoints.Count);
                VC.ModelViewInfo.Mapping map = info.CapturePoints[capturePoint];
                var prevInc = (lastCapturePoint != CALL && lastCapturePoint != RETURN && candidate == lastCandidate)
                  ? info.CapturePoints[lastCapturePoint].IncarnationMap : new Dictionary<Variable, Expr>();
                var cs = m.MkState(map.Description);

                foreach (Variable v in info.AllVariables)
                {
                    var e = (Expr)map.IncarnationMap[v];

                    if (e == null)
                    {
                        if (lastCapturePoint == CALL || lastCapturePoint == RETURN)
                        {
                            cs.AddBinding(v.Name, GetModelValue(m, v, subst));
                        }
                        continue;
                    }

                    if (lastCapturePoint != CALL && lastCapturePoint != RETURN && prevInc[v] == e) continue; // skip unchanged variables

                    Model.Element elt;
                    if (e is IdentifierExpr)
                    {
                        IdentifierExpr ide = (IdentifierExpr)e;
                        elt = GetModelValue(m, ide.Decl, subst);
                    }
                    else if (e is LiteralExpr)
                    {
                        LiteralExpr lit = (LiteralExpr)e;
                        elt = m.MkElement(lit.Val.ToString());
                    }
                    else
                    {
                        Contract.Assume(false);
                        elt = m.MkFunc(e.ToString(), 0).GetConstant();
                    }
                    cs.AddBinding(v.Name, elt);
                }

                lastCandidate = candidate;
                lastCapturePoint = capturePoint;
            }

            return;
        }
Exemple #4
0
        private Model.Element getValue(VCExpr arg, Model model)
        {
            if (arg is VCExprLiteral)
            {
                //return model.GetElement(arg.ToString());
                return model.MkElement(arg.ToString());
            }

            else if (arg is VCExprVar)
            {
                var el = model.TryGetFunc(prover.Context.Lookup(arg as VCExprVar));
                if (el != null)
                {
                    Debug.Assert(el.Arity == 0 && el.AppCount == 1);
                    return el.Apps.First().Result;
                }
                else
                {
                    // Variable not defined; assign arbitrary value
                    if (arg.Type.IsBool)
                        return model.MkElement("false");
                    else if (arg.Type.IsInt)
                        return model.MkIntElement(0);
                    else
                        return null;
                }
            }
            else if (arg is VCExprNAry && (arg as VCExprNAry).Op is VCExprBvOp)
            {
                // support for BV constants
                var bvc = (arg as VCExprNAry)[0] as VCExprLiteral;
                if (bvc != null)
                {
                    var ret = model.TryMkElement(bvc.ToString() + arg.Type.ToString());
                    if (ret != null && (ret is Model.BitVector)) return ret;
                }
            }

            var val = prover.Evaluate(arg);
            if (val is int || val is bool || val is Microsoft.Basetypes.BigNum)
            {
                return model.MkElement(val.ToString());
            }
            else
            {
                Debug.Assert(false);
            }
            return null;
        }
Exemple #5
0
        private Model.Element GetModelValue(Model m, Variable v, Dictionary<string,string> subst)
        {
            // first, get the unique name
            string uniqueName;

            VCExprVar vvar = boogieContext.BoogieExprTranslator.TryLookupVariable(v);

            uniqueName = v.Name;

            if(subst.ContainsKey(uniqueName))
                return m.MkElement(subst[uniqueName]);
            return m.MkFunc("@undefined", 0).GetConstant();
        }