c - 我将如何在 Z3-PY 中实现 C 位运算符?
问题描述
我希望能够对我Solver
的 s 实施以下规则,其中 '^' 和 '&' 运算符是 C 中的 'or' 和 'and'input_list
是 100 个元素IntVector
:
s.add(
((input_list[6] ^ input_list[10]) & 0xF) +
((input_list[3] + input_list[5] - 25) ^ (3*input_list[99])) == 73)
运行此代码会出现类型错误:
TypeError: unsupported operand type(s) for ^: 'ArithRef' and 'ArithRef'
用 Z3 的布尔运算符替换 '^' 和 '&' 如下:
s.add(
(And(Or(input_list[6],input_list[10]),0xF) +
Or((input_list[3] + input_list[5] - 25), (3*input_list[99]))) == 73)
给出这个错误:
z3.z3types.Z3Exception: b'Sort mismatch at argument #1 for function (declare-fun or (Bool Bool) Bool) supplied sort is Int'
如何将此操作表示为 z3 求解器的规则?
解决方案
这里的问题是Int
SMTLib(和 z3)中的类型是一个成熟的数学整数。它没有任何“位”,也不受任何方式的限制。也就是说,它不是您可以进行按位运算的东西。您还没有给出实际的完全可执行代码,但这里有一个更简单的示例来说明您遇到的错误:
from z3 import *
x, y = Ints('x y')
s = Solver()
s.add(x ^ y == 0)
print(s.check())
print(s.model())
对于上面的代码,我得到:
Traceback (most recent call last):
File "a.py", line 6, in <module>
s.add(x ^ y == 0)
TypeError: unsupported operand type(s) for ^: 'ArithRef' and 'ArithRef'
(列表或向量等与这个问题无关;所以我省略了这些。)
在 C 中,当你使用int
类型时,它实际上是指机器整数,即它具有固定宽度。大多数机器上通常为 64 位,但这取决于您使用的体系结构。因此,要在 z3 中执行相同的操作,您必须使用所谓的位向量并准确指定您希望这些位向量的宽度。
下面是相同的代码,但这次使用的是 32 位机器算法:
from z3 import *
x, y = BitVecs('x y', 32)
s = Solver()
s.add(x ^ y == 0)
print(s.check())
print(s.model())
现在我得到:
sat
[y = 0, x = 0]
您可以在此处阅读有关 z3 中位精确算术的更多信息:https ://ericpony.github.io/z3py-tutorial/guide-examples.htm
推荐阅读
- javascript - TypeError 不能将序列乘以“str”类型的非整数(Python、Django、Bootstrap)
- multithreading - 无锁编程比自旋锁有什么优势?
- database - 在 MariaDB 中执行增量查询需要很长时间
- reactjs - 自定义钩子返回的组件在 JSX 中调用时触发 ts 错误
- python - Selenium 无法通过 xpath 或类找到元素
- batch-file - 如何使用批处理脚本将最后一个文件夹名称排在第二位?
- java - 如何通过Bundle放置上下文
- r - 将因子转换为 R 中箱线图的日期不成功,将“st”“nd”“rd”“th”添加到日期
- ruby - Ruby Heapsort: `sink': undefined method `>' for nil:NilClass
- python - 如何使用 matplotlib 将四个图形显示为一个 png 文件?如何避免在第一个之后创建的条上出现不同的颜色?