我有一个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)
...
答案 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)))
(但是尝试将注入宏放入一阶函数声明中是很痛苦的。)