有可能证明这个定义的函数是z3中的对合吗?

有可能证明这个定义的函数是z3中的对合吗?,z3,smt,Z3,Smt,我试图理解如何定义一个断言,以证明已经定义的函数的某些数学性质。正如在SMT中所讨论的,解算器不太适合于归纳,而归纳通常需要证明数学性质 在我的例子中,我有一个递归函数定义,用于标识函数f(x)=x(作为一个简单的示例): 这表明,这些特征无法在开箱即用的情况下得到证明。然而,我想知道一般的数学性质是如何在z3中得到证明的。我尝试用所有量词证明函数的对合,但z3没有终止: (assert (forall ((a String)) (= a (indenti

我试图理解如何定义一个断言,以证明已经定义的函数的某些数学性质。正如在SMT中所讨论的,解算器不太适合于归纳,而归纳通常需要证明数学性质

在我的例子中,我有一个递归函数定义,用于标识函数
f(x)=x
(作为一个简单的示例):

这表明,这些特征无法在开箱即用的情况下得到证明。然而,我想知道一般的数学性质是如何在
z3
中得到证明的。我尝试用所有量词证明函数的对合,但
z3
没有终止:

(assert
(forall ((a String))
    (=
        a
        (indentity (identity a))
    )
)
我的问题:
我们可以用什么断言来证明这样一个递归函数是一个带有
z3
的对合?

这里你真的做不了多少。理想情况下,策略是分别定义和证明基本情况和归纳步骤,然后(在元级别)论证该属性对于所有字符串都是正确的

对于基本情况,事情很简单。我会定义:

(define-fun check-inv ((x String)) Bool (= (identity (identity x)) x))

(define-fun base_case () Bool (check-inv ""))
(define-fun inductive_step () Bool
   (forall ((x String) (c String))
        (implies (and (= 1 (str.len c)) (check-inv x))
                 (check-inv (str.++ c x)))))
然后:

(assert (not base_case))
如果您这样做,z3将高兴地说
unsat
,即基本情况为真。对于导入步骤,我将定义:

(define-fun check-inv ((x String)) Bool (= (identity (identity x)) x))

(define-fun base_case () Bool (check-inv ""))
(define-fun inductive_step () Bool
   (forall ((x String) (c String))
        (implies (and (= 1 (str.len c)) (check-inv x))
                 (check-inv (str.++ c x)))))
并希望证明:

(assert (not inductive_step))
唉,您会发现z3会被这个查询阻塞,即不会终止。假设有一秒钟,你会得出结论(在元层次上)
identity
确实是一个对合。但这必须在z3以上的一个级别上完成;或者由一个人,或者其他一些使用z3作为子引擎的证明工具

因此,自然的问题是问,让z3证明归纳步骤的希望是什么?它绝对不会开箱即用。但也许您可以使用模式来诱使它这样做,有关详细信息,请参阅。但是,请注意,即使您可以通过非常聪明的模式实例化获得此证明,该证明也将非常脆弱:即使对定理或z3的实际实现进行微小更改,也会影响结果,因为您将受到无数启发的摆布

长话短说:如果您的目标是证明递归函数的属性,那么您使用的工具是错误的。使用ACL2、HOL、Isabelle等。;它们是专门为处理这些定理而设计和构建的。SMT解决方案根本不符合这里的要求