我在求解器中使用函数来模拟离散时间。问题是,现在我们使用像z3.Function('f', IntSort(), IntSort())
这样的函数,函数的负输入值在这里真的不适用,因为时间从t = 0开始。当我想要证明事情时,这会导致问题,因为解算器找到了根本不应该考虑的负时间解决方案。
所以我的问题是:z3中是否存在某种unsigned int sort(UnsignedIntSort
)?
答案 0 :(得分:0)
正如评论中指出的那样,没有这种情况;你最好的办法就是确保所有用途都有t >= 0
个断言。
请注意,这在实践中实际上比较棘手。不仅你需要为你所有的"新鲜"做出这个断言。变量,但也可以在使用此类变量进行任何算术时确保结果保留在域内。也就是说,如果您计算t-1
,那么您希望t >= 1
作为断言出现,假设该表达式的结果本身用作时间值。
这可能非常简单,因此有一个机制("重载算术")可以简化生活。但是,当然,这取决于您对约束的编程方式,无论您是使用SMT-Lib,还是通过更高级别的语言使用其中一种API。
答案 1 :(得分:0)
SMT或Z3中没有无符号排序,因为位向量通常可用于此目的。位向量本身既不是无符号也不是有符号,但它们是位串。然后在单独的函数中实现有符号和无符号语义,即,对于位向量没有通用的小于运算符,但对于无符号和有符号的小于,有bvult
和bvslt
。因此,只要您坚持所有BV函数的无符号风格,您将始终保留无符号语义。
此外,在模型中,位向量通常作为位串(二进制或十六进制)提供,即没有负值。就你的应用而言,在你开始使用*s*
函数之前,你总是可以假设所有的位向量都是无符号的。