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