Z3 中的布尔矩阵乘以向量乘法

Boolean matrix times vector multiplication in Z3

如何在Z3中用一个布尔向量乘以一个可变的布尔矩阵?矩阵和向量的大小已知且固定。

在我的例子中只有一个矩阵,不需要将它作为参数传递或 return 它作为函数的结果传递,因此矩阵可以是全局的。

矩阵是方阵有用吗?

我目前的解决方案是:

; Maybe some other matrix representation would be better?
(declare-datatypes () ((ColumnIndex c0 c1 c2)))
(declare-fun column (ColumnIndex) (_ BitVec 4))

(define-fun scalarTimesVector ((a (_ BitVec 1)) (v (_ BitVec 4))) (_ BitVec 4)
  (ite (= a #b1) v (_ bv0 4))
)

(define-fun matrixTimesVector ((vector (_ BitVec 3))) (_ BitVec 4)
  (bvor
    (scalarTimesVector ((_ extract 0 0) vector) (column c0))
    (scalarTimesVector ((_ extract 1 1) vector) (column c1))
    (scalarTimesVector ((_ extract 2 2) vector) (column c2))
  )
)

你所做的很好,特别是考虑到你的矩阵大小是恒定的并且永远不会改变。 SMTLib 没有循环的概念,尽管最近的版本允许递归定义可用于此效果的函数。有关如何使用递归的不同但相关的问题,请参阅此答案:。但是,我建议坚持使用您当前的代码,以简化操作并获得各种求解器的更广泛支持。

在我看来,SMTLib 真的应该"generated" 而不是直接使用;大多数工具都是这样使用的。如果您的编程需求变得更加复杂,我建议您改用更高级别的接口。 Z3 和其他解算器的接口几乎来自您能想到的任何语言。 Python 和 Haskell 提供真正高级的绑定,可以为您摆脱大部分样板文件。如果您愿意,您还可以从 C/C++/Java 获得低级绑定。有关样式的比较,请参阅