// 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)); }
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); }