/////////////////////////////////////////////////////////////////////////////////////

        public bool Visit(VCExprNAry node, LineariserOptions options)
        {
            //Contract.Requires(options != null);
            //Contract.Requires(node != null);
            VCExprOp op = node.Op;

            Contract.Assert(op != null);

            if (!options.AsTerm &&
                (op.Equals(VCExpressionGenerator.AndOp) ||
                 op.Equals(VCExpressionGenerator.OrOp)))
            {
                // handle these operators without recursion

                wr.Write("({0}",
                         op.Equals(VCExpressionGenerator.AndOp) ? andName : orName);
                IEnumerator enumerator = new VCExprNAryUniformOpEnumerator(node);
                Contract.Assert(enumerator != null);
                while (enumerator.MoveNext())
                {
                    VCExprNAry naryExpr = enumerator.Current as VCExprNAry;
                    if (naryExpr == null || !naryExpr.Op.Equals(op))
                    {
                        wr.Write(" ");
                        Linearise(cce.NonNull((VCExpr)enumerator.Current), options);
                    }
                }

                wr.Write(")");

                return(true);
            }

            return(node.Accept <bool, LineariserOptions>(OpLineariser, options));
        }
Exemple #2
0
        public Term Visit(VCExprNAry node, LineariserOptions options)
        {
            Contract.Requires(options != null);
            Contract.Requires(node != null);
            VCExprOp op = node.Op;

            Contract.Assert(op != null);

            if (op.Equals(VCExpressionGenerator.AndOp) || op.Equals(VCExpressionGenerator.OrOp))
            {
                // handle these operators without recursion
                List <Term> asts     = new List <Term>();
                string      opString = op.Equals(VCExpressionGenerator.AndOp) ? "AND" : "OR";

                IEnumerator enumerator = new VCExprNAryUniformOpEnumerator(node);
                Contract.Assert(enumerator != null);
                while (enumerator.MoveNext())
                {
                    VCExprNAry naryExpr = enumerator.Current as VCExprNAry;
                    if (naryExpr == null || !naryExpr.Op.Equals(op))
                    {
                        asts.Add(Linearise(cce.NonNull((VCExpr)enumerator.Current), options));
                    }
                }

                return(Make(op, asts));
            }

            return(node.Accept <Term, LineariserOptions>(OpLineariser, options));
        }
Exemple #3
0
        public VCExpr /*!*/ Function(VCExprOp /*!*/ op,
                                     List <VCExpr /*!*/> /*!*/ arguments,
                                     List <Type /*!*/> /*!*/ typeArguments)
        {
            Contract.Requires(op != null);
            Contract.Requires(cce.NonNullElements(arguments));
            Contract.Requires(cce.NonNullElements(typeArguments));
            if (typeArguments.Count > 0)
            {
                return(new VCExprMultiAry(op, arguments, typeArguments));
            }

            switch (arguments.Count)
            {
            case 0:
                return(new VCExprNullary(op));

            case 1:
                return(new VCExprUnary(op, arguments));

            case 2:
                return(new VCExprBinary(op, arguments));

            default:
                return(new VCExprMultiAry(op, arguments));
            }
        }
Exemple #4
0
        public bool Visit(VCExprNAry node, TextWriter wr)
        {
            //Contract.Requires(wr != null);
            //Contract.Requires(node != null);
            VCExprOp /*!*/ op = node.Op;

            Contract.Assert(op != null);

            if (op.Equals(VCExpressionGenerator.AndOp) ||
                op.Equals(VCExpressionGenerator.OrOp))
            {
                // handle these operators without recursion

                wr.Write("({0}",
                         op.Equals(VCExpressionGenerator.AndOp) ? "And" : "Or");
                IEnumerator /*!*/ enumerator = new VCExprNAryUniformOpEnumerator(node);
                Contract.Assert(enumerator != null);
                while (enumerator.MoveNext())
                {
                    VCExprNAry naryExpr = enumerator.Current as VCExprNAry;
                    if (naryExpr == null || !naryExpr.Op.Equals(op))
                    {
                        wr.Write(" ");
                        Print(cce.NonNull((VCExpr /*!*/)enumerator.Current), wr);
                    }
                }

                wr.Write(")");

                return(true);
            }

            return(node.Accept <bool, TextWriter /*!*/>(OpPrinter, wr));
        }
Exemple #5
0
        /////////////////////////////////////////////////////////////////////////////////////

        public bool Visit(VCExprNAry node, LineariserOptions options)
        {
            //Contract.Requires(node != null);
            //Contract.Requires(options != null);

            VCExprOp op = node.Op;

            Contract.Assert(op != null);

            if (op.Equals(VCExpressionGenerator.AndOp) ||
                op.Equals(VCExpressionGenerator.OrOp))
            {
                // handle these operators without recursion

                wr.Write("({0}",
                         op.Equals(VCExpressionGenerator.AndOp) ? "and" : "or");
                foreach (var ch in node.UniformArguments)
                {
                    wr.Write("\n");
                    Linearise(ch, options);
                }
                wr.Write(")");

                return(true);
            }

            return(node.Accept <bool, LineariserOptions /*!*/>(OpLineariser, options));
        }
        ///////////////////////////////////////////////////////////////////////////

        public override VCExpr VisitBoogieFunctionOp(VCExprNAry node, VariableBindings bindings)
        {
            Contract.Requires((bindings != null));
            Contract.Requires((node != null));
            Contract.Ensures(Contract.Result <VCExpr>() != null);
            OpTypesPair originalOpTypes = OriginalOpTypes(node);
            OpTypesPair newOpTypes;

            if (!NewOpCache.TryGetValue(originalOpTypes, out newOpTypes))
            {
                Function /*!*/
                    oriFun = ((VCExprBoogieFunctionOp)node.Op).Func;
                Contract.Assert(oriFun != null);
                List <Type /*!*/> /*!*/
                inferredTypeArgs = new List <Type /*!*/>();
                foreach (Type /*!*/ t in node.TypeArguments)
                {
                    Contract.Assert(t != null);
//          inferredTypeArgs.Add(AxBuilder.MapTypeAbstracter.AbstractMapTypeRecursively(t));
                    inferredTypeArgs.Add(t);
                }

                VCExprOp /*!*/
                    newOp = Gen.BoogieFunctionOp(AxBuilderArguments.Typed2Untyped(oriFun));
                newOpTypes = new OpTypesPair(newOp, inferredTypeArgs);

                NewOpCache.Add(originalOpTypes, newOpTypes);
            }

            return(AssembleOpExpression(newOpTypes, node, bindings));
        }
 public OpTypesPair(VCExprOp op, List <Type /*!*/> /*!*/ types)
 {
     Contract.Requires(op != null);
     Contract.Requires(cce.NonNullElements(types));
     this.Op       = op;
     this.Types    = types;
     this.HashCode = HFNS.PolyHash(op.GetHashCode(), 17, types);
 }
Exemple #8
0
        public VCExpr /*!*/ Function(VCExprOp /*!*/ op, List <VCExpr /*!*/> /*!*/ arguments)
        {
            Contract.Requires(op != null);
            Contract.Requires(cce.NonNullElements(arguments));
            Contract.Ensures(Contract.Result <VCExpr>() != null);

            return(Function(op, arguments, VCExprNAry.EMPTY_TYPE_LIST));
        }
Exemple #9
0
        // The following method should really be called "ReduceLeft". It must
        // only be used for the binary operators "and" and "or"
        public VCExpr /*!*/ NAry(VCExprOp /*!*/ op, List <VCExpr /*!*/> /*!*/ args)
        {
            Contract.Requires(op != null);
            Contract.Requires(cce.NonNullElements(args));
            Contract.Ensures(Contract.Result <VCExpr>() != null);

            return(NAry(op, args.ToArray()));
        }
Exemple #10
0
        /////////////////////////////////////////////////////////////////////////////////////

        public bool Visit(VCExprNAry node, LineariserOptions options)
        {
            VCExprOp op = node.Op;

            Contract.Assert(op != null);

            var booleanOps = new HashSet <VCExprOp>();

            booleanOps.Add(VCExpressionGenerator.NotOp);
            booleanOps.Add(VCExpressionGenerator.ImpliesOp);
            booleanOps.Add(VCExpressionGenerator.AndOp);
            booleanOps.Add(VCExpressionGenerator.OrOp);
            if (booleanOps.Contains(op))
            {
                Stack <VCExpr> exprs = new Stack <VCExpr>();
                exprs.Push(node);
                while (exprs.Count > 0)
                {
                    VCExpr expr = exprs.Pop();
                    if (expr == null)
                    {
                        wr.Write(")");
                        continue;
                    }
                    wr.Write(" ");
                    VCExprNAry naryExpr = expr as VCExprNAry;
                    if (naryExpr == null || !booleanOps.Contains(naryExpr.Op))
                    {
                        Linearise(expr, options);
                        continue;
                    }
                    else if (naryExpr.Op.Equals(VCExpressionGenerator.NotOp))
                    {
                        wr.Write("(not");
                    }
                    else if (naryExpr.Op.Equals(VCExpressionGenerator.ImpliesOp))
                    {
                        wr.Write("(=>");
                    }
                    else if (naryExpr.Op.Equals(VCExpressionGenerator.AndOp))
                    {
                        wr.Write("(and");
                    }
                    else
                    {
                        System.Diagnostics.Debug.Assert(naryExpr.Op.Equals(VCExpressionGenerator.OrOp));
                        wr.Write("(or");
                    }
                    exprs.Push(null);
                    for (int i = naryExpr.Arity - 1; i >= 0; i--)
                    {
                        exprs.Push(naryExpr[i]);
                    }
                }
                return(true);
            }
            return(node.Accept <bool, LineariserOptions /*!*/>(OpLineariser, options));
        }
Exemple #11
0
        public VCExpr /*!*/ Function(VCExprOp /*!*/ op, params VCExpr[] /*!*/ arguments)
        {
            Contract.Requires(op != null);
            Contract.Requires(cce.NonNullElements(arguments));

            return(Function(op,
                            HelperFuns.ToNonNullList(arguments),
                            VCExprNAry.EMPTY_TYPE_LIST));
        }
Exemple #12
0
 public TermClustersSameHead(VCExprOp op, IDictionary <VCExprVar /*!*/, VCExprVar /*!*/> /*!*/ globalVars, VCExpressionGenerator /*!*/ gen)
 {
     Contract.Requires(cce.NonNullDictionaryAndValues(globalVars));
     Contract.Requires(gen != null);
     Contract.Requires(op != null);
     Op = op;
     GlobalVariables = globalVars;
     Gen             = gen;
 }
Exemple #13
0
        public VCExpr /*!*/ Add(VCExpr /*!*/ e0, VCExpr /*!*/ e1)
        {
            Contract.Requires(e0 != null);
            Contract.Requires(e1 != null);
            Contract.Ensures(Contract.Result <VCExpr>() != null);

            VCExprOp op = cce.NonNull(cce.NonNull(e0).Type).IsInt ? AddIOp : AddROp;

            return(Function(op, e0, e1));
        }
Exemple #14
0
        public VCExpr /*!*/ Function(VCExprOp /*!*/ op, VCExpr[] /*!*/ arguments, Type[] /*!*/ typeArguments)
        {
            Contract.Requires(op != null);
            Contract.Requires(cce.NonNullElements(arguments));
            Contract.Requires(cce.NonNullElements(typeArguments));
            Contract.Ensures(Contract.Result <VCExpr>() != null);


            return(Function(op,
                            HelperFuns.ToNonNullList(arguments),
                            HelperFuns.ToNonNullList(typeArguments)));
        }
Exemple #15
0
            ///////////////////////////////////////////////////////////////////////////////////

            private Term WriteApplication(VCExprOp op, IEnumerable <VCExpr> terms, LineariserOptions options)
            {
                Contract.Requires(options != null);
                Contract.Requires(op != null);
                Contract.Requires(cce.NonNullElements(terms));

                List <Term> args = new List <Term>();

                foreach (VCExpr e in terms)
                {
                    Contract.Assert(e != null);
                    args.Add(ExprLineariser.Linearise(e, options));
                }
                return(ExprLineariser.Make(op, args));
            }
Exemple #16
0
        public VCExpr /*!*/ NAry(VCExprOp /*!*/ op, params VCExpr[] /*!*/ args)
        {
            Contract.Requires(op != null);
            Contract.Requires(cce.NonNullElements(args));
            Contract.Requires(op == AndOp || op == OrOp);
            Contract.Ensures(Contract.Result <VCExpr>() != null);

            bool and = (op == AndOp);

            VCExpr /*!*/
                e = and ? True : False;

            foreach (VCExpr a in args)
            {
                e = and ? AndSimp(e, cce.NonNull(a)) : OrSimp(e, cce.NonNull(a));
            }

            return(e);
        }
        /////////////////////////////////////////////////////////////////////////////////////

        public bool Visit(VCExprNAry node, LineariserOptions options)
        {
            VCExprOp op = node.Op;

            Contract.Assert(op != null);

            var booleanOps = new HashSet <VCExprOp>();

            booleanOps.Add(VCExpressionGenerator.NotOp);
            booleanOps.Add(VCExpressionGenerator.ImpliesOp);
            booleanOps.Add(VCExpressionGenerator.AndOp);
            booleanOps.Add(VCExpressionGenerator.OrOp);
            if (booleanOps.Contains(op))
            {
                Stack <VCExpr> exprs = new Stack <VCExpr>();
                exprs.Push(node);
                while (exprs.Count > 0)
                {
                    VCExpr expr = exprs.Pop();
                    if (expr == null)
                    {
                        wr.Write(")");
                        continue;
                    }
                    wr.Write(" ");
                    VCExprNAry naryExpr = expr as VCExprNAry;
                    if (naryExpr == null || !booleanOps.Contains(naryExpr.Op))
                    {
                        Linearise(expr, options);
                        continue;
                    }
                    else if (naryExpr.Op.Equals(VCExpressionGenerator.NotOp))
                    {
                        wr.Write("(not");
                    }
                    else if (naryExpr.Op.Equals(VCExpressionGenerator.ImpliesOp))
                    {
                        wr.Write("(=>");
                    }
                    else if (naryExpr.Op.Equals(VCExpressionGenerator.AndOp))
                    {
                        wr.Write("(and");
                    }
                    else
                    {
                        System.Diagnostics.Debug.Assert(naryExpr.Op.Equals(VCExpressionGenerator.OrOp));
                        wr.Write("(or");
                    }
                    exprs.Push(null);
                    for (int i = naryExpr.Arity - 1; i >= 0; i--)
                    {
                        exprs.Push(naryExpr[i]);
                    }
                }
                return(true);
            }
            if (OptimizationRequests != null &&
                (node.Op.Equals(VCExpressionGenerator.MinimizeOp) || node.Op.Equals(VCExpressionGenerator.MaximizeOp)))
            {
                string optOp = node.Op.Equals(VCExpressionGenerator.MinimizeOp) ? "minimize" : "maximize";
                OptimizationRequests.Add(string.Format("({0} {1})", optOp, ToString(node[0], Namer, ProverOptions, NamedAssumes)));
                Linearise(node[1], options);
                return(true);
            }
            if (node.Op is VCExprSoftOp)
            {
                Linearise(node[1], options);
                return(true);
            }
            if (node.Op.Equals(VCExpressionGenerator.NamedAssumeOp))
            {
                var exprVar = node[0] as VCExprVar;
                NamedAssumes.Add(exprVar);
                Linearise(node[1], options);
                return(true);
            }
            return(node.Accept <bool, LineariserOptions /*!*/>(OpLineariser, options));
        }
Exemple #18
0
		private BinaryOperator.Opcode VCOpToOp (VCExprOp op)
		{
			if (op == VCExpressionGenerator.AddIOp)
				return BinaryOperator.Opcode.Add;
			if (op == VCExpressionGenerator.SubIOp)
				return BinaryOperator.Opcode.Sub;
			if (op == VCExpressionGenerator.MulIOp)
				return BinaryOperator.Opcode.Mul;
			if (op == VCExpressionGenerator.DivIOp)
				return BinaryOperator.Opcode.Div;
			if (op == VCExpressionGenerator.EqOp)
				return BinaryOperator.Opcode.Eq;
			if (op == VCExpressionGenerator.LeOp)
				return BinaryOperator.Opcode.Le;
			if (op == VCExpressionGenerator.LtOp)
				return BinaryOperator.Opcode.Lt;
			if (op == VCExpressionGenerator.GeOp)
				return BinaryOperator.Opcode.Ge;
			if (op == VCExpressionGenerator.GtOp)
				return BinaryOperator.Opcode.Gt;
			if (op == VCExpressionGenerator.AndOp)
				return BinaryOperator.Opcode.And;
			if (op == VCExpressionGenerator.OrOp)
				return BinaryOperator.Opcode.Or;
			throw new InternalError();
		}
Exemple #19
0
        /////////////////////////////////////////////////////////////////////////////////////

        public Term Make(VCExprOp op, List <Term> children)
        {
            Context z3 = cm.z3;

            Term[] unwrapChildren = children.ToArray();
            VCExprBoogieFunctionOp boogieFunctionOp = op as VCExprBoogieFunctionOp;

            if (boogieFunctionOp != null)
            {
                FuncDecl f = cm.GetFunction(boogieFunctionOp.Func.Name);
                return(z3.MkApp(f, unwrapChildren));
            }
            VCExprDistinctOp distinctOp = op as VCExprDistinctOp;

            if (distinctOp != null)
            {
                return(z3.MkDistinct(unwrapChildren));
            }

            if (op == VCExpressionGenerator.AndOp)
            {
                return(z3.MkAnd(unwrapChildren));
            }

            if (op == VCExpressionGenerator.OrOp)
            {
                return(z3.MkOr(unwrapChildren));
            }

            if (op == VCExpressionGenerator.ImpliesOp)
            {
                return(z3.MkImplies(unwrapChildren[0], unwrapChildren[1]));
            }

            if (op == VCExpressionGenerator.NotOp)
            {
                return(z3.MkNot(unwrapChildren[0]));
            }

            if (op == VCExpressionGenerator.EqOp)
            {
                return(z3.MkEq(unwrapChildren[0], unwrapChildren[1]));
            }

            if (op == VCExpressionGenerator.NeqOp)
            {
                return(z3.MkNot(z3.MkEq(unwrapChildren[0], unwrapChildren[1])));
            }

            if (op == VCExpressionGenerator.LtOp)
            {
                return(z3.MkLt(unwrapChildren[0], unwrapChildren[1]));
            }

            if (op == VCExpressionGenerator.LeOp)
            {
                return(z3.MkLe(unwrapChildren[0], unwrapChildren[1]));
            }

            if (op == VCExpressionGenerator.GtOp)
            {
                return(z3.MkGt(unwrapChildren[0], unwrapChildren[1]));
            }

            if (op == VCExpressionGenerator.GeOp)
            {
                return(z3.MkGe(unwrapChildren[0], unwrapChildren[1]));
            }

            if (op == VCExpressionGenerator.AddOp)
            {
                return(z3.MkAdd(unwrapChildren));
            }

            if (op == VCExpressionGenerator.SubOp)
            {
                return(z3.MkSub(unwrapChildren));
            }

            if (op == VCExpressionGenerator.DivOp || op == VCExpressionGenerator.RealDivOp)
            {
                return(z3.MkDiv(unwrapChildren[0], unwrapChildren[1]));
            }

            if (op == VCExpressionGenerator.MulOp)
            {
                return(z3.MkMul(unwrapChildren));
            }

            if (op == VCExpressionGenerator.ModOp)
            {
                return(z3.MkMod(unwrapChildren[0], unwrapChildren[1]));
            }

            if (op == VCExpressionGenerator.IfThenElseOp)
            {
                return(z3.MkIte(unwrapChildren[0], unwrapChildren[1], unwrapChildren[2]));
            }

            if (op == VCExpressionGenerator.ToIntOp)
            {
                return(z3.MkToInt(unwrapChildren[0]));
            }

            if (op == VCExpressionGenerator.ToRealOp)
            {
                return(z3.MkToReal(unwrapChildren[0]));
            }

            throw new Exception("unhandled boogie operator");
        }
 public OpTypesPair(VCExprOp op, List<Type/*!*/>/*!*/ types) {
   Contract.Requires(op != null);
   Contract.Requires(cce.NonNullElements(types));
   this.Op = op;
   this.Types = types;
   this.HashCode = HFNS.PolyHash(op.GetHashCode(), 17, types);
 }
Exemple #21
0
 private VCExpr MakeBinary(VCExprOp op, VCExpr [] args)
 {
     if (args.Count() == 0)
     {
         // with zero args we need the identity of the op
         if (op == VCExpressionGenerator.AndOp)
             return VCExpressionGenerator.True;
         if (op == VCExpressionGenerator.OrOp)
             return VCExpressionGenerator.False;
         if (op == VCExpressionGenerator.AddIOp)
         {
             Microsoft.Basetypes.BigNum x = Microsoft.Basetypes.BigNum.ZERO;
             return gen.Integer(x);
         }
         HandleProverError("Prover error: bad expression ");
         throw new BadExprFromProver();
     }
     var temp = args[0];
     for (int i = 1; i < args.Count(); i++)
         temp = gen.Function(op, temp, args[i]);
     return temp;
 }