Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.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
Python 列表理解的项目,在z3模型中部分评估_Python_List Comprehension_Z3_Z3py - Fatal编程技术网

Python 列表理解的项目,在z3模型中部分评估

Python 列表理解的项目,在z3模型中部分评估,python,list-comprehension,z3,z3py,Python,List Comprehension,Z3,Z3py,考虑以下示例: from z3 import * data = [BitVec("x_{}".format(i), 8) for i in range(10)] s = Solver() s.add(Sum(data1) == 10) while True: s.push() if s.check() == sat: if len(s.model()) != 10: print(len(s.model())) pri

考虑以下示例:

from z3 import *
data = [BitVec("x_{}".format(i), 8) for i in range(10)]
s = Solver()
s.add(Sum(data1) == 10)
while True:
    s.push()
    if s.check() == sat:
        if len(s.model()) != 10:
            print(len(s.model()))
            print(s.model())
            break
    s.pop()
从z3导入*
data1=[BitVec(“x_{}”.format(i),8)表示范围(10)中的i]
数据2=[BitVec(“x_{}”。格式(i),8)表示范围(20)内的i]
var=比特向量(“var”,16)
s=解算器()
s、 添加(不是(或)(
和(var==100,和(数据1)==10),
和(var==200,和(数据2==10)))
尽管如此:
s、 推
如果s.check()==sat:
如果len(s.model())!=11和len(s.model())!=21:
打印(len(s.model()))
打印(s.model())
打破
s、 流行音乐()
产生以下结果:

12
[x_2=252,
x_9=248,
x_1=255,
x_3=96,
x_5=192,
x_4=223,
x_17=0,
var=0,
x_0=0,
x_6=252,
x_7=254,
x_8=248]
结果似乎是正确的,但我不明白为什么x_17出现在列表中

另一个结果是:

1
[var=0]
空列表是否被认为是
Sum(data1)==10的有效解决方案?
它如何明确指定列表必须包含10或20个项目?
但我的主要问题是:为什么要提出部分清单作为解决方案

在这个例子中:

from z3 import *
data = [BitVec("x_{}".format(i), 8) for i in range(10)]
s = Solver()
s.add(Sum(data1) == 10)
while True:
    s.push()
    if s.check() == sat:
        if len(s.model()) != 10:
            print(len(s.model()))
            print(s.model())
            break
    s.pop()
该计划并不是从循环中产生的,没有用部分列表提出解决方案。 可能And操作器的设计具有短路行为?

第一个程序 您的约束条件是:

s.add(非(或(
和(var==100,和(数据1)==10),
和(var==200,和(数据2==10)))
到,这相当于:

s.add(或(var!=100,Sum(data1)!=10))
s、 加(或(变量!=200,总和(数据2)!=10))
考虑如果解算器将
var
设置为
0
,会发生什么:两个析取都是真的,因此系统是可满足的。因此,不管所有的
x
设置为什么,也不管总和是多少

总之,任何
var
不是
100
200
的赋值都是您问题的模型。请注意,z3只会分配“足够”的变量,使您的问题处于
sat
状态,因此您不会看到其他变量。(但如果您确实需要它们,则可以获取它们的值;z3只是告诉您,它们并不重要,因为不将它们放入模型中。)

第二程序 在第二个问题中(将
data1
重命名为
data
之后),进入无限循环的是Python程序。Z3实际上几乎立即回答了您的查询,但您的
条件是:

if len(s.model())!=10:

而由z3发现的模型正好包含10个东西。所以你一直在z3外循环。也许您打算让
行读
==10

谢谢您的回复。我的问题很愚蠢。我以为我在做一个无符号的和,所以如果前n个元素的和大于10,那么下面的值是不必要的。它没有考虑整数溢出。事实上,无论是有符号的还是无符号的,模型必须包含所有10个值。对此我很抱歉。但是,如果z3只会分配“足够”的变量使我的问题进入sat状态,为什么我会得到第一个答案?在这种情况下,“var=0”似乎足够了,但该模型提供了更多的值。“但如果你真的需要他们,就有可能得到他们的价值观”:我需要它你是怎么做到的?正是在这种情况下,我使用列表理解?模型生成是“机会主义的”。当解算器探索状态空间时,您将获得足够的赋值来满足约束。但不能保证这项任务是最低限度的。(一般来说,“最小”这类赋值的概念甚至没有很好的定义。赋值集中没有“顺序”)。因此,当解算器探索解空间时,您将得到所需的最小值,可能还会得到一些其他值。要获得“全部”值,请参见以下答案:本质上,它归结为调用
model.eval(var,model_completion=True)
对于您感兴趣的每个
var
。非常感谢!这正是我想要的答案。