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

时间:2012-11-21 10:14:11

标签: z3 smt

我在使用SMTlib2格式的排序时遇到了一些麻烦。例如,我将Interval定义为:

(declare-sort Pair 2)
(define-sort Interval () (Pair Int Int))

现在如何从函数返回新的Interval? e.g:

(define-fun getInterval ((a Int) (b Int)) Interval
  (Interval a b))

这不起作用。 我的问题是:如何构造和实例化给定类型的对象,以及如何访问其字段?

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

(declare-fun L (Interval) Int)
(declare-fun H (Interval) Int)

谢谢, 努诺

1 个答案:

答案 0 :(得分:0)

你应该研究Record subsection, Datatypes section in Z3 SMT guide。基本上,您可以使用构造函数mk-pair创建一个记录类型,并使用两个选择器firstsecond来访问其字段。

以下是 rise4fun link

的示例
(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)