我无法打印/显示作为 Z3 模型的一部分返回的集合对象。考虑以下示例(在 F# 中):
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() 方法以实际打印设置的内容?