我一直無法打印/顯示作爲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()方法是否可能被修改爲實際打印設置的內容?