3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-06-17 03:16:17 +00:00

use IEnumerator and format

This commit is contained in:
Nikolaj Bjorner 2022-06-28 14:24:05 -07:00
parent 556f0d7b5f
commit 798a4ee86e

View file

@ -76,70 +76,83 @@ namespace Microsoft.Z3
CreatedEh created_eh; CreatedEh created_eh;
DecideEh decide_eh; DecideEh decide_eh;
void Callback(Action fn, Z3_solver_callback cb) { void Callback(Action fn, Z3_solver_callback cb)
{
this.callback = cb; this.callback = cb;
try { try
{
fn(); fn();
} }
catch { catch
{
// TBD: add debug log or exception handler // TBD: add debug log or exception handler
} }
finally { finally
{
this.callback = IntPtr.Zero; this.callback = IntPtr.Zero;
} }
} }
static void _push(voidp ctx, Z3_solver_callback cb) { static void _push(voidp ctx, Z3_solver_callback cb)
{
var prop = propagators[ctx.ToInt32()]; var prop = propagators[ctx.ToInt32()];
prop.Callback(() => prop.Push(), cb); prop.Callback(() => prop.Push(), cb);
} }
static void _pop(voidp ctx, Z3_solver_callback cb, uint num_scopes) { static void _pop(voidp ctx, Z3_solver_callback cb, uint num_scopes)
{
var prop = propagators[ctx.ToInt32()]; var prop = propagators[ctx.ToInt32()];
prop.Callback(() => prop.Pop(num_scopes), cb); prop.Callback(() => prop.Pop(num_scopes), cb);
} }
static voidp _fresh(voidp _ctx, Z3_context new_context) { static voidp _fresh(voidp _ctx, Z3_context new_context)
{
var prop = propagators[_ctx.ToInt32()]; var prop = propagators[_ctx.ToInt32()];
var ctx = new Context(new_context); var ctx = new Context(new_context);
var prop1 = prop.Fresh(prop.ctx); var prop1 = prop.Fresh(prop.ctx);
return new IntPtr(prop1.id); return new IntPtr(prop1.id);
} }
static void _fixed(voidp ctx, Z3_solver_callback cb, Z3_ast _term, Z3_ast _value) { static void _fixed(voidp ctx, Z3_solver_callback cb, Z3_ast _term, Z3_ast _value)
{
var prop = propagators[ctx.ToInt32()]; var prop = propagators[ctx.ToInt32()];
using var term = Expr.Create(prop.ctx, _term); using var term = Expr.Create(prop.ctx, _term);
using var value = Expr.Create(prop.ctx, _value); using var value = Expr.Create(prop.ctx, _value);
prop.Callback(() => prop.fixed_eh(term, value), cb); prop.Callback(() => prop.fixed_eh(term, value), cb);
} }
static void _final(voidp ctx, Z3_solver_callback cb) { static void _final(voidp ctx, Z3_solver_callback cb)
{
var prop = propagators[ctx.ToInt32()]; var prop = propagators[ctx.ToInt32()];
prop.Callback(() => prop.final_eh(), cb); prop.Callback(() => prop.final_eh(), cb);
} }
static void _eq(voidp ctx, Z3_solver_callback cb, Z3_ast a, Z3_ast b) { static void _eq(voidp ctx, Z3_solver_callback cb, Z3_ast a, Z3_ast b)
{
var prop = propagators[ctx.ToInt32()]; var prop = propagators[ctx.ToInt32()];
using var s = Expr.Create(prop.ctx, a); using var s = Expr.Create(prop.ctx, a);
using var t = Expr.Create(prop.ctx, b); using var t = Expr.Create(prop.ctx, b);
prop.Callback(() => prop.eq_eh(s, t), cb); prop.Callback(() => prop.eq_eh(s, t), cb);
} }
static void _diseq(voidp ctx, Z3_solver_callback cb, Z3_ast a, Z3_ast b) { static void _diseq(voidp ctx, Z3_solver_callback cb, Z3_ast a, Z3_ast b)
{
var prop = propagators[ctx.ToInt32()]; var prop = propagators[ctx.ToInt32()];
using var s = Expr.Create(prop.ctx, a); using var s = Expr.Create(prop.ctx, a);
using var t = Expr.Create(prop.ctx, b); using var t = Expr.Create(prop.ctx, b);
prop.Callback(() => prop.diseq_eh(s, t), cb); prop.Callback(() => prop.diseq_eh(s, t), cb);
} }
static void _created(voidp ctx, Z3_solver_callback cb, Z3_ast a) { static void _created(voidp ctx, Z3_solver_callback cb, Z3_ast a)
{
var prop = propagators[ctx.ToInt32()]; var prop = propagators[ctx.ToInt32()];
using var t = Expr.Create(prop.ctx, a); using var t = Expr.Create(prop.ctx, a);
prop.Callback(() => prop.created_eh(t), cb); prop.Callback(() => prop.created_eh(t), cb);
} }
static void _decide(voidp ctx, Z3_solver_callback cb, ref Z3_ast a, ref uint idx, ref int phase) { static void _decide(voidp ctx, Z3_solver_callback cb, ref Z3_ast a, ref uint idx, ref int phase)
{
var prop = propagators[ctx.ToInt32()]; var prop = propagators[ctx.ToInt32()];
var t = Expr.Create(prop.ctx, a); var t = Expr.Create(prop.ctx, a);
var u = t; var u = t;
@ -201,15 +214,25 @@ namespace Microsoft.Z3
/// <summary> /// <summary>
/// Declare combination of assigned expressions a conflict /// Declare combination of assigned expressions a conflict
/// </summary> /// </summary>
public void Conflict(params Expr[] terms) { public void Conflict(params Expr[] terms)
{
Propagate(terms, ctx.MkFalse());
}
/// <summary>
/// Declare combination of assigned expressions a conflict
/// </summary>
public void Conflict(IEnumerable<Expr> terms)
{
Propagate(terms, ctx.MkFalse()); Propagate(terms, ctx.MkFalse());
} }
/// <summary> /// <summary>
/// Propagate consequence /// Propagate consequence
/// </summary> /// </summary>
public void Propagate(Expr[] terms, Expr conseq) { public void Propagate(IEnumerable<Expr> terms, Expr conseq)
var nTerms = Z3Object.ArrayToNative(terms); {
var nTerms = Z3Object.ArrayToNative(terms.ToArray());
Native.Z3_solver_propagate_consequence(ctx.nCtx, this.callback, (uint)nTerms.Length, nTerms, 0u, null, null, conseq.NativeObject); Native.Z3_solver_propagate_consequence(ctx.nCtx, this.callback, (uint)nTerms.Length, nTerms, 0u, null, null, conseq.NativeObject);
} }
@ -304,11 +327,14 @@ namespace Microsoft.Z3
/// <summary> /// <summary>
/// Track assignments to a term /// Track assignments to a term
/// </summary> /// </summary>
public void Register(Expr term) { public void Register(Expr term)
if (this.callback != IntPtr.Zero) { {
if (this.callback != IntPtr.Zero)
{
Native.Z3_solver_propagate_register_cb(ctx.nCtx, callback, term.NativeObject); Native.Z3_solver_propagate_register_cb(ctx.nCtx, callback, term.NativeObject);
} }
else { else
{
Native.Z3_solver_propagate_register(ctx.nCtx, solver.NativeObject, term.NativeObject); Native.Z3_solver_propagate_register(ctx.nCtx, solver.NativeObject, term.NativeObject);
} }
} }