如何打印Z3集合对象?

如何打印Z3集合对象?,z3,Z3,我无法打印/显示作为Z3模型一部分返回的集合对象。请考虑下面的例子(在f*)中: 解算器返回一个集合(在本例中是一个单例集合{a},但这并不重要)。我看不出有什么办法可以把它打印出来。标准的ToString()方法只是说它是一个数组,显示模型表明集合是使用查询函数在内部表示的。我尝试了以下方法 let foo xs x = let mem= ctx.MkSetMembership(x,xs_interp) :?> BoolExpr s.Assert mem s.Check()=

我无法打印/显示作为Z3模型一部分返回的集合对象。请考虑下面的例子(在f*)中:

解算器返回一个集合(在本例中是一个单例集合{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()方法以实际打印集合内容?

Z3允许您定义一些集合操作,例如成员资格测试、union、, 交集和空集,依靠数组理论。 集合排序只是布尔数组。 集合运算被编译成数组理论, 这样,空集对应的布尔数组为false 在域中的所有值上。 成员资格测试只是数组选择。 因此,您从Z3获得的模型将以数组的形式表示所有内容

阵列模型使用辅助函数是正确的。 这使得穿越有点困难。原则上,您可以选择与术语匹配的模式 由模型返回(它应该将数组值表示为“(as array k!32)”项), 然后,您可以遍历k的模型!32(或者它的名称),这是一个 所谓的函数解释。抱歉,这不是获取模型的最直接方式 对于有限数组,但表示允许Z3作为函数在数组之间来回移动


论文:展示了如何将一些集合操作表示为数组。

Z3允许您定义一些集合操作,例如成员资格测试、联合、和, 交集和空集,依靠数组理论。 集合排序只是布尔数组。 集合运算被编译成数组理论, 这样,空集对应的布尔数组为false 在域中的所有值上。 成员资格测试只是数组选择。 因此,您从Z3获得的模型将以数组的形式表示所有内容

阵列模型使用辅助函数是正确的。 这使得穿越有点困难。原则上,您可以选择与术语匹配的模式 由模型返回(它应该将数组值表示为“(as array k!32)”项), 然后,您可以遍历k的模型!32(或者它的名称),这是一个 所谓的函数解释。抱歉,这不是获取模型的最直接方式 对于有限数组,但表示允许Z3作为函数在数组之间来回移动

本文:展示了如何将一些集合运算表示为数组

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