Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Z3 如何在api中计算smtlib2文件中的总约束数_Z3 - Fatal编程技术网

Z3 如何在api中计算smtlib2文件中的总约束数

Z3 如何在api中计算smtlib2文件中的总约束数,z3,Z3,我使用Z3\u ast fs=Z3\u parse\u smtlib2\u文件(ctx,arg[1],0,0,0,0,0)来读取文件 此外,为了添加到解算器中,使用了expr F=to_expr(ctx,fs),然后使用s.add(F) 我的问题是如何获得每个实例中的总约束数 我还尝试了F.num_args(),但是在某些情况下,它给出了错误的大小 有什么方法可以计算总约束吗?使用Goal.size()可以在将F添加到某个目标后执行您想要的操作。这里有一个指向Python API描述的链接,我相

我使用
Z3\u ast fs=Z3\u parse\u smtlib2\u文件(ctx,arg[1],0,0,0,0,0)
来读取文件

此外,为了添加到解算器中,使用了
expr F=to_expr(ctx,fs)
,然后使用
s.add(F)

我的问题是如何获得每个实例中的总约束数

我还尝试了
F.num_args()
,但是在某些情况下,它给出了错误的大小

有什么方法可以计算总约束吗?

使用
Goal.size()
可以在将
F
添加到某个目标后执行您想要的操作。这里有一个指向Python API描述的链接,我相信您可以在C/C++API中找到相应的链接:

一个
expr F
表示一个抽象语法树,因此
F.num_args()
返回
F
具有的(一步式)子级的数量,这可能就是您一直尝试的不总是有效的原因。例如,假设
F=a+b
,然后
F.num_args()=2
。而且,如果
F=a+b*c
,那么
F.num_args()=2
,其中子项将是
a
b*c
(假设通常的操作顺序)。因此,要计算约束的数量(如果您的定义与
Goal.size()
产生的不同),可以使用遍历树的递归方法

我在下面的例子中强调了所有这些(这里的z3py链接:)

例如,我对约束的定义(或者更确切地说是某种意义上的表达式的复杂性)可能是叶子的数量或表达式的深度。您可以根据需要对此进行详细说明,例如,计算不同类型的操作数以适应您对约束的定义,因为您的问题并不完全清楚。例如,可以将约束定义为表达式中出现的等式和/或不等式的数目。这可能需要修改以适用于带有量词、数组或未解释函数的公式。还要注意,Z3可以自动简化事情(例如,在下面的示例中,
1-1
被简化为
0


此外,我还可以使用goal()获取smtlib2实例中断言的原始断言吗?换句话说,F.arg()能否获得所有原始断言?非常感谢。是的,您可以使用
g.as_expr()
作为
目标g
返回在
g
中声明的任何表达式(即,在使用
g.add(F)
之后)。以下是Python API描述:
a, b, c = Reals('a b c')

F = a + b
print F.num_args() # 2

F = a + b * c
print F.num_args() # 2

print F.children() # [a,b*c]

g = Goal()
g.add(F == 0)
print g.size() # number of constraints = 1

g.add(Or(F == 0, F == 1, F == 2, F == 3))
print g.size() # number of constraints = 2
print g

g.add(And(F == 0, F == 1, F == 2, F == 3))
print g.size() # number of constraints = 6
print g

def count_constraints(c,d,f):
  print 'depth: ' + str(d) + ' expr: ' + str(f)
  if f.num_args() == 0:
    return c + 1
  else:
    d += 1
    for a in f.children():
      c += count_constraints(0, d, a)
    return c

exp = a + b * c + a + c * c
print count_constraints(0,0,exp)

exp = And(a == b, b == c, a == 0, c == 0, b == 1 - 1)
print count_constraints(0,0,exp)

q, r, s = Bools('q r s')
exp = And(q, r, s)
print count_constraints(0,0,exp)