Can';t解释一个简单的调整如何导致;“未知”;Z3结果

Can';t解释一个简单的调整如何导致;“未知”;Z3结果,z3,Z3,我在学Z3。我正在使用一些简单的“iPrime”函数,偶然发现了一些难以理解的行为。一个看似“更简单”的内联公式,(>q1),导致了“未知”,而一个更“复杂”的定义乐趣(宏),(isPrime q),导致了一个快速的解决方案,即使(isPrime q)包含(>q1) 量化逻辑是一种高级功能,您应该阅读Z3是如何解决这些公式的,这将使您能够从Z3中了解您的期望。以我微薄的经验,用量词解公式是一门精致的艺术。对你来说很明显的事情,对Z3来说可能不明显 Z3将尝试满足所有量词的(您将其写成不存在)。我

我在学Z3。我正在使用一些简单的“iPrime”函数,偶然发现了一些难以理解的行为。一个看似“更简单”的内联公式,
(>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)))))))))