我一直无法打印/显示作为Z3模型的一部分返回的设置对象。考虑下面的例子(在F#):如何打印Z3设置对象?
let ctx:Context = new Context()
let ASort = ctx.MkEnumSort("S",[| "A"; "B"; "C"|])
let ASetSort = ctx.MkSetSort(ASort)
let xs = ctx.MkConst("xs",ASetSort)
let p = mkPredDecl ctx ("p",[|ASetSort|])
let px = ctx.MkApp(p,xs) :?> BoolExpr
let s = ctx.MkSolver()
s.Assert (ctx.MkAnd(px, ctx.MkNot(ctx.MkEq(xs,ctx.MkEmptySet(ASort)))))
assert (s.Check() = Status.SATISFIABLE)
let xs_interp = s.Model.Eval(xs)
xs_interp
求解器返回一组(在此情况下一个单独集合{A},但它没有重要性)。我看不到任何实际打印的方式。标准的ToString()
方法只是说它的一个数组,并显示模型显示该集合内部使用查询函数表示。我试过以下
let foo xs x =
let mem= ctx.MkSetMembership(x,xs_interp) :?> BoolExpr
s.Assert mem
s.Check()= Status.SATISFIABLE
Array.filter (foo xs) ASort.Consts
不仅它笨重,它不工作!我想我可以遍历集合的查询函数表达式,但是如果Z3中的集合表示改变了它会破坏我的代码,那对我来说似乎不是那么好。我缺少API中的某些东西吗? ToString()方法是否可能被修改为实际打印设置的内容?