Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.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中迭代添加_Z3_Z3py - Fatal编程技术网

在z3中迭代添加

在z3中迭代添加,z3,z3py,Z3,Z3py,我想检查a,b,c的值,如果值'a'等于1,'x'加一。我们继续处理值“b”和“c”。 所以如果a=1,b=1,c=1,x的结果应该是3。 如果a=1,b=1,c=0,那么x的结果应该是2。 z3中有什么要实现的方法吗? 源代码如下所示: 从z3进口* a、 b,c=Ints'abc' x、 y=整数x y s=解算器 s、 addIfa==1,x=x+1,y=y-1 s、 addIfb==1,x=x+1,y=y-1 s、 加法=1,x=x+1,y=y-1 s、 检查 打印s.model 关于我

我想检查a,b,c的值,如果值'a'等于1,'x'加一。我们继续处理值“b”和“c”。 所以如果a=1,b=1,c=1,x的结果应该是3。 如果a=1,b=1,c=0,那么x的结果应该是2。 z3中有什么要实现的方法吗? 源代码如下所示:

从z3进口* a、 b,c=Ints'abc' x、 y=整数x y s=解算器 s、 addIfa==1,x=x+1,y=y-1 s、 addIfb==1,x=x+1,y=y-1 s、 加法=1,x=x+1,y=y-1 s、 检查 打印s.model
关于我能做什么有什么建议吗?

这种迭代处理通常是通过展开作业并创建所谓的SSA表单来建模的。静态单一赋值。在这种格式中,每个变量只指定一次,但可以多次使用。这通常是由一些底层工具完成的,因为它相当乏味,但您也可以手动完成。应用于你的问题,它看起来像:

从z3进口* s=解算器 a、 b,c=Ints'abc' x0,x1,x2,x3=整数'x0-x1-x2-x3' s、 addx0==0 s、 addx1==Ifa==1,x0+1,x0 s、 addx2==Ifb==1,x1+1,x1 s、 addx3==Ifc==1,x2+1,x2 以下断言不是问题的一部分,但是 它们使输出变得有趣 s、 addb==1 s、 addc==0 找到模型 如果s.check==sat: m=s.模型 打印a=%d,b=%d,c=%d,x=%d%m[a]。等长,m[b]。等长,m[c]。等长,m[x3]。等长 其他: 不打印解决方案 SSA转换应用于变量x,创建尽可能多的实例来建模赋值。运行时,此程序将生成:

a=0, b=1, c=0, x=1

希望有帮助

注意z3有很多功能。这里可以使用的一个是列表的总和。在列表中,您可以放置简单变量,也可以放置表达式。下面是一个简单和更复杂总和的示例:

from z3 import *

a, b, c = Ints('a b c')
x, y = Ints('x y')
s = Solver()
s.add(a==1, b==0, c==1)
s.add(x==Sum([a,b,c]))
s.add(y==Sum([If(a==1,-1,0),If(b==1,-1,0),If(c==1,-1,0)]))
if s.check() == sat:
    print ("solution:", s.model())
else:
    print ("no solution possible")
结果: 解决方案:[y=2,x=2,c=1,b=0,a=1]

如果您的问题更复杂,使用位向量而不是整数可以使它运行得更快一些

编辑:也可以简单地使用加法,而不是求和

s、 addx==a+b+c s、 addy==Ifa==1,-1,0+Ifb==1,-1,0+Ifc==1,-1,0


当变量列表较长或变量已在列表中时,Sum在可读性方面很有意义。

哪些工具可以自动执行此操作?主要是编译器、转换器、验证引擎等。有关详细信息,请参阅。@alias:您认为我正确理解了这个问题吗?我认为您的编码非常好。不可能知道原始海报的意图是什么,也许他们可以发表意见。SSA是处理此类命令式程序的常用技巧,我认为他/她一般都在处理这些程序。对于特定情况,编码越简单越好;当然