Logic 伯尼·肖恩克尔的公式到底是什么?

Logic 伯尼·肖恩克尔的公式到底是什么?,logic,z3,smt,Logic,Z3,Smt,我有一个简单的建议。我想断言,严格排序的整数列表中的第一个元素是列表中所有元素的最小值。我定义排序列表的方法是定义一个局部不变量,即每个元素都小于它的下一个元素。我在Z3中用以下方式表述了我的命题- (设置选项:mbqi true) (设置选项:model compact true) (声明乐趣S(Int)Bool) (声明有趣的程序(Int)Bool) (声明乐趣发生在(Int)Bool之前) ;; 进动是反反射的 (assert(forall((x Int))(=>(sx)(not(pre

我有一个简单的建议。我想断言,严格排序的整数列表中的第一个元素是列表中所有元素的最小值。我定义排序列表的方法是定义一个局部不变量,即每个元素都小于它的下一个元素。我在Z3中用以下方式表述了我的命题-


(设置选项:mbqi true)
(设置选项:model compact true)
(声明乐趣S(Int)Bool)
(声明有趣的程序(Int)Bool)
(声明乐趣发生在(Int)Bool之前)
;; 进动是反反射的
(assert(forall((x Int))(=>(sx)(not(preceds x x‘‘‘)))
;; 进动是单调的
(断言(对于所有((x Int)(y Int))(=>(和(sx)(和(sy)(和(前面的xy)))
(不是(前面的y x(()())))
;; 进动是一个函数
(断言(对于所有((x Int)(y Int)(z Int))(=>(和(S x)(和(S y)(和(S z))和(之前的x y)
(前x z()()))
(=y z)))
;; 过程导致局部秩序
(断言(对于所有((x Int)(y Int))(=>(和(S x)(和(S y)(前面的x y)))
((和(和(S x)(S y))(前面的x y))
(发生在x和y之前)))
;;在转换之前发生
(断言(对于所有((x Int)(y Int)(z Int))
(=>(和(sx)(和(sy)(和(sz)(和(发生在xy之前)(发生在yzЮ)'))
(发生在x z之前)
))             
(声明常数h Int)
(S(sh))
(assert(forall((x Int))(=>(sx)(出现在hx之前)))
(assert(forall((y Int))(=>(sy)(

首先,我想知道什么样的公式是有效命题的。我的断言能被归类为有效的命题吗? 第二,我上面的公式正确吗?
第三,我应该在Z3中设置哪些选项,使其仅在有效命题的情况下才接受量化公式?

我们说,当公式仅包含谓词、常量、通用量词且不使用理论(例如算术)时,它就位于有效命题片段中。很常见的一种替代定义是,公式有一个
Exists*Forall*
量词前缀,并且只使用谓词。这些定义是等价的,因为存在量词可以使用新的未解释常量来消除。有关更多信息,请参阅

您的断言不在有效的命题片段中,因为您使用算术。Z3可以决定其他片段。有一个可以由Z3决定的片段列表。 您的断言不在列出的任何片段中,但Z3应该能够处理它们和其他类似的断言,而不会出现问题

关于断言的正确性,以下两个断言不能满足

(assert (S h))
(assert (forall ((y Int)) (=> (S y) (< h y))))
最后,Z3没有任何用于检查公式是否在有效命题片段中的命令行

(assert (S h))
(assert (forall ((y Int)) (=> (S y) (< h y))))