Z3 使用多个字段访问排序的元素

Z3 使用多个字段访问排序的元素,z3,smt,Z3,Smt,我在使用SMTlib2格式的排序时遇到一些问题。例如,我将间隔定义为: (declare-sort Pair 2) (define-sort Interval () (Pair Int Int)) 现在如何从函数返回新的间隔?e、 g: (define-fun getInterval ((a Int) (b Int)) Interval (Interval a b)) 这不管用。 我的问题是:如何构造和实例化给定种类的对象,以及如何访问它们的字段 现在我使用我创建的2个UF作为字段获取程

我在使用SMTlib2格式的排序时遇到一些问题。例如,我将间隔定义为:

(declare-sort Pair 2)
(define-sort Interval () (Pair Int Int))
现在如何从函数返回新的间隔?e、 g:

(define-fun getInterval ((a Int) (b Int)) Interval
  (Interval a b))
这不管用。 我的问题是:如何构造和实例化给定种类的对象,以及如何访问它们的字段

现在我使用我创建的2个UF作为字段获取程序,但我仍然不知道如何使用构造函数:

(declare-fun L (Interval) Int)
(declare-fun H (Interval) Int)
谢谢, 努诺

你应该调查一下。基本上,您可以使用构造函数
mk pair
和两个选择器
first
second
来创建记录类型,以访问其字段

以下是一个例子:


谢谢我仍然想知道由多个“子排序”组成的排序有什么用处。这是一个很好的观点。我同意你的看法,从用户的角度来看,它们基本上是无用的。Z3支持它们,因为它们是SMT-LIB 2.0标准的一部分。但是,它们对于指定背景理论的语义很有用(请参见)。但是,您的观点仍然有效,因为
par
结构只能用于背景理论的定义,SMT2.0用户不能使用。
(set-option :macro-finder true)

(declare-datatypes (T1 T2) ((Pair (mk-pair (first T1) (second T2)))))

(define-sort Interval () (Pair Int Int))
(define-fun getInterval ((a Int) (b Int)) Interval
  (mk-pair a b))

(declare-const p1 Interval)
(declare-const p2 Interval)

;construct objects of a give sort
(assert (= p1 (getInterval 2 2)))

;accessing their fields
(assert (= (first p1) (second p2)))

(check-sat)
(get-model)