声明相互递归的类型

时间:2019-04-02 13:06:48

标签: ats

我有以下两种相互递归的类型(它们的指针彼此指向):

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中存在,则可能带有前向声明?

1 个答案:

答案 0 :(得分:1)

我的“标准”方法是引入虚拟对象和一些相关的证明函数:

abst@ype SimpleTextOutputInterface_

prfun encode :
{l:addr} SimpleTextOutputInterface @l -> SimpleTextOutputInterface_@l
prfun decode :
{l:addr} SimpleTextOutputInterface_@l -> SimpleTextOutputInterface @l