Beispiel #1
0
        // Always safe to return Top
        public static Value Evaluate(Expr expr, Dictionary <string, Value> subst)
        {
            var vused = new VarsUsed();

            vused.Visit(expr);

            // Make sure we have values of all variables except in-formals
            var informals = vused.Vars.Where(v => !subst.ContainsKey(v.Name));

            if (informals.All(v => (v is Formal) && ((v as Formal).InComing)))
            {
            }
            else
            {
                return(Value.GetTop());
            }

            if (vused.Vars.Any(v => subst.ContainsKey(v.Name) && subst[v.Name].ToSingletonVar() == null))
            {
                return(GetTop());
            }

            var vsubst = new Dictionary <string, Variable>();

            subst.Keys.Iter(v => vsubst.Add(v, subst[v].ToSingletonVar()));

            var dup = new FixedDuplicator();
            var ne  = (new VarSubstituter(vsubst, new Dictionary <string, Variable>())).VisitExpr(dup.VisitExpr(expr));

            return(Value.GetSingleton(ne));
        }
Beispiel #2
0
        public Value Subst(Dictionary <string, Value> subst)
        {
            if (isTrue)
            {
                return(this);
            }
            var newc = new HashSet <int>(constants);
            var newv = new HashSet <Variable>();
            var newe = new HashSet <Expr>();

            foreach (var v in vars)
            {
                Debug.Assert(subst.ContainsKey(v.Name));
                if (subst[v.Name].isTrue)
                {
                    return(GetTop());
                }
                newc.UnionWith(subst[v.Name].constants);
                newv.UnionWith(subst[v.Name].vars);
                newe.UnionWith(subst[v.Name].constExprs);
            }

            foreach (var e in constExprs)
            {
                var vused = new VarsUsed();
                vused.VisitExpr(e);

                Debug.Assert(vused.varsUsed.All(v => subst.ContainsKey(v)));

                if (vused.varsUsed.Any(v => subst[v].ToSingletonVar() == null))
                {
                    return(GetTop());
                }

                var vsubst = new Dictionary <string, Variable>();
                vused.varsUsed.Iter(v => vsubst.Add(v, subst[v].ToSingletonVar()));

                var dup = new FixedDuplicator();
                var ne  = (new VarSubstituter(vsubst, new Dictionary <string, Variable>())).VisitExpr(dup.VisitExpr(e));
                newe.Add(ne);
            }

            newe = removeDuplicates(newe);
            if (newe.Count > maxExprsToTrack)
            {
                return(GetTop());
            }

            var ret = new Value();

            ret.vars       = newv;
            ret.constants  = newc;
            ret.constExprs = newe;
            ret.isTrue     = false;

            return(ret);
        }