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

时间:2018-07-13 15:12:37

标签: z3 smt

如何以一种不错的方式在Z3中用布尔向量乘以布尔布尔矩阵?矩阵和向量的大小是已知的并且是固定的。

在我的情况下,只有一个矩阵,无需将其作为参数传递或作为函数的结果返回,因此矩阵可以是全局的。

如果矩阵是方矩阵有帮助吗?

我当前的解决方案是:

; 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))
  )
)

1 个答案:

答案 0 :(得分:0)

您所做的一切都很好,特别是考虑到矩阵大小恒定且永不变的情况。 SMTLib没有循环的概念,尽管最近的版本确实允许递归定义可用于此效果的函数。有关如何使用递归的另一个不同但相关的问题,请参见以下答案:https://stackoverflow.com/a/51140049/936310。但是,我建议您坚持使用当前的代码,以简化程序并获得各种求解器的广泛支持。

在我看来,SMTLib应该真正“生成”而不是直接使用;大多数工具都以这种方式使用它。如果您的编程需求变得更加复杂,我建议您使用更高级别的界面。 Z3和其他求解器的接口几乎可以用您想到的任何语言编写。 Python和Haskell提供了真正的高级绑定,可以为您摆脱大多数样板。如果您愿意,还可以使用C / C ++ / Java的低级绑定。有关样式的比较,请参见using floating point arithmetic with Z3 C++ APIs