如何为 z3py 序列中的所有元素设置约束?
How to set constraints for all elements in z3py sequence?
我将继续探索 z3py 序列。在这里,我想创建一个仅包含正值的序列。这是代码:
from z3 import *
s = Solver()
# declare a sequence of integers
seq = Const('seq', SeqSort(IntSort()))
# assert the sequence have at least 5 elements
s.add(Length(seq) >= 5)
# get a model and print it:
if s.check() == sat:
print(s.model())
所以这里的输出值没有任何限制。如何为 seq
中的所有元素设置约束以使其为正数?
谢谢!
要声明此类约束,您可以使用通用量化。下面展示如何确保所有元素都是> -5
, < 0
:
from z3 import *
s = Solver()
# declare a sequence of integers
seq = Const('seq', SeqSort(IntSort()))
# assert the sequence have at least 5 elements
s.add(Length(seq) >= 5)
dummyIndex = FreshInt('dummyIndex')
s.add(ForAll(dummyIndex, Implies(dummyIndex < Length(seq), And(seq[dummyIndex] > -5, seq[dummyIndex] < 0))))
# get a model and print it:
if s.check() == sat:
print(s.model()[seq])
当 运行 时,打印:
Concat(Unit(-1),
Concat(Unit(-3),
Concat(Unit(-2), Concat(Unit(-3), Unit(-4)))))
请注意,在逻辑中添加量词会使其成为半可判定的;即,在存在复杂约束的情况下,z3 可以 return unknown
或永远循环。
我将继续探索 z3py 序列。在这里,我想创建一个仅包含正值的序列。这是代码:
from z3 import *
s = Solver()
# declare a sequence of integers
seq = Const('seq', SeqSort(IntSort()))
# assert the sequence have at least 5 elements
s.add(Length(seq) >= 5)
# get a model and print it:
if s.check() == sat:
print(s.model())
所以这里的输出值没有任何限制。如何为 seq
中的所有元素设置约束以使其为正数?
谢谢!
要声明此类约束,您可以使用通用量化。下面展示如何确保所有元素都是> -5
, < 0
:
from z3 import *
s = Solver()
# declare a sequence of integers
seq = Const('seq', SeqSort(IntSort()))
# assert the sequence have at least 5 elements
s.add(Length(seq) >= 5)
dummyIndex = FreshInt('dummyIndex')
s.add(ForAll(dummyIndex, Implies(dummyIndex < Length(seq), And(seq[dummyIndex] > -5, seq[dummyIndex] < 0))))
# get a model and print it:
if s.check() == sat:
print(s.model()[seq])
当 运行 时,打印:
Concat(Unit(-1),
Concat(Unit(-3),
Concat(Unit(-2), Concat(Unit(-3), Unit(-4)))))
请注意,在逻辑中添加量词会使其成为半可判定的;即,在存在复杂约束的情况下,z3 可以 return unknown
或永远循环。