Arrays Z3带阵列的Forall

Arrays Z3带阵列的Forall,arrays,z3,quantifiers,Arrays,Z3,Quantifiers,Z3为简单问题提供了未知信息: (assert (forall ((y (Array Int Int))) (= (select y 1) 0)) ) (check-sat) 我发现,如果否定forall,它就变成sat,但这似乎是一件特别简单的事情,无法解决 这会引起问题,因为我想解决的问题更像 (declare-fun u () Int) (assert (forall ((y (Array Int Int)) ) (=> (= u 0) (&l

Z3为简单问题提供了未知信息:

(assert
(forall ((y (Array Int Int)))
   (= (select y 1) 0))
 )
(check-sat)
我发现,如果否定forall,它就变成sat,但这似乎是一件特别简单的事情,无法解决

这会引起问题,因为我想解决的问题更像

(declare-fun u () Int)
(assert
 (forall ((y (Array Int Int)) )
     (=> 
        (= u 0) (<= (select y 1) 0))
 )
)
(check-sat)

在这里,仅仅否定forall不是同一个问题,所以在这里不能这样做。有什么方法可以向Z3提出这种类型的问题以获得un/sat结果吗?

量词的问题在SMT解算器中总是有问题的,特别是当它们涉及数组和交替量词时,如您的示例中所示。你基本上是有出口的。好几天。浦,y。Z3或任何其他SMT解决方案都很难处理此类问题

当你有一个量化的断言,就像你有forall在顶层或者嵌套在exists中一样,逻辑变成半可判定的。Z3使用基于MBQI模型的量词实例化来试探性地解决此类问题,但它往往无法做到这一点。问题不仅仅在于z3没有能力:对于这样的问题,没有决策程序,而且z3尽了最大的努力

你可以尝试为这些问题提供量词模式来帮助z3,但我看不到一个简单的方法来将其应用到你的问题中。当您有未解释的函数和量化的公理时,量词模式适用。看见所以,我认为这对你不起作用。即使是这样,模式对编程来说也是非常挑剔的,并且对于规范中可能看起来无害的更改来说也不是健壮的


如果您正在处理此类量词,SMT解算器可能并不适合。研究半自动定理证明程序,如Lean、Isabelle、Coq等,这些程序旨在以更严格的方式处理量词。当然,您会失去完全自动化,但这些工具中的大多数都可以使用SMT解算器来实现足够简单的子目标。这样,您仍然可以手动完成繁重的工作,但大多数子目标都是由z3自动处理的。特别是在精益的情况下,请参见此处:

量词的问题在SMT解算器中总是有问题的,特别是如果它们涉及数组和交替量词,如您的示例中所示。你基本上是有出口的。好几天。浦,y。Z3或任何其他SMT解决方案都很难处理此类问题

当你有一个量化的断言,就像你有forall在顶层或者嵌套在exists中一样,逻辑变成半可判定的。Z3使用基于MBQI模型的量词实例化来试探性地解决此类问题,但它往往无法做到这一点。问题不仅仅在于z3没有能力:对于这样的问题,没有决策程序,而且z3尽了最大的努力

你可以尝试为这些问题提供量词模式来帮助z3,但我看不到一个简单的方法来将其应用到你的问题中。当您有未解释的函数和量化的公理时,量词模式适用。看见所以,我认为这对你不起作用。即使是这样,模式对编程来说也是非常挑剔的,并且对于规范中可能看起来无害的更改来说也不是健壮的


如果您正在处理此类量词,SMT解算器可能并不适合。研究半自动定理证明程序,如Lean、Isabelle、Coq等,这些程序旨在以更严格的方式处理量词。当然,您会失去完全自动化,但这些工具中的大多数都可以使用SMT解算器来实现足够简单的子目标。这样,您仍然可以手动完成繁重的工作,但大多数子目标都是由z3自动处理的。特别是在精益的情况下,请参见此处:

有一个额外的右括号,需要删除。另外,在forall语句之前添加assert

(assert ( forall ( (y (Array Int Int) ) ) 
   (= (select y 1) 0) 
))
(check-sat)
运行上面的代码,您应该得到unsat作为答案


对于第二个程序,alias的答案可能对您有用。

还有一个右括号,需要删除。另外,在forall语句之前添加assert

(assert ( forall ( (y (Array Int Int) ) ) 
   (= (select y 1) 0) 
))
(check-sat)
运行上面的代码,您应该得到unsat作为答案


对于第二个程序,alias的答案可能对您有用。

来自在线解算器,结果未知。我在终端上运行了它。我不知道,为什么它会在它的网站上显示-未知。不管怎样,在你的问题中有一个额外的右括号,需要删除。从在线解算器,结果未知。我在终端上运行了它。我不知道,为什么它会在它的网站上显示-未知。不管怎样,在你的问题中有一个额外的右括号,需要删除。