我有以下两种相互递归的类型(它们的指针彼此指向):
vtypedef SimpleTextOutputInterface =
@{ reset = EfiTextReset
, output_string = [l:addr] (EfiTextString@l | ptr l)
}
vtypedef EfiTextString = [n:nat][l1,l2:addr] (SimpleTextOutputInterface@l1, @[uint16][n]@l2 | ptr l1, ptr l2) -> uint64
我试图声明一个抽象类型,像这样:
absvt@ype SimpleTextOutputInterface
vtypedef EfiTextString = [n:nat][l1,l2:addr] (SimpleTextOutputInterface@l1, @[uint16][n]@l2 | ptr l1, ptr l2) -> uint64
assume SimpleTextOutputInterface =
@{ reset = EfiTextReset
, output_string = [l:addr] (EfiTextString@l | ptr l)
}
但是当我尝试使用它们时会遇到类型错误(好像在某个地方看不见了)。
有没有办法使这项工作有效? 如果在ATS中存在,则可能带有前向声明?
答案 0 :(得分:1)
我的“标准”方法是引入虚拟对象和一些相关的证明函数:
abst@ype SimpleTextOutputInterface_
prfun encode :
{l:addr} SimpleTextOutputInterface @l -> SimpleTextOutputInterface_@l
prfun decode :
{l:addr} SimpleTextOutputInterface_@l -> SimpleTextOutputInterface @l