math - 在 z3 中定义一个庞大但已知的函数
问题描述
我想用 z3 来解决纯数学中的可满足性问题。求解器必须推理 sort 函数Function('mult', BitVecSort(8), BitVecSort(8), BitVecSort(8), BitVecSort(8), BitVecSort(8), BitVecSort(8), BitVecSort(8))
。这个函数已经是完全已知的,所以理论上我们可以通过输入表单的所有约束来定义它
mult(0, 26, 1, 0, 78, 1) == 1,
mult(11, 5, 1, 149, 9, 2) == 4,
mult(23, 8, 1, 116, 11, 1) == 10, ...
但由于需要大量的约束,这是不可行的。
但是,只有 125,501 个输出值非常难以计算,而其他所有值一旦知道就很容易计算。我可以在 z3 中输入所有 125,501 个约束,求解器会在几分钟内构建模型(我使用了Tactic('bv').solver()
)。
有一些通用语句适用于mult
,例如
ForAll([s1,s2,f1,f2,v1,v2], mult(s1,f1,v1,s2,f2,v2) == mult(s2,f2,v2,s1,f1,v1))
,但已经添加此约束需要花费不合理的长时间来检查(它现在已经运行了超过 24 小时)。
有没有更简单的方法可以在 z3 中导入我的函数?对于 z3 来说,它是否太大而无法有效地推理它?
解决方案
推荐阅读
- spring-security - 如何使用第三方响应在 Spring Security 中验证非 jwt 令牌
- android - 使用 Braintree 集成 Google Pay
- php - Symfony2.8:choices_as_values 不起作用
- windows-installer - ExecWait 未在第二部分执行
- single-sign-on - Nextcloud 单点注销不适用于 Keycloak
- sql - 案例语句错误无法使用语句添加列值
- python - 在python中实现将死
- ios - 发现异常方法未找到:iOS 上的 Microsoft.AspNetCore.Http.Connections.NegotiationResponse
- bash - 如何使用 bash 和 grep 从时间函数解析时间?
- c# - 无效的表达式术语“长”