z3中的叉积

z3中的叉积,z3,Z3,z3是否为两个列表提供了跨积功能?如果没有,是否可以在不使用高阶函数或提供的列表函数的情况下定义一个?我一直很难定义一个。我知道如何使用map定义一个函数,但我认为z3不支持它。您可以在SMT2.0中声明跨积函数。 然而,任何非平凡属性都需要归纳证明。Z3目前不支持归纳法证明。因此,它只能证明非常简单的事实。 顺便说一句,通过列表的叉积,我假设您想要一个函数,给定列表[a,b]和[c,d]返回列表或对[(a,c)、(a,d)、(b,c)、(b,d)]。 下面是定义产品函数的脚本。 该脚本还演示了

z3是否为两个列表提供了跨积功能?如果没有,是否可以在不使用高阶函数或提供的列表函数的情况下定义一个?我一直很难定义一个。我知道如何使用map定义一个函数,但我认为z3不支持它。

您可以在SMT2.0中声明跨积函数。 然而,任何非平凡属性都需要归纳证明。Z3目前不支持归纳法证明。因此,它只能证明非常简单的事实。 顺便说一句,通过列表的叉积,我假设您想要一个函数,给定列表
[a,b]
[c,d]
返回列表或对
[(a,c)、(a,d)、(b,c)、(b,d)]
。 下面是定义
产品
函数的脚本。 该脚本还演示了SMT2.0语言的一些限制。例如,SMT 2.0不支持参数公理或函数的定义。所以,我使用了不奇怪的排序来“模拟”它。我还必须定义辅助功能
append
product aux
。您可以在以下位置在线尝试此示例:

该示例还证明了以下一个微不足道的事实:如果
l=product([a],[b])
,那么
第一个(head(l))
必须是
a

如果你在证明非平凡的属性方面有天赋。我看到两种选择。我们可以尝试用Z3证明基本情况和归纳情况。这种方法的主要缺点是我们必须手动创建这些案例,并且可能会出错。另一种选择是使用交互式定理证明器,例如。顺便说一句,Isabelle有更丰富的输入语言,并提供了调用Z3的策略

有关Z3中代数数据类型的更多信息,请转到联机教程(数据类型部分)


您可以在SMT2.0中声明跨积函数。 然而,任何非平凡属性都需要归纳证明。Z3目前不支持归纳法证明。因此,它只能证明非常简单的事实。 顺便说一句,通过列表的叉积,我假设您想要一个函数,给定列表
[a,b]
[c,d]
返回列表或对
[(a,c)、(a,d)、(b,c)、(b,d)]
。 下面是定义
产品
函数的脚本。 该脚本还演示了SMT2.0语言的一些限制。例如,SMT 2.0不支持参数公理或函数的定义。所以,我使用了不奇怪的排序来“模拟”它。我还必须定义辅助功能
append
product aux
。您可以在以下位置在线尝试此示例:

该示例还证明了以下一个微不足道的事实:如果
l=product([a],[b])
,那么
第一个(head(l))
必须是
a

如果你在证明非平凡的属性方面有天赋。我看到两种选择。我们可以尝试用Z3证明基本情况和归纳情况。这种方法的主要缺点是我们必须手动创建这些案例,并且可能会出错。另一种选择是使用交互式定理证明器,例如。顺便说一句,Isabelle有更丰富的输入语言,并提供了调用Z3的策略

有关Z3中代数数据类型的更多信息,请转到联机教程(数据类型部分)

smt库格式没有#include指令。 Z3提供了其他几种提供输入的方法。 Python输入格式利用了所有Python,因此自然支持导入文件。 有一个关于Z3Py的教程,关于smt库格式没有include指令。 Z3提供了其他几种提供输入的方法。 Python输入格式利用了所有Python,因此自然支持导入文件。
上有一个关于Z3Py的教程

谢谢!顺便说一句,z3中是否有类似于“#include”的东西,这样我就不需要一遍又一遍地复制和粘贴同一个脚本了?您可以使用
type
(windows)或
cat
(OSX和Linux)连接文件,并将结果发送到z3。示例:
键入file1.smt2 file2.smt22>num | z3-in-smt2
。指令告诉Z3从标准输入读取SMT2文件。在OSX和Linux上,您可以使用:
cat file1.SMT2 file2.SMT2 | Z3-in-SMT2
。谢谢!顺便说一句,z3中是否有类似于“#include”的东西,这样我就不需要一遍又一遍地复制和粘贴同一个脚本了?您可以使用
type
(windows)或
cat
(OSX和Linux)连接文件,并将结果发送到z3。示例:
键入file1.smt2 file2.smt22>num | z3-in-smt2
。指令告诉Z3从标准输入读取SMT2文件。在OSX和Linux上,可以使用:
cat file1.SMT2 file2.SMT2 | Z3-in-SMT2
;; 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)