21 using System.Diagnostics.Contracts;
23 namespace Microsoft.Z3
28 [ContractVerification(
true)]
34 public bool IsUniversal
42 public bool IsExistential
44 get {
return !IsUniversal; }
58 public uint NumPatterns
70 Contract.Ensures(Contract.Result<
Pattern[]>() != null);
74 for (uint i = 0; i < n; i++)
83 public uint NumNoPatterns
95 Contract.Ensures(Contract.Result<
Pattern[]>() != null);
97 uint n = NumNoPatterns;
99 for (uint i = 0; i < n; i++)
116 public Symbol[] BoundVariableNames
120 Contract.Ensures(Contract.Result<
Symbol[]>() != null);
124 for (uint i = 0; i < n; i++)
133 public Sort[] BoundVariableSorts
137 Contract.Ensures(Contract.Result<
Sort[]>() != null);
141 for (uint i = 0; i < n; i++)
153 Contract.Ensures(Contract.Result<
BoolExpr>() != null);
159 [ContractVerification(
false)]
161 uint weight = 1,
Pattern[] patterns = null,
Expr[] noPatterns = null,
166 Contract.Requires(ctx != null);
167 Contract.Requires(sorts != null);
168 Contract.Requires(names != null);
169 Contract.Requires(body != null);
170 Contract.Requires(sorts.Length == names.Length);
171 Contract.Requires(Contract.ForAll(sorts, s => s != null));
172 Contract.Requires(Contract.ForAll(names, n => n != null));
173 Contract.Requires(patterns == null || Contract.ForAll(patterns, p => p != null));
174 Contract.Requires(noPatterns == null || Contract.ForAll(noPatterns, np => np != null));
176 Context.CheckContextMatch(patterns);
177 Context.CheckContextMatch(noPatterns);
178 Context.CheckContextMatch(sorts);
179 Context.CheckContextMatch(names);
180 Context.CheckContextMatch(body);
182 if (sorts.Length != names.Length)
183 throw new Z3Exception(
"Number of sorts does not match number of names");
185 IntPtr[] _patterns =
AST.ArrayToNative(patterns);
187 if (noPatterns == null && quantifierID == null && skolemID == null)
190 AST.ArrayLength(patterns),
AST.ArrayToNative(patterns),
191 AST.ArrayLength(sorts),
AST.ArrayToNative(sorts),
192 Symbol.ArrayToNative(names),
197 NativeObject = Native.Z3_mk_quantifier_ex(ctx.nCtx, (isForall) ? 1 : 0, weight,
198 AST.GetNativeObject(quantifierID), AST.GetNativeObject(skolemID),
199 AST.ArrayLength(patterns), AST.ArrayToNative(patterns),
200 AST.ArrayLength(noPatterns), AST.ArrayToNative(noPatterns),
201 AST.ArrayLength(sorts), AST.ArrayToNative(sorts),
202 Symbol.ArrayToNative(names),
207 [ContractVerification(
false)]
208 internal Quantifier(Context ctx,
bool isForall, Expr[] bound, Expr body,
209 uint weight = 1, Pattern[] patterns = null, Expr[] noPatterns = null,
210 Symbol quantifierID = null, Symbol skolemID = null
214 Contract.Requires(ctx != null);
215 Contract.Requires(body != null);
217 Contract.Requires(patterns == null || Contract.ForAll(patterns, p => p != null));
218 Contract.Requires(noPatterns == null || Contract.ForAll(noPatterns, np => np != null));
219 Contract.Requires(bound == null || Contract.ForAll(bound, n => n != null));
221 Context.CheckContextMatch(noPatterns);
222 Context.CheckContextMatch(patterns);
224 Context.CheckContextMatch(body);
226 if (noPatterns == null && quantifierID == null && skolemID == null)
228 NativeObject = Native.Z3_mk_quantifier_const(ctx.nCtx, (isForall) ? 1 : 0, weight,
229 AST.ArrayLength(bound), AST.ArrayToNative(bound),
230 AST.ArrayLength(patterns), AST.ArrayToNative(patterns),
235 NativeObject = Native.Z3_mk_quantifier_const_ex(ctx.nCtx, (isForall) ? 1 : 0, weight,
236 AST.GetNativeObject(quantifierID), AST.GetNativeObject(skolemID),
237 AST.ArrayLength(bound), AST.ArrayToNative(bound),
238 AST.ArrayLength(patterns), AST.ArrayToNative(patterns),
239 AST.ArrayLength(noPatterns), AST.ArrayToNative(noPatterns),
245 internal Quantifier(Context ctx, IntPtr obj) : base(ctx, obj) { Contract.Requires(ctx != null); }
248 internal override void CheckNativeObject(IntPtr obj)
251 throw new Z3Exception(
"Underlying object is not a quantifier");
252 base.CheckNativeObject(obj);