void PredicateCmd(Expr p, Expr pDom, List <Cmd> cmdSeq, Cmd cmd)
        {
            if (cmd is CallCmd)
            {
                var cCmd = (CallCmd)cmd;
                Debug.Assert(useProcedurePredicates(cCmd.Proc));
                cCmd.Ins.Insert(0, p != null ? p : Expr.True);
                cmdSeq.Add(cCmd);
            }
            else if (p == null)
            {
                new EnabledReplacementVisitor(Expr.True, pDom).Visit(cmd);
                cmdSeq.Add(cmd);
            }
            else if (cmd is AssignCmd)
            {
                var aCmd = (AssignCmd)cmd;
                cmdSeq.Add(new AssignCmd(Token.NoToken, aCmd.Lhss,
                                         new List <Expr>(aCmd.Lhss.Zip(aCmd.Rhss, (lhs, rhs) =>
                                                                       new NAryExpr(Token.NoToken,
                                                                                    new IfThenElse(Token.NoToken),
                                                                                    new List <Expr> {
                    p, rhs, lhs.AsExpr
                })))));
            }
            else if (cmd is AssertCmd)
            {
                var  aCmd    = (AssertCmd)cmd;
                Expr newExpr = new EnabledReplacementVisitor(p, pDom).VisitExpr(aCmd.Expr);
                aCmd.Expr = QKeyValue.FindBoolAttribute(aCmd.Attributes, "do_not_predicate") ? newExpr : Expr.Imp(p, newExpr);
                cmdSeq.Add(aCmd);
            }
            else if (cmd is AssumeCmd)
            {
                var  aCmd    = (AssumeCmd)cmd;
                Expr newExpr = new EnabledReplacementVisitor(p, pDom).VisitExpr(aCmd.Expr);
                aCmd.Expr = QKeyValue.FindBoolAttribute(aCmd.Attributes, "do_not_predicate") ? newExpr : Expr.Imp(p, newExpr);
                cmdSeq.Add(aCmd);
            }
            else if (cmd is HavocCmd)
            {
                var hCmd = (HavocCmd)cmd;
                foreach (IdentifierExpr v in hCmd.Vars)
                {
                    Microsoft.Boogie.Type type = v.Decl.TypedIdent.Type;
                    Contract.Assert(type != null);

                    IdentifierExpr havocTempExpr;
                    if (havocVars.ContainsKey(type))
                    {
                        havocTempExpr = havocVars[type];
                    }
                    else
                    {
                        var havocVar = new LocalVariable(Token.NoToken,
                                                         new TypedIdent(Token.NoToken,
                                                                        "_HAVOC_" + type.ToString(), type));
                        impl.LocVars.Add(havocVar);
                        havocVars[type] = havocTempExpr =
                            new IdentifierExpr(Token.NoToken, havocVar);
                    }
                    cmdSeq.Add(new HavocCmd(Token.NoToken,
                                            new List <IdentifierExpr> {
                        havocTempExpr
                    }));
                    cmdSeq.Add(Cmd.SimpleAssign(Token.NoToken, v,
                                                new NAryExpr(Token.NoToken,
                                                             new IfThenElse(Token.NoToken),
                                                             new List <Expr> {
                        p, havocTempExpr, v
                    })));
                }
            }
            else if (cmd is CommentCmd)
            {
                // skip
            }
            else if (cmd is StateCmd)
            {
                var sCmd      = (StateCmd)cmd;
                var newCmdSeq = new List <Cmd>();
                foreach (Cmd c in sCmd.Cmds)
                {
                    PredicateCmd(p, pDom, newCmdSeq, c);
                }
                sCmd.Cmds = newCmdSeq;
                cmdSeq.Add(sCmd);
            }
            else
            {
                Console.WriteLine("Unsupported cmd: " + cmd.GetType().ToString());
            }
        }
Пример #2
0
        void PredicateCmd(List<Cmd> cmdSeq, Cmd cmd)
        {
            if (cmd is AssignCmd) {
              var aCmd = (AssignCmd)cmd;
              cmdSeq.Add(new AssignCmd(Token.NoToken, aCmd.Lhss,
                   new List<Expr>(aCmd.Lhss.Zip(aCmd.Rhss, (lhs, rhs) =>
                     new NAryExpr(Token.NoToken,
                       new IfThenElse(Token.NoToken),
                       new List<Expr> { p, rhs, lhs.AsExpr })))));
            } else if (cmd is AssertCmd) {
              var aCmd = (AssertCmd)cmd;
              if (cmdSeq.Last() is AssignCmd &&
              cmdSeq.Cast<Cmd>().SkipEnd(1).All(c => c is AssertCmd)) {
            // This may be a loop invariant.  Make sure it continues to appear as
            // the first statement in the block.
            var assign = cmdSeq.Last();
            cmdSeq.RemoveAt(cmdSeq.Count-1);
            Expr newExpr = new EnabledReplacementVisitor(pExpr).VisitExpr(aCmd.Expr);
            aCmd.Expr = QKeyValue.FindBoolAttribute(aCmd.Attributes, "do_not_predicate") ? newExpr : Expr.Imp(pExpr, newExpr);
            cmdSeq.Add(aCmd);
            // cmdSeq.Add(new AssertCmd(aCmd.tok, Expr.Imp(pExpr, aCmd.Expr)));
            cmdSeq.Add(assign);
              } else {
            aCmd.Expr = Expr.Imp(p, aCmd.Expr);
            cmdSeq.Add(aCmd);
            // cmdSeq.Add(new AssertCmd(aCmd.tok, Expr.Imp(p, aCmd.Expr)));
              }
            } else if (cmd is AssumeCmd) {
              var aCmd = (AssumeCmd)cmd;
              cmdSeq.Add(new AssumeCmd(Token.NoToken, Expr.Imp(p, aCmd.Expr)));
            } else if (cmd is HavocCmd) {
              var hCmd = (HavocCmd)cmd;
              foreach (IdentifierExpr v in hCmd.Vars) {
            Microsoft.Boogie.Type type = v.Decl.TypedIdent.Type;
            Contract.Assert(type != null);

            IdentifierExpr havocTempExpr;
            if (havocVars.ContainsKey(type)) {
              havocTempExpr = havocVars[type];
            } else {
              var havocVar = new LocalVariable(Token.NoToken,
                             new TypedIdent(Token.NoToken,
                                            "_HAVOC_" + type.ToString(), type));
              impl.LocVars.Add(havocVar);
              havocVars[type] = havocTempExpr =
            new IdentifierExpr(Token.NoToken, havocVar);
            }
            cmdSeq.Add(new HavocCmd(Token.NoToken,
                                new List<IdentifierExpr> { havocTempExpr }));
            cmdSeq.Add(Cmd.SimpleAssign(Token.NoToken, v,
                                    new NAryExpr(Token.NoToken,
                                      new IfThenElse(Token.NoToken),
                                      new List<Expr> { p, havocTempExpr, v })));
              }
            } else if (cmd is CallCmd) {
              Debug.Assert(useProcedurePredicates);
              var cCmd = (CallCmd)cmd;
              cCmd.Ins.Insert(0, p);
              cmdSeq.Add(cCmd);
            }
            else if (cmd is CommentCmd) {
              // skip
            }
            else if (cmd is StateCmd) {
              var sCmd = (StateCmd)cmd;
              var newCmdSeq = new List<Cmd>();
              foreach (Cmd c in sCmd.Cmds)
            PredicateCmd(newCmdSeq, c);
              sCmd.Cmds = newCmdSeq;
              cmdSeq.Add(sCmd);
            }
            else {
              Console.WriteLine("Unsupported cmd: " + cmd.GetType().ToString());
            }
        }
Пример #3
0
  void PredicateCmd(Expr p, Expr pDom, List<Cmd> cmdSeq, Cmd cmd) {
    if (cmd is CallCmd) {
      var cCmd = (CallCmd)cmd;
      Debug.Assert(useProcedurePredicates(cCmd.Proc));
      cCmd.Ins.Insert(0, p != null ? p : Expr.True);
      cmdSeq.Add(cCmd);
    } else if (p == null) {
      new EnabledReplacementVisitor(Expr.True, pDom).Visit(cmd);
      cmdSeq.Add(cmd);
    } else if (cmd is AssignCmd) {
      var aCmd = (AssignCmd)cmd;
      cmdSeq.Add(new AssignCmd(Token.NoToken, aCmd.Lhss,
                   new List<Expr>(aCmd.Lhss.Zip(aCmd.Rhss, (lhs, rhs) =>
                     new NAryExpr(Token.NoToken,
                       new IfThenElse(Token.NoToken),
                       new List<Expr> { p, rhs, lhs.AsExpr })))));
    } else if (cmd is AssertCmd) {
      var aCmd = (AssertCmd)cmd;
      Expr newExpr = new EnabledReplacementVisitor(p, pDom).VisitExpr(aCmd.Expr);
      aCmd.Expr = QKeyValue.FindBoolAttribute(aCmd.Attributes, "do_not_predicate") ? newExpr : Expr.Imp(p, newExpr);
      cmdSeq.Add(aCmd);
    } else if (cmd is AssumeCmd) {
      var aCmd = (AssumeCmd)cmd;
      Expr newExpr = new EnabledReplacementVisitor(p, pDom).VisitExpr(aCmd.Expr);
      aCmd.Expr = QKeyValue.FindBoolAttribute(aCmd.Attributes, "do_not_predicate") ? newExpr : Expr.Imp(p, newExpr);
      cmdSeq.Add(aCmd);
    } else if (cmd is HavocCmd) {
      var hCmd = (HavocCmd)cmd;
      foreach (IdentifierExpr v in hCmd.Vars) {
        Microsoft.Boogie.Type type = v.Decl.TypedIdent.Type;
        Contract.Assert(type != null);

        IdentifierExpr havocTempExpr;
        if (havocVars.ContainsKey(type)) {
          havocTempExpr = havocVars[type];
        } else {
          var havocVar = new LocalVariable(Token.NoToken,
                             new TypedIdent(Token.NoToken,
                                            "_HAVOC_" + type.ToString(), type));
          impl.LocVars.Add(havocVar);
          havocVars[type] = havocTempExpr =
            new IdentifierExpr(Token.NoToken, havocVar);
        }
        cmdSeq.Add(new HavocCmd(Token.NoToken,
                                new List<IdentifierExpr> { havocTempExpr }));
        cmdSeq.Add(Cmd.SimpleAssign(Token.NoToken, v,
                                    new NAryExpr(Token.NoToken,
                                      new IfThenElse(Token.NoToken),
                                      new List<Expr> { p, havocTempExpr, v })));
      }
    } else if (cmd is CommentCmd) {
      // skip
    } else if (cmd is StateCmd) {
      var sCmd = (StateCmd)cmd;
      var newCmdSeq = new List<Cmd>();
      foreach (Cmd c in sCmd.Cmds)
        PredicateCmd(p, pDom, newCmdSeq, c);
      sCmd.Cmds = newCmdSeq;
      cmdSeq.Add(sCmd);
    } else {
      Console.WriteLine("Unsupported cmd: " + cmd.GetType().ToString());
    }
  }
Пример #4
0
        void PredicateCmd(List <Cmd> cmdSeq, Cmd cmd)
        {
            if (cmd is AssignCmd)
            {
                var aCmd = (AssignCmd)cmd;
                cmdSeq.Add(new AssignCmd(Token.NoToken, aCmd.Lhss,
                                         new List <Expr>(aCmd.Lhss.Zip(aCmd.Rhss, (lhs, rhs) =>
                                                                       new NAryExpr(Token.NoToken,
                                                                                    new IfThenElse(Token.NoToken),
                                                                                    new List <Expr> {
                    p, rhs, lhs.AsExpr
                })))));
            }
            else if (cmd is AssertCmd)
            {
                var aCmd = (AssertCmd)cmd;
                if (cmdSeq.Last() is AssignCmd &&
                    cmdSeq.Cast <Cmd>().SkipEnd(1).All(c => c is AssertCmd))
                {
                    // This may be a loop invariant.  Make sure it continues to appear as
                    // the first statement in the block.
                    var assign = cmdSeq.Last();
                    cmdSeq.RemoveAt(cmdSeq.Count - 1);
                    Expr newExpr = new EnabledReplacementVisitor(pExpr, null).VisitExpr(aCmd.Expr);
                    aCmd.Expr = QKeyValue.FindBoolAttribute(aCmd.Attributes, "do_not_predicate") ? newExpr : Expr.Imp(pExpr, newExpr);
                    cmdSeq.Add(aCmd);
                    // cmdSeq.Add(new AssertCmd(aCmd.tok, Expr.Imp(pExpr, aCmd.Expr)));
                    cmdSeq.Add(assign);
                }
                else
                {
                    aCmd.Expr = Expr.Imp(p, aCmd.Expr);
                    cmdSeq.Add(aCmd);
                    // cmdSeq.Add(new AssertCmd(aCmd.tok, Expr.Imp(p, aCmd.Expr)));
                }
            }
            else if (cmd is AssumeCmd)
            {
                var aCmd = (AssumeCmd)cmd;
                cmdSeq.Add(new AssumeCmd(Token.NoToken, Expr.Imp(p, aCmd.Expr)));
            }
            else if (cmd is HavocCmd)
            {
                var hCmd = (HavocCmd)cmd;
                foreach (IdentifierExpr v in hCmd.Vars)
                {
                    Microsoft.Boogie.Type type = v.Decl.TypedIdent.Type;
                    Contract.Assert(type != null);

                    IdentifierExpr havocTempExpr;
                    if (havocVars.ContainsKey(type))
                    {
                        havocTempExpr = havocVars[type];
                    }
                    else
                    {
                        var havocVar = new LocalVariable(Token.NoToken,
                                                         new TypedIdent(Token.NoToken,
                                                                        "_HAVOC_" + type.ToString(), type));
                        impl.LocVars.Add(havocVar);
                        havocVars[type] = havocTempExpr =
                            new IdentifierExpr(Token.NoToken, havocVar);
                    }
                    cmdSeq.Add(new HavocCmd(Token.NoToken,
                                            new List <IdentifierExpr> {
                        havocTempExpr
                    }));
                    cmdSeq.Add(Cmd.SimpleAssign(Token.NoToken, v,
                                                new NAryExpr(Token.NoToken,
                                                             new IfThenElse(Token.NoToken),
                                                             new List <Expr> {
                        p, havocTempExpr, v
                    })));
                }
            }
            else if (cmd is CallCmd)
            {
                Debug.Assert(useProcedurePredicates);
                var cCmd = (CallCmd)cmd;
                cCmd.Ins.Insert(0, p);
                cmdSeq.Add(cCmd);
            }
            else if (cmd is CommentCmd)
            {
                // skip
            }
            else if (cmd is StateCmd)
            {
                var sCmd      = (StateCmd)cmd;
                var newCmdSeq = new List <Cmd>();
                foreach (Cmd c in sCmd.Cmds)
                {
                    PredicateCmd(newCmdSeq, c);
                }
                sCmd.Cmds = newCmdSeq;
                cmdSeq.Add(sCmd);
            }
            else
            {
                Console.WriteLine("Unsupported cmd: " + cmd.GetType().ToString());
            }
        }