Пример #1
0
        private Term SubstPredsRec(TermDict <Term> memo, Dictionary <FuncDecl, FuncDecl> subst, Term t)
        {
            Term res;

            if (memo.TryGetValue(t, out res))
            {
                return(res);
            }
            if (t.GetKind() == TermKind.App)
            {
                var args = t.GetAppArgs();
                args = args.Select(x => SubstPredsRec(memo, subst, x)).ToArray();
                FuncDecl nf = null;
                var      f  = t.GetAppDecl();
                if (subst.TryGetValue(f, out nf))
                {
                    res = ctx.MkApp(nf, args);
                }
                else
                {
                    res = ctx.CloneApp(t, args);
                }
            } // TODO: handle quantifiers
            else
            {
                res = t;
            }

            memo.Add(t, res);
            return(res);
        }
Пример #2
0
        private Term BindVariables(Term t, bool universal = true)
        {
            TermDict <bool> memo = new TermDict <bool>();
            List <Term>     vars = new List <Term>();

            CollectVariables(memo, t, vars);
            return(universal ? ctx.MkForall(vars.ToArray(), t) : ctx.MkExists(vars.ToArray(), t));
        }
Пример #3
0
 private void CollectVariables(TermDict <bool> memo, Term t, List <Term> vars)
 {
     if (memo.ContainsKey(t))
     {
         return;
     }
     if (IsVariable(t))
     {
         vars.Add(t);
     }
     if (t.GetKind() == TermKind.App)
     {
         foreach (var s in t.GetAppArgs())
         {
             CollectVariables(memo, s, vars);
         }
     }
     memo.Add(t, true);
 }
Пример #4
0
        private Edge GetEdgeFromClause(Term t, FuncDecl failName)
        {
            Term[] args = t.GetAppArgs();
            Term   body = args[0];
            Term   head = args[1];

            Term[]   _IndParams;
            FuncDecl Name;

            if (head.IsFalse())
            {
                Name       = failName;
                _IndParams = new Term[0];
            }
            else
            {
                _IndParams = head.GetAppArgs();
                Name       = head.GetAppDecl();
            }

            for (int i = 0; i < _IndParams.Length; i++)
            {
                if (!IsVariable(_IndParams[i]))
                {
                    Term v = ctx.MkConst("@a" + i.ToString(), _IndParams[i].GetSort());
                    body          = ctx.MkAnd(body, ctx.MkEq(v, _IndParams[i]));
                    _IndParams[i] = v;
                }
            }

            var relParams  = new List <FuncDecl>();
            var nodeParams = new List <RPFP.Node>();
            var memo       = new TermDict <Term>();
            var done       = new Dictionary <Term, Term>(); // note this hashes on equality, not reference!

            body = CollectParamsRec(memo, body, relParams, nodeParams, done);
            Transformer F      = CreateTransformer(relParams.ToArray(), _IndParams, body);
            Node        parent = relationToNode[Name];

            return(CreateEdge(parent, F, nodeParams.ToArray()));
        }
Пример #5
0
        private Term CollectParamsRec(TermDict <Term> memo, Term t, List <FuncDecl> parms, List <RPFP.Node> nodes,
                                      Dictionary <Term, Term> done)
        {
            Term res;

            if (memo.TryGetValue(t, out res))
            {
                return(res);
            }
            if (t.GetKind() == TermKind.App)
            {
                var  f = t.GetAppDecl();
                Node node;
                if (relationToNode.TryGetValue(f, out node))
                {
                    if (done.ContainsKey(t))
                    {
                        res = done[t];
                    }
                    else
                    {
                        f = SuffixFuncDecl(t, parms.Count);
                        parms.Add(f);
                        nodes.Add(node);
                        done.Add(t, res); // don't count same expression twice!
                    }
                }

                var args = t.GetAppArgs();
                args = args.Select(x => CollectParamsRec(memo, x, parms, nodes, done)).ToArray();
                res  = ctx.CloneApp(t, args);
            } // TODO: handle quantifiers
            else
            {
                res = t;
            }

            memo.Add(t, res);
            return(res);
        }
Пример #6
0
 private Term SubstRec(TermDict< Term> memo, Term t)
 {
     Term res;
     if (memo.TryGetValue(t, out res))
         return res;
     var kind = t.GetKind();
     if (kind == TermKind.App)
     {
         // var f = t.GetAppDecl();
         var args = t.GetAppArgs().Select(x => SubstRec(memo, x)).ToArray();
         res = ctx.CloneApp(t, args);
     }
     else res = t;
     memo.Add(t, res);
     return res;
 }
Пример #7
0
 private void FactorVCs(Term t, List<Term> vcs)
 {
     List<Term> small = new List<Term>();
     ExtractSmallerVCs(t, small);
     foreach (var smm in small)
     {
         List<Term> goals = new List<Term>();
         List<Term> cruft = new List<Term>();
         var sm = largeblock ? MergeGoals(smm) : smm;
         CollectGoals(sm, goals,cruft);
         foreach (var goal in goals)
         {
             TermDict< Term> memo = new TermDict< Term>();
             foreach (var othergoal in goals)
                 memo.Add(othergoal, othergoal.Equals(goal) ? ctx.MkFalse() : ctx.MkTrue());
             foreach (var thing in cruft)
                 memo.Add(thing, ctx.MkTrue());
             var vc = SubstRecGoals(memo, sm);
             vc = ctx.MkImplies(ctx.MkNot(vc), goal);
             vcs.Add(vc);
         }
         {
             TermDict< Term> memo = new TermDict< Term>();
             foreach (var othergoal in goals)
                 memo.Add(othergoal, ctx.MkTrue());
             var vc = SubstRecGoals(memo, sm);
             if (vc != ctx.MkTrue())
             {
                 vc = ctx.MkImplies(ctx.MkNot(vc), ctx.MkFalse());
                 vcs.Add(vc);
             }
         }
     }
 }
Пример #8
0
 private Term SubstPreds(Dictionary<FuncDecl, FuncDecl> subst, Term t)
 {
     TermDict< Term> memo = new TermDict< Term>();
     return SubstPredsRec(memo, subst, t);
 }
Пример #9
0
 private Term SubstPredsRec(TermDict< Term> memo, Dictionary<FuncDecl,FuncDecl> subst, Term t)
 {
     Term res;
     if (memo.TryGetValue(t, out res))
         return res;
     if (t.GetKind() == TermKind.App)
     {
         var args = t.GetAppArgs();
         args = args.Select(x => SubstPredsRec(memo,subst,x)).ToArray();
         FuncDecl nf = null;
         var f = t.GetAppDecl();
         if (subst.TryGetValue(f, out nf))
         {
             res = ctx.MkApp(nf, args);
         }
         else
         {
             res = ctx.CloneApp(t, args);
         }
     } // TODO: handle quantifiers
     else
         res = t;
     memo.Add(t, res);
     return res;
 }
Пример #10
0
 private void CollectVariables(TermDict< bool> memo, Term t, List<Term> vars)
 {
     if (memo.ContainsKey(t))
         return;
     if (IsVariable(t))
         vars.Add(t);
     if (t.GetKind() == TermKind.App)
     {
         foreach (var s in t.GetAppArgs())
             CollectVariables(memo, s, vars);
     }
     memo.Add(t, true);
 }
Пример #11
0
 private Edge GetEdgeFromClause(Term t, FuncDecl failName)
 {
     Term[] args = t.GetAppArgs();
     Term body = args[0];
     Term head = args[1];
     Term[] _IndParams;
     FuncDecl Name;
     if (head.IsFalse())
     {
         Name = failName;
         _IndParams = new Term[0];
     }
     else
     {
         _IndParams = head.GetAppArgs();
         Name = head.GetAppDecl();
     }
     for(int i = 0; i < _IndParams.Length; i++)
         if (!IsVariable(_IndParams[i]))
         {
             Term v = ctx.MkConst("@a" + i.ToString(), _IndParams[i].GetSort());
             body = ctx.MkAnd(body, ctx.MkEq(v, _IndParams[i]));
             _IndParams[i] = v;
         }
     var relParams = new List<FuncDecl>();
     var nodeParams = new List<RPFP.Node>();
     var memo = new TermDict< Term>();
     var done = new Dictionary<Term, Term>(); // note this hashes on equality, not reference!
     body = CollectParamsRec(memo, body, relParams, nodeParams,done);
     Transformer F = CreateTransformer(relParams.ToArray(), _IndParams, body);
     Node parent = relationToNode[Name];
     return CreateEdge(parent, F, nodeParams.ToArray());
 }
Пример #12
0
        private Term SubstRecGoals(TermDict< Term> memo, Term t)
        {
            Term res;
            if (memo.TryGetValue(t, out res))
                return res;
            var kind = t.GetKind();
            if (kind == TermKind.App)
            {
                var f = t.GetAppDecl();
                var args = t.GetAppArgs();
                if (f.GetKind() == DeclKind.Implies){
                    res = SubstRecGoals(memo, args[1]);
                    if (res != ctx.MkTrue())
                      res = ctx.MkImplies(args[0],res);
                    goto done;
                }
                else if (f.GetKind() == DeclKind.And)
                {
                    args = args.Select(x => SubstRecGoals(memo, x)).ToArray();
                    args = args.Where(x => x != ctx.MkTrue()).ToArray();
                    res = ctx.MkAnd(args);
                    goto done;
                }
                else if (f.GetKind() == DeclKind.Label)
                {
                    var arg = t.GetAppArgs()[0];
                    var r = arg.GetAppDecl();
                    if (r.GetKind() == DeclKind.Uninterpreted)
                    {
                        if (memo.TryGetValue(arg, out res))
                        {
                            if(res != ctx.MkTrue())
                                res = ctx.MkApp(f, res);
                            goto done;
                        }
                    }
                    else
                    {
                        res = ctx.MkApp(f, SubstRecGoals(memo, arg));
                        goto done;
                    }

                }
                // what's left could be cruft!
                if (memo.TryGetValue(t, out res))
                {
                    goto done;
                }
            }
            res = t;
              done:
            memo.Add(t, res);
            return res;
        }
Пример #13
0
 private Term MergeGoalsRec(TermDict< Term> memo, Term t)
 {
     Term res;
     if (memo.TryGetValue(t, out res))
         return res;
     var kind = t.GetKind();
     if (kind == TermKind.App)
     {
         var f = t.GetAppDecl();
         var args = t.GetAppArgs();
         if (f.GetKind() == DeclKind.Implies)
         {
             res = ctx.MkImplies(args[0], MergeGoalsRec(memo, args[1]));
             goto done;
         }
         else if (f.GetKind() == DeclKind.And)
         {
             args = args.Select(x => MergeGoalsRec(memo, x)).ToArray();
             res = ctx.MkApp(f, args);
             goto done;
         }
         else if (f.GetKind() == DeclKind.Label)
         {
             var arg = t.GetAppArgs()[0];
             var r = arg.GetAppDecl();
             if (r.GetKind() == DeclKind.Uninterpreted)
             {
                 res = NormalizeGoal(arg, f);
                 goto done;
             }
         }
     }
     res = t;
     done:
     memo.Add(t, res);
     return res;
 }
Пример #14
0
 public void GetTransformer(StratifiedInliningInfo info)
 {
     Term vcTerm = boogieContext.VCExprToTerm(info.vcexpr, linOptions);
     Term[] paramTerms = info.interfaceExprVars.Select(x => boogieContext.VCExprToTerm(x, linOptions)).ToArray();
     var relParams = new List<FuncDecl>();
     var nodeParams = new List<RPFP.Node>();
     var memo = new TermDict< Term>();
     var done = new Dictionary<Term,Term>(); // note this hashes on equality, not reference!
     vcTerm = CollectParamsRec(memo, vcTerm, relParams, nodeParams,done);
     // var ops = new Util.ContextOps(ctx);
     // var foo = ops.simplify_lhs(vcTerm);
     // vcTerm = foo.Item1;
     info.F = rpfp.CreateTransformer(relParams.ToArray(), paramTerms, vcTerm);
     info.edge = rpfp.CreateEdge(info.node, info.F, nodeParams.ToArray());
     rpfp.edges.Add(info.edge);
     // TODO labels[info.edge.number] = foo.Item2;
 }
Пример #15
0
 private Term ExtractSmallerVCsRec(TermDict< Term> memo, Term t, List<Term> small, Term lbl = null)
 {
     Term res;
     if (memo.TryGetValue(t, out res))
         return res;
     var kind = t.GetKind();
     if (kind == TermKind.App)
     {
         var f = t.GetAppDecl();
         if (f.GetKind() == DeclKind.Implies){
             var lhs = t.GetAppArgs()[0];
             if(lhs.GetKind() == TermKind.App){
                 var r = lhs.GetAppDecl();
                 if (r.GetKind() == DeclKind.And)
                 {
                     Term q = t.GetAppArgs()[1];
                     var lhsargs = lhs.GetAppArgs();
                     for (int i = lhsargs.Length-1; i >= 0; --i)
                     {
                         q = ctx.MkImplies(lhsargs[i], q);
                     }
                     res = ExtractSmallerVCsRec(memo, q, small,lbl);
                     goto done;
                 }
                 if (r.GetKind() == DeclKind.Label)
                 {
                     var arg = lhs;
                     arg = lhs.GetAppArgs()[0];
                     if (!(arg.GetKind() == TermKind.App && arg.GetAppDecl().GetKind() == DeclKind.Uninterpreted))
                         goto normal;
                     if (!(annotationInfo.ContainsKey(arg.GetAppDecl().GetDeclName()) && annotationInfo[arg.GetAppDecl().GetDeclName()].type == AnnotationInfo.AnnotationType.LoopInvariant))
                         goto normal;
                     var sm = ctx.MkImplies(lhs, ExtractSmallerVCsRec(memo, t.GetAppArgs()[1], small));
                     if (lbl != null)
                         sm = ctx.MkImplies(lbl, sm);
                     small.Add(sm);
                     res = ctx.MkTrue();
                     goto done;
                 }
                 if (r.GetKind() == DeclKind.Uninterpreted)
                 {
                     var arg = lhs;
                     if (!(annotationInfo.ContainsKey(arg.GetAppDecl().GetDeclName()) && annotationInfo[arg.GetAppDecl().GetDeclName()].type == AnnotationInfo.AnnotationType.LoopInvariant))
                         goto normal;
                     var sm = ctx.MkImplies(lhs,ExtractSmallerVCsRec(memo,t.GetAppArgs()[1],small));
                     if (lbl != null)
                         sm = ctx.MkImplies(lbl, sm);
                     small.Add(sm);
                     res = ctx.MkTrue();
                     goto done;
                 }
             }
         normal:
             Term newlbl = null;
             if (lhs.IsLabel() && lhs.GetAppArgs()[0] == ctx.MkTrue())
                 newlbl = lhs;
             res = ctx.MkImplies(lhs,ExtractSmallerVCsRec(memo,t.GetAppArgs()[1],small,newlbl));
         }
         else if (f.GetKind() == DeclKind.And)
         {
             res = ctx.MkApp(f,t.GetAppArgs().Select(x => ExtractSmallerVCsRec(memo, x, small)).ToArray());
         }
         else
             res = t;
     }
     else
         res = t;
     done:
     memo.Add(t, res);
     return res;
 }
Пример #16
0
 private void ExtractSmallerVCs(Term t, List<Term> small)
 {
     TermDict< Term> memo = new TermDict< Term>();
     Term top = ExtractSmallerVCsRec(memo, t, small);
     small.Add(top);
 }
Пример #17
0
 private Term CollectGoalsRec(TermDict< Term> memo, Term t, List<Term> goals, List<Term> cruft)
 {
     Term res;
     if (memo.TryGetValue(t, out res))
         return res;
     var kind = t.GetKind();
     if (kind == TermKind.App)
     {
         var f = t.GetAppDecl();
         if (f.GetKind() == DeclKind.Implies)
         {
             CollectGoalsRec(memo, t.GetAppArgs()[1], goals, cruft);
             goto done;
         }
         else if (f.GetKind() == DeclKind.And)
         {
             foreach (var arg in t.GetAppArgs())
             {
                 CollectGoalsRec(memo, arg, goals, cruft);
             }
             goto done;
         }
         else if (f.GetKind() == DeclKind.Label)
         {
             var arg = t.GetAppArgs()[0];
             var r = arg.GetAppDecl();
             if (r.GetKind() == DeclKind.Uninterpreted)
             {
                 if (memo.TryGetValue(arg, out res))
                     goto done;
                 if (!annotationInfo.ContainsKey(r.GetDeclName()) && !arg.GetAppDecl().GetDeclName().StartsWith("_solve_"))
                     goto done;
                 goals.Add(arg);
                 memo.Add(arg, arg);
                 goto done;
             }
             else
                 return CollectGoalsRec(memo, arg, goals, cruft);
         }
         else if (f.GetKind() == DeclKind.Uninterpreted)
         {
             string name = f.GetDeclName();
             if (name.StartsWith("_solve_"))
             {
                 if (memo.TryGetValue(t, out res))
                     goto done;
                 goals.Add(t);
                 memo.Add(t, t);
                 return t;
             }
         }
     }
     // else the goal must be cruft
     cruft.Add(t);
     done:
     res = t; // just to return something
     memo.Add(t, res);
     return res;
 }
Пример #18
0
 private void CollectGoals(Term t, List<Term> goals, List<Term> cruft)
 {
     TermDict< Term> memo = new TermDict< Term>();
     CollectGoalsRec(memo, t.GetAppArgs()[1], goals, cruft);
 }
Пример #19
0
 private Term BindVariables(Term t, bool universal = true)
 {
     TermDict< bool> memo = new TermDict<bool>();
     List<Term> vars = new List<Term>();
     CollectVariables(memo,t,vars);
     return universal ? ctx.MkForall(vars.ToArray(), t) : ctx.MkExists(vars.ToArray(), t);
 }
Пример #20
0
 private Term CollectParamsRec(TermDict<Term> memo, Term t, List<FuncDecl> parms, List<RPFP.Node> nodes, Dictionary<Term, Term> done)
 {
     Term res;
     if (memo.TryGetValue(t, out res))
         return res;
     if (t.GetKind() == TermKind.App)
     {
         var f = t.GetAppDecl();
         Node node;
         if (relationToNode.TryGetValue(f, out node))
         {
             if (done.ContainsKey(t))
                 res = done[t];
             else
             {
                 f = SuffixFuncDecl(t, parms.Count);
                 parms.Add(f);
                 nodes.Add(node);
                 done.Add(t,res); // don't count same expression twice!
             }
         }
         var args = t.GetAppArgs();
         args = args.Select(x => CollectParamsRec(memo, x, parms, nodes, done)).ToArray();
         res = ctx.CloneApp(t, args);
     } // TODO: handle quantifiers
     else
         res = t;
     memo.Add(t, res);
     return res;
 }
Пример #21
0
        private Term SubstPreds(Dictionary <FuncDecl, FuncDecl> subst, Term t)
        {
            TermDict <Term> memo = new TermDict <Term>();

            return(SubstPredsRec(memo, subst, t));
        }
Пример #22
0
 private Term MergeGoals(Term t)
 {
     TermDict< Term> memo = new TermDict< Term>();
     return MergeGoalsRec(memo, t);
 }