如何为 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 或永远循环。