Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/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
Counter z3py:如何在z3中实现计数器?_Counter_Z3_Smt_Z3py - Fatal编程技术网

Counter z3py:如何在z3中实现计数器?

Counter z3py:如何在z3中实现计数器?,counter,z3,smt,z3py,Counter,Z3,Smt,Z3py,我想设计类似于Z3py中计数器的逻辑 如果编写python脚本,我们通常定义一个变量“counter”,然后在必要时不断递增它。然而,在Z3中,没有变体。因此,我没有定义变量,而是定义了该变量的跟踪 这是一个示例代码。假设有一个大小为5的数组“myArray”,数组中的元素为1或2。我想声明一个约束,“myArray”中必须有两个'2' 我的问题是,这是在Z3中实现计数器概念的有效方法吗?在我的实际问题中,这是一个更复杂的问题,它的效率确实很低。您可以这样做,但在myArray[i]==2上创建

我想设计类似于Z3py中计数器的逻辑

如果编写python脚本,我们通常定义一个变量“counter”,然后在必要时不断递增它。然而,在Z3中,没有变体。因此,我没有定义变量,而是定义了该变量的跟踪

这是一个示例代码。假设有一个大小为5的数组“myArray”,数组中的元素为1或2。我想声明一个约束,“myArray”中必须有两个'2'


我的问题是,这是在Z3中实现计数器概念的有效方法吗?在我的实际问题中,这是一个更复杂的问题,它的效率确实很低。

您可以这样做,但在
myArray[i]==2上创建和要容易得多?1:0
。这样,您就不需要断言任何东西,您正在处理正常表达式。

您是对的,但我更担心的是效率,或者换句话说,检查时间短。我的实现的复杂性是O(n),其中n是数组的长度。在我的实际问题中,当我在数组中循环两次时,复杂性变为O(n^2),这是非常低效的。所以真正的问题是二次复杂性,对吗?那么这与计数无关。从这个角度来看,这个问题似乎与你的问题无关@我想我应该重新表述我的问题:除了在z3中为变量的跟踪设置约束之外,还有其他方法可以为变量设置约束吗?跟踪的想法是可行的,但对我来说似乎效率低下,因为它添加了更多的变量和约束。在Z3中,一切都是不可变的。我不清楚为什么追踪的想法对你来说是错误的。它添加了线性数量的变量。每个变量的大小必须是ceil(log2(n))位,因此您可以认为所需的工作量是n*log(n),是的。;在文献中,有一种想法是使用计数网络来有效地编码约束,例如“某物的计数必须在x和y之间”。这确实有助于提高解算器性能。Z3以战术的形式对其提供了一些支持。我不熟悉这个。
from z3 import *

s = Solver()
myArray = IntVector('myArray',5)
for i in range(5):
    s.add(Or(myArray[i]==1,myArray[i]==2))
counterTrace = IntVector('counterTrace',6)
s.add(counterTrace[0]==0)
for i in range(5):
    s.add(If(myArray[i]==2,counterTrace[i+1]==counterTrace[i]+1,counterTrace[i+1]==counterTrace[i]))
s.add(counterTrace[5]==2)
print s.check()
print s.model()