如何以一种不错的方式在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))
)
)
答案 0 :(得分:0)
您所做的一切都很好,特别是考虑到矩阵大小恒定且永不变的情况。 SMTLib没有循环的概念,尽管最近的版本确实允许递归定义可用于此效果的函数。有关如何使用递归的另一个不同但相关的问题,请参见以下答案:https://stackoverflow.com/a/51140049/936310。但是,我建议您坚持使用当前的代码,以简化程序并获得各种求解器的广泛支持。
在我看来,SMTLib应该真正“生成”而不是直接使用;大多数工具都以这种方式使用它。如果您的编程需求变得更加复杂,我建议您使用更高级别的界面。 Z3和其他求解器的接口几乎可以用您想到的任何语言编写。 Python和Haskell提供了真正的高级绑定,可以为您摆脱大多数样板。如果您愿意,还可以使用C / C ++ / Java的低级绑定。有关样式的比较,请参见using floating point arithmetic with Z3 C++ APIs。