public Term Visit(VCExprQuantifier node, LineariserOptions options) { Contract.Requires(options != null); Contract.Requires(node != null); Contract.Assert(node.TypeParameters.Count == 0); namer.PushScope(); try { List <string> varNames; List <Type> varTypes; VisitBounds(node.BoundVars, out varNames, out varTypes); List <Pattern> patterns; List <Term> no_patterns; VisitTriggers(node.Triggers, options, out patterns, out no_patterns); Term body = Linearise(node.Body, options); Term result; uint weight = 1; string qid = ""; int skolemid = 0; if (options.QuantifierIds) { VCQuantifierInfos infos = node.Infos; Contract.Assert(infos != null); if (infos.qid != null) { qid = infos.qid; } if (0 <= infos.uniqueId) { skolemid = infos.uniqueId; } } if (options.UseWeights) { weight = (uint)QKeyValue.FindIntAttribute(node.Infos.attributes, "weight", 1); } switch (node.Quan) { case Microsoft.Boogie.VCExprAST.Quantifier.ALL: result = MakeQuantifier(true, weight, qid, skolemid, varNames, varTypes, patterns, no_patterns, body); break; case Microsoft.Boogie.VCExprAST.Quantifier.EX: result = MakeQuantifier(false, weight, qid, skolemid, varNames, varTypes, patterns, no_patterns, body); break; default: throw new Exception("unknown quantifier kind " + node.Quan); } return(result); } finally { namer.PopScope(); } }
public VCExpr Exists(List <TypeVariable /*!*/> /*!*/ typeParams, List <VCExprVar /*!*/> /*!*/ vars, List <VCTrigger /*!*/> /*!*/ triggers, VCQuantifierInfos infos, VCExpr body) { Contract.Requires(body != null); Contract.Requires(infos != 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, infos, 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(") "); VCQuantifierInfos infos = node.Infos; var weight = QKeyValue.FindIntAttribute(infos.attributes, "weight", 1); if (!ProverOptions.UseWeights) { weight = 1; } var hasAttrs = node.Triggers.Count > 0 || infos.qid != null || weight != 1 || infos.uniqueId != -1; if (hasAttrs) { wr.Write("(! "); } Linearise(node.Body, options); if (hasAttrs) { wr.Write("\n"); if (infos.qid != null) { wr.Write(" :qid {0}\n", SMTLibNamer.QuoteId(infos.qid)); } if (weight != 1) { wr.Write(" :weight {0}\n", weight); } if (infos.uniqueId != -1) { wr.Write(" :skolemid |{0}|\n", infos.uniqueId); } WriteTriggers(node.Triggers, options); wr.Write(")"); } wr.Write(")"); return(true); } finally { UnderQuantifier--; Namer.PopScope(); } }
///////////////////////////////////////////////////////////////////////////////////// public bool Visit(VCExprQuantifier node, LineariserOptions options) { //Contract.Requires(options != null); //Contract.Requires(node != null); AssertAsFormula(node.Quan.ToString(), options); Contract.Assert(node.TypeParameters.Count == 0); 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.GetLocalName(var, var.Name); Contract.Assert(printedName != null); if (i != 0) { wr.Write(" "); } WriteId(printedName); if (options.UseTypes) { wr.Write(" :TYPE {0}", TypeToString(var.Type)); } } wr.Write(") "); WriteTriggers(node.Triggers, options); if (options.QuantifierIds) { // only needed for Z3 VCQuantifierInfos infos = node.Infos; Contract.Assert(infos != null); if (infos.qid != null) { wr.Write("(QID "); wr.Write(infos.qid); wr.Write(") "); } if (0 <= infos.uniqueId) { wr.Write("(SKOLEMID "); wr.Write(infos.uniqueId); wr.Write(") "); } } if (options.UseWeights) { int weight = QKeyValue.FindIntAttribute(node.Infos.attributes, "weight", 1); if (weight != 1) { wr.Write("(WEIGHT "); wr.Write(weight); wr.Write(") "); } } Linearise(node.Body, options); wr.Write(")"); return(true); } finally { Namer.PopScope(); } }