Z3 如何声明记录,使其中一个字段是函数

Z3 如何声明记录,使其中一个字段是函数,z3,Z3,我对Z3很陌生,很抱歉问了一些愚蠢的问题 我试图定义一个记录,使它的一些字段是函数。我试过这个: (声明数据类型(domran)((PFun(mkpfun)(DOM(DOM)Bool)(law(DOM)RAN‘‘)’) 其意图是dom和ran是两个类型为函数的字段(dom是从dom到Bool的函数,而law是从dom到ran的函数)。我还尝试将函数类型括在括号中: (declaredatatypes(domran)((PFun(mkpfun)(DOM((DOM)Bool))(law((DOM)R

我对Z3很陌生,很抱歉问了一些愚蠢的问题

我试图定义一个记录,使它的一些字段是函数。我试过这个:

(声明数据类型(domran)((PFun(mkpfun)(DOM(DOM)Bool)(law(DOM)RAN‘‘)’)

其意图是dom和ran是两个类型为函数的字段(dom是从dom到Bool的函数,而law是从dom到ran的函数)。我还尝试将函数类型括在括号中:

(declaredatatypes(domran)((PFun(mkpfun)(DOM((DOM)Bool))(law((DOM)RAN()())))

这些都不行

我搜索了教程,但没有这方面的例子

你能帮我吗

提前谢谢你的回答

祝你一切顺利,
Maxi基于一阶逻辑。因此,函数不能是数据类型构造函数或其他函数的参数。 也就是说,您可以使用数组“模拟”高阶功能。 您可以将数据类型写为

  (declare-datatypes (DOM RAN) ((PFun (mk-pfun (dom (Array DOM Bool)) 
                                               (law (Array DOM RAN))))))
p
成为
PFun
d
一个排序常数
DOM
,然后您编写
(选择(domp)d)
以获得
DOM(p)(d)
(选择(法则p)d)以获得
法则(p)(d)