Python 如何添加要求整数变量属于数组的约束?
假设我有一个整数变量Python 如何添加要求整数变量属于数组的约束?,python,z3,smt,z3py,Python,Z3,Smt,Z3py,假设我有一个整数变量x=Int('x'),和一个整数数组a=[1,2,3]。然后我通过s.add(a中的x)添加一个约束 我认为这是可以满足的,因为x可以是1、2或3。但事实上这是不可行的。谁能告诉我如何添加一个约束以确保中的x 谢谢 下面是我使用的python代码。我认为输出答案应该是s是可满足的,因为x可以等于1、2或3,那么a中的约束x就满足了。但答案实际上是不正确的。可能这不是指定此约束的正确方法。所以我的问题是如何指定这样的约束,以确保变量只能用特定数组中的值实例化 from z3 i
x=Int('x')
,和一个整数数组a=[1,2,3]
。然后我通过s.add(a中的x)添加一个约束
我认为这是可以满足的,因为x
可以是1、2或3
。但事实上这是不可行的。谁能告诉我如何添加一个约束以确保中的x
谢谢
下面是我使用的python代码。我认为输出答案应该是s是可满足的,因为x可以等于1、2或3,那么a
中的约束x就满足了。但答案实际上是不正确的。可能这不是指定此约束的正确方法。所以我的问题是如何指定这样的约束,以确保变量只能用特定数组中的值实例化
from z3 import *
x = Int('x')
a = [1, 2, 3]
s = Solver()
s.add(x in a)
print(s.check())
这应该做到:
from z3 import *
a = [1,2,3]
s = Solver()
x = Int('x')
s.add(Or([x == i for i in a]))
# Enumerate all possible solutions:
while True:
r = s.check()
if r == sat:
m = s.model()
print m
s.add(x != m[x])
else:
print r
break
当我运行此程序时,我得到:
[x = 1]
[x = 2]
[x = 3]
unsat
“a中的x”是一个python表达式,由于变量x不属于数组,因此在断言约束之前,该表达式的计算结果为False 一种方法是使用循环构建z3.和
或z3.或
约束
# Finds all numbers in the domain, for which it's square is also in the domain
import z3
exclude = [1,2]
domain = list(range(128))
number = z3.Int('number')
squared = number * number
solver = z3.Solver()
solver.add(z3.Or([ number == value for value in domain ]))
solver.add(z3.Or([ squared == value for value in domain ]))
solver.add(z3.And([ number != value for value in exclude ]))
solver.add(z3.And([ squared != value for value in exclude ]))
solver.push() # create stack savepoint
output = []
while solver.check() == z3.sat:
value = solver.model()[number].as_long()
solver.add( number != value )
output.append(value)
solver.pop() # reset stack to last solver.push()
print(output)
# [10, 0, 4, 6, 5, 11, 9, 8, 3, 7]
print(sorted(output))
# [0, 3, 4, 5, 6, 7, 8, 9, 10, 11]
我不明白这个问题。这看起来不像是你的代码的完整示例:你认为需要使用数字列表,而不是使用定义充分的
约束的solve
,@timgeb这里的“z3”和“z3py”标记是相当重要的@迈克·波马克斯·卡默曼啊,谢谢你指出这一点!什么是s
?在s中添加(a中的x)