在z3中交叉产品

时间:2012-05-17 19:51:34

标签: z3

z3是否为两个列表提供了交叉产品功能?如果不是可以在不使用更高阶函数或使用提供的列表函数的情况下定义一个?我一直在努力定义一个。我知道如何使用map定义一个,但我认为z3不支持。

2 个答案:

答案 0 :(得分:1)

您可以在SMT 2.0中声明交叉产品功能。 但是,任何非平凡的财产都需要通过入职证明。 Z3目前不支持感应证明。因此,它只能证明非常简单的事实。 顺便说一句,通过列表的交叉产品,我假设您想要一个给定列表[a, b][c, d]的函数返回列表或对[(a, c), (a, d), (b, c), (b, d)]。 这是一个定义product函数的脚本。 该脚本还演示了SMT 2.0语言的一些限制。例如,SMT 2.0不支持参数公理或函数的定义。所以,我使用未解释的排序来“模拟”那个。我还必须定义辅助函数appendproduct-aux。您可以在以下网址尝试此示例:http://rise4fun.com/Z3/QahiP

该示例还证明了以下微不足道的事实:如果l = product([a], [b]),则first(head(l))必须为a

如果您有兴趣证明非平凡的财产。我看到两个选择。我们可以尝试使用Z3来证明基本情况和归纳案例。这种方法的主要缺点是我们必须手动创建这些案例,并且可以犯错误。另一种选择是使用交互式定理证明器,例如Isabelle。顺便说一下,Isabelle有更丰富的输入语言,并提供了调用Z3的策略。

有关Z3中代数数据类型的更多信息,请转到在线教程http://rise4fun.com/Z3/tutorial/guide(部分数据类型)。

;; List is a builtin datatype in Z3
;; It has the constructors insert and nil

;; Declaring Pair type using algebraic datatypes
(declare-datatypes (T1 T2) ((Pair (mk-pair (first T1) (second T2)))))

;; SMT 2.0 does not support parametric function definitions.
;; So, I'm using two uninterpreted sorts.
(declare-sort T1)
(declare-sort T2)
;; Remark: We can "instantiate" these sorts to interpreted sorts (Int, Real) by replacing the declarations above
;; with the definitions
;; (define-sort T1 () Int)
;; (define-sort T2 () Real)

(declare-fun append ((List (Pair T1 T2)) (List (Pair T1 T2))) (List (Pair T1 T2)))
;; Remark: I'm using (as nil (Pair T1 T2)) because nil is overloaded. So, I must tell which one I want.
(assert (forall ((l (List (Pair T1 T2)))) 
                (= (append (as nil (List (Pair T1 T2))) l) l)))
(assert (forall ((h (Pair T1 T2)) (t (List (Pair T1 T2))) (l (List (Pair T1 T2))))
                (= (append (insert h t) l) (insert h (append t l)))))

;; Auxiliary definition
;; Given [a, b, c], d  returns [(a, d), (b, d), (c, d)] 
(declare-fun product-aux ((List T1) T2) (List (Pair T1 T2)))
(assert (forall ((v T2))
                (= (product-aux (as nil (List T1)) v)
                   (as nil (List (Pair T1 T2))))))
(assert (forall ((h T1) (t (List T1)) (v T2))
                (= (product-aux (insert h t) v)
                   (insert (mk-pair h v) (product-aux t v)))))

(declare-fun product ((List T1) (List T2)) (List (Pair T1 T2)))

(assert (forall ((l (List T1)))
                (= (product l (as nil (List T2))) (as nil (List (Pair T1 T2))))))

(assert (forall ((l (List T1)) (h T2) (t (List T2)))
                (= (product l (insert h t))
                   (append (product-aux l h) (product l t)))))

(declare-const a T1)
(declare-const b T2)
(declare-const l (List (Pair T1 T2)))

(assert (= (product (insert a (as nil (List T1))) (insert b (as nil (List T2))))
           l))

(assert (not (= (first (head l)) a)))

(check-sat)

答案 1 :(得分:0)

smt-lib格式没有#include指令。 Z3提供了其他几种提供输入的方法。 Python输入格式利用了所有Python,因此自然支持导入文件。 在http://rise4fun.com/z3py

上有一个关于Z3Py的教程