如何为z3py序列中的所有元素设置正数值约束
解决方案
你可以通过Z3提供的全称量词ForAll搭配序列下标访问接口Nth实现所有元素为正的约束,具体修改如下:
你需要新增索引变量声明和对应的全局约束,新增代码段如下:
# 声明索引用的整数变量 i = Int('i') # 约束所有合法下标的元素都大于0(正整数) s.add(ForAll(i, Implies(And(i >= 0, i < Length(seq)), Nth(seq, i) > 0)))
修改后的完整可运行代码:
from z3 import * s = Solver() # 声明整数序列 seq = Const('seq', SeqSort(IntSort())) # 声明索引用的整数变量 i = Int('i') # 约束序列长度至少为5 s.add(Length(seq) >= 5) # 约束所有合法下标的元素为正整数 s.add(ForAll(i, Implies(And(i >= 0, i < Length(seq)), Nth(seq, i) > 0))) # 求解并打印模型 if s.check() == sat: print(s.model())
运行后输出的模型中,序列的所有元素都会满足正整数的要求。
内容的提问来源于stack exchange,提问作者Egor Kolesnikov
相关产品推荐
相关产品推荐

