Пример #1
0
 public VCExpr Exists(List <TypeVariable /*!*/> /*!*/ typeParams, List <VCExprVar /*!*/> /*!*/ vars,
                      List <VCTrigger /*!*/> /*!*/ triggers, VCQuantifierInfo info, VCExpr body)
 {
     Contract.Requires(body != null);
     Contract.Requires(info != null);
     Contract.Requires(cce.NonNullElements(triggers));
     Contract.Requires(cce.NonNullElements(vars));
     Contract.Requires(cce.NonNullElements(typeParams));
     Contract.Ensures(Contract.Result <VCExpr>() != null);
     return(Quantify(Quantifier.EX, typeParams, vars, triggers, info, body));
 }
Пример #2
0
        /////////////////////////////////////////////////////////////////////////////////////

        public bool Visit(VCExprQuantifier node, LineariserOptions options)
        {
            Contract.Assert(node.TypeParameters.Count == 0);

            UnderQuantifier++;
            Namer.PushScope();
            try
            {
                string kind = node.Quan == Quantifier.ALL ? "forall" : "exists";
                wr.Write("({0} (", kind);

                for (int i = 0; i < node.BoundVars.Count; i++)
                {
                    VCExprVar var = node.BoundVars[i];
                    Contract.Assert(var != null);
                    string printedName = Namer.GetQuotedLocalName(var, var.Name);
                    Contract.Assert(printedName != null);
                    wr.Write("({0} {1}) ", printedName, TypeToString(var.Type));
                }

                wr.Write(") ");

                VCQuantifierInfo info = node.Info;
                var weight            = info.weight;
                if (!ProverOptions.UseWeights)
                {
                    weight = 1;
                }
                var hasAttrs = node.Triggers.Count > 0 || info.qid != null || weight != 1 || info.uniqueId != -1;

                if (hasAttrs)
                {
                    wr.Write("(! ");
                }

                Linearise(node.Body, options);

                if (hasAttrs)
                {
                    wr.Write("\n");
                    if (info.qid != null)
                    {
                        wr.Write(" :qid {0}\n", SMTLibNamer.QuoteId(info.qid));
                    }
                    if (weight != 1)
                    {
                        wr.Write(" :weight {0}\n", weight);
                    }
                    if (info.uniqueId != -1)
                    {
                        wr.Write(" :skolemid |{0}|\n", info.uniqueId);
                    }
                    WriteTriggers(node.Triggers, options);

                    wr.Write(")");
                }

                wr.Write(")");

                return(true);
            }
            finally
            {
                UnderQuantifier--;
                Namer.PopScope();
            }
        }