使用相同数量的参数排序和返回排序来减少函数声明

时间:2014-05-26 13:20:55

标签: z3 smt

我有一个smt程序,需要声明具有相同数量的参数(和排序)和相同返回排序的多个函数。 例如:

(declare-fun main0 (Bool Bool Bool Bool Bool Bool Bool) Bool)
(declare-fun main1 (Bool Bool Bool Bool Bool Bool Bool) Bool)
(declare-fun main2 (Bool Bool Bool Bool Bool Bool Bool) Bool)
(declare-fun main3 (Bool Bool Bool Bool Bool Bool Bool) Bool)
...

有没有办法减少声明,以便我可以对这些功能进行排序'参数(例如正文))和我需要定义的所有东西都是:

(declare-fun main0 (body) Bool)
(declare-fun main1 (body) Bool)
(declare-fun main2 (body) Bool)
(declare-fun main3 (body) Bool)
...

2 个答案:

答案 0 :(得分:1)

这对你有用吗?

(declare-sort MySort 7)
(define-sort Body (Bool) (MySort Bool Bool Bool Bool Bool Bool Bool))

(declare-fun main0 (Body (Bool)) Bool)
(declare-fun main1 (Body (Bool)) Bool)
(declare-fun main2 (Body (Bool)) Bool)
(declare-fun main3 (Body (Bool)) Bool)

如果你的所有参数都是Bool,你可以考虑使用位向量:

(declare-fun main0 (_ BitVec 7) Bool)
(declare-fun main1 (_ BitVec 7) Bool)
(declare-fun main2 (_ BitVec 7) Bool)
(declare-fun main3 (_ BitVec 7) Bool)

答案 1 :(得分:1)

您可以使用数据类型理论来生成8元组。

(declare-datatypes () ((BodyTuple (mk8 (a1 Bool) (a2 Bool) (a3 Bool) (a4 Bool) (a5 Bool) (a6 Bool) (a7 Bool) (a8 Bool) ))))
(declare-fun main0 (BodyTuple) Bool)

这确实需要通过构造函数mk8进行应用程序。

(assert (main0 (mk8 true true true true true true true true)))

(但是尝试将注入宏放入一阶函数声明中是很痛苦的。)