Can';t解释一个简单的调整如何导致;“未知”;Z3结果
我在学Z3。我正在使用一些简单的“iPrime”函数,偶然发现了一些难以理解的行为。一个看似“更简单”的内联公式,Can';t解释一个简单的调整如何导致;“未知”;Z3结果,z3,Z3,我在学Z3。我正在使用一些简单的“iPrime”函数,偶然发现了一些难以理解的行为。一个看似“更简单”的内联公式,(>q1),导致了“未知”,而一个更“复杂”的定义乐趣(宏),(isPrime q),导致了一个快速的解决方案,即使(isPrime q)包含(>q1) 量化逻辑是一种高级功能,您应该阅读Z3是如何解决这些公式的,这将使您能够从Z3中了解您的期望。以我微薄的经验,用量词解公式是一门精致的艺术。对你来说很明显的事情,对Z3来说可能不明显 Z3将尝试满足所有量词的(您将其写成不存在)。我
(>q1)
,导致了“未知”,而一个更“复杂”的定义乐趣(宏),(isPrime q)
,导致了一个快速的解决方案,即使(isPrime q)
包含(>q1)
量化逻辑是一种高级功能,您应该阅读Z3是如何解决这些公式的,这将使您能够从Z3中了解您的期望。以我微薄的经验,用量词解公式是一门精致的艺术。对你来说很明显的事情,对Z3来说可能不明显 Z3将尝试满足所有量词的
(您将其写成不存在
)。我猜Z3正在挑选一些q
和r
,然后检查isPrime
是否有效,否则它会尝试使用新的一对,以此类推。如果Z3没有做出正确的选择,它可能需要一段时间才能找到这样的q
和r
,因此您可能应该给它更多的时间(解决rise4fun上的问题需要一段时间)
另一种继续进行的方法是多帮Z3一点。例如,让它知道z
和y
小于x
。通过这种方式,您可以为这些变量提供一个下限和一个上限
(define-fun isPrime ((x Int)) Bool
(and (> x 1) (not (exists ((z Int) (y Int)) (and (< y x) (and (< z x) (and (> y 1) (> z 1) (= x (* y z)))))))))
(定义有趣的iPrime((x Int))Bool
(和(>x1)(不存在((z Int)(y Int))(和(y1)(=x(*y zщщщ))
对我有用
更新
参考资料:
Leonardo de Moura关于2012年SAT/SMT暑期学校的演讲()
Z3教程,量词()
通用Z3教程()
你用Z3做什么?解索杜库?解初等数学题。哪一个是更简单的内联公式?你能更清楚地说明这个问题吗?(iPrime q)
=>sat.(>Q1)
=>未知<代码>(>Q1)
包含在(iPrime q)
中。感谢您的回复。我是Z3的新手,我还不知道如何调试它或者读什么。你有Z3和量词公式的具体指针吗?我已经用我过去查询过的一些参考资料更新了我的答案。你还应该查看其他相关的问题/答案,例如。
(define-fun isPrime ((x Int)) Bool
(and (> x 1) (not (exists ((z Int) (y Int)) (and (< y x) (and (< z x) (and (> y 1) (> z 1) (= x (* y z)))))))))