有什么方法可以从未解释的术语代表转到z3中的术语?

时间:2016-11-24 16:11:19

标签: c++ z3

我正在使用c ++ API。我创建了一个未解释的和该类型的x,y和z术语。

z3::context ctx;
auto termSort = ctx.uninterpreted_sort("USORT");
auto x = ctx.constant("x", termSort);
auto y = ctx.constant("y", termSort);
auto z = ctx.constant("z", termSort);

solver s(ctx);
s.add(x == y);
s.add(y != z);
s.check();
auto model = s.get_model();

当我打印模型时,我得到以下内容,基本上是为每个术语打印出内部代表。

x: USORT!val!0
y: USORT!val!0
z: USORT!val!1

我的问题是:如何快速从代表到学期?我想要一个这样的函数:

repr_to_term(USORT!val!0) => [x, y]
repr_to_term(USORT!val!1) => [z]

Z3 API中是否有类似的内容?还是一种模仿它的方法?

在这个简单的例子中,我可以简单地走完所有的条款,并建立一个从代表到术语的地图。但在我的实际案例中,我不想在每次生成模型时都遵循所有条款,因为有很多术语。

2 个答案:

答案 0 :(得分:0)

我从未使用过C ++ API,这个答案可能不是你想要的。但是在z3py中我们可以用以下方式声明变量

>>> from z3 import *
>>> for i in xrange(9):
...     globals()['a%i' % i]=BitVec('a%i' %i,8)
... 
>>> type(a0)
<type 'instance'>

答案 1 :(得分:0)

如果获取此信息一次然后多次使用,最好的想法可能是按照建议生成地图,然后将其用于查找。

否则,通过一点点重构,问题将适合Z3_get_implied_equalities,这解决了一个非常类似的任务。虽然,我不能说这是否会或应该表现得更好。