Z3 使用多个字段访问排序的元素
我在使用SMTlib2格式的排序时遇到一些问题。例如,我将间隔定义为: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作为字段获取程
(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)