0

例如,

$ z3 -in
(declare-fun f (Int Real) Int)
(assert (= f f))
(check-sat)
sat

还行吧。

但是,我想通过as?

$ z3 -in
(declare-fun f (Int Real) Int)
(assert (= (as f ???) (as f ???)))
(check-sat)
sat

我应该填写???什么?

它必须是一种排序,但我应该使用哪种排序?

我试过((Int Real) Int)or (-> (Int Real) Int)or (_ (Int Real) Int),但没有一个是正确的。

是否可以在 smtlib 中声明函数排序?

如果无法声明函数排序,如何f在下面的程序中消歧:

$ z3 -in
(declare-fun f (Int Real) Real)
(declare-fun f (Int Bool) Real)
(assert (= f f))
(error "line 3 column 11: ambiguous constant reference, more than one constant with the same sort, use a qualified expression (as <symbol> <sort>) to disambigua
te f")

请注意,如果我不使用函数,那没问题:

$ z3 -in
(declare-fun f () Int)
(assert (= (as f Int) (as f Int)))
(check-sat)
sat

谢谢。

4

1 回答 1

1

注释

(as f Int)

是正确的,即使(如您所见)非常令人困惑。此注释不一定意味着fis Int。相反,它意味着f结果是Int,所以它也可以是一个函数。

这确实很令人困惑,但它遵循标准http://smtlib.cs.uiowa.edu/papers/smt-lib-reference-v2.6-r2021-05-12.pdf,第 27 页:

回想一下,每个函数符号 f 都分别与一个或多个等级相关联,每个等级都指定 f 的参数和结果的种类。为了简化排序检查,术语中的函数符号可以用其结果排序 σ 之一进行注释。这种带注释的函数符号是形式的限定标识符(如 f σ)。

如上所示,(as f σ)类型σ结果类型f

另请注意,求解器对这些注释的支持相当不一致。有关此问题的先前讨论,请参阅https://github.com/Z3Prover/z3/issues/2135

于 2021-09-29T14:48:52.940 回答