我在使用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)
谢谢, 努诺
答案 0 :(得分:0)
你应该研究Record subsection, Datatypes section in Z3 SMT guide。基本上,您可以使用构造函数mk-pair
创建一个记录类型,并使用两个选择器first
和second
来访问其字段。
以下是 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)