TRecS(递归方案的类型):高阶递归方案的基于类型的模型检查器

TRecS是高阶递归方案的模型检查器,它采用高阶递归格式G和一个(确定性的)平凡自动机a作为输入,并检查G生成的(可能无限的)树是否被a接受。2006年,Luke Ong证明了高阶递归方案的模型检查问题是可判定的,但对于order-k递归方案,其最坏情况的复杂性是k-EXPTIME完全。据我们所知,TRecS是有史以来构建的第一个高阶模型检查器的实现。它使用小林在2009年PPDP上提出的基于类型的模型检查算法,以及尽管存在巨大的最坏情况复杂性,但对于许多典型输入来说运行速度很快。自TRecS开发以来,它一直被用作程序验证工具的后端,如麻糬,它是一种“软件模型检查器”对于ML,以及EHMTT验证程序,它也是生成树功能程序的验证工具。您可以通过下面的web界面测试TRecS。技术背景见:

Naoki Kobayashi,《模型检查高阶程序》,JACM,60(3),2013年。

在下面的框中输入递归方案和规范,并按下“提交”按钮。示例如下。目前,我们的模型检查器只接受确定性Buchi自动机具有微不足道的验收条件。

您只能在此页面上测试小示例。如果需要,请咨询我们(Naoki Kobayashi)您想获取TRecS的源程序并在您的机器上运行它。


下面给出了一些示例。更多示例可用在这里.

示例1

%BEGING/***重写递归方案的规则。非终结符必须以大写字母开头***/S->F c./***第一条规则的非终结符被解释为开始符号***/F x->a x(F(b x))。/***无边界名称(本规则中的“a”、“b”)被解释为终端***/%ENDG(结束)%BEGINA/***布其树自动机的转换规则(所有状态都是最终的)***/q0 a->q0 q0./***第一个状态被解释为初始状态**/q0 b->q1。q1 b->q1。q0 c->。问题1 c->。%ENDA公司

简单文件访问程序

/*以下文件访问程序的编码。让recf x=if*,然后关闭x else(读(x);f x)让y=在中打开“foo”f年要检查的属性是:文件“foo”的访问依据读取*关闭。*/%开始S->F d结束。F x k->br(关闭k)(读取(F x k))。%ENDG(结束)%贝吉纳q0 br->q0 q0。q1 br->q1 q1。q0读取->q0。q0关闭->q1。q1结束->。%ENDA公司

示例2

/***一个来自POPL09论文的示例,该论文创建并访问两个文件***/%乞求S->新C1。C1 x->新(C2 x)。C2 x y->F x y端。F x y k->br(关闭x(关闭y k))(读取x(写入y(F x y k)))。I x y->x y。K x y->y。新k->br(新(k I))(k k)。新k->br(新k(k I))(k k)。关闭x k->x关闭k。读取x k->x读取k。写y k->y写k。%ENDG(结束)%贝吉纳q0 br->q0 q0。qr br->qr qr。qw-br->qw-qw。qrw br->qrw qrw。q0新->qr。qr读取->qr。qr关闭->qc。q0 neww->qw。qw写入->qw。qw关闭->qc。qw newr->qrw。qr新建->新建。qrw读取->qrw。qrw写入->qrw。qrw关闭->qrw。qc结束->。q0结束->。qrw结束->。%ENDA公司

示例3

/***以POPL09论文为例,该论文获取并释放锁***/%开始S->br(新建(F0端))(新建(F1端))。F0 k x->C0 x k。F1 k x->锁x(C1 x k)。C0 x k->k。C1 x k->解锁x k。新k->br(newl(k I))(k k)。I x y->x y。K x y->y。锁定x k->x锁定k。解锁x k->x解锁k。%ENDG(结束)%贝吉纳q0 br->q0 q0。q1 br->q1 q1。q2 br->q2 q2。q0 newl->q1。q1锁定->q2。q2解锁->q1。q0结束->。q1结束->。%ENDA公司

示例4

TRecS还支持有限的整数集。
_案例n i e1。。。英语
被简化为ei,其中i的范围必须大于{0,…,n-1}。请参见下面的示例。
%开始S->br(新(C 0))(新(C1))。C b x->F b x(G b x末端)。F b x k->_case 2 b k(锁定x k)。G b x k->_case 2 b k(解锁x k)。新k->br(newl(k I))(k k)。I x y->x y。K x y->y。锁定x k->x锁定k。解锁x k->x解锁k。%ENDG(结束)%贝吉纳q0 br->q0 q0。q1 br->q1 q1。q2 br->q2 q2。q0 newl->q1。q1锁定->q2。q2解锁->q1。q0结束->。q1结束->。%ENDA公司

示例5

/*用谓词偶数抽象下列程序得到的HORSfun重复n f x=如果n=0,则x否则重复(n-1)f(f x)funmain()=如果偶数(n),则断言(重复n不为true)其他()*/%开始S->如果NB(重复True非True断言)结束。重复b f x k->如果b(C b f x NB k)(C b x False k)。C b f x b1 k->如果b1(k x)(重复(非b)f(f x)k)。断言b->b结束失败。如果b x y->b x y。不是b x y->b y x。NB x y->br x y。真x y->x。错误x y->y。%ENDG(结束)%贝吉纳q0 br->q0 q0。q0结束->。%ENDA公司

示例6

/**通过以下按值调用程序的CPS转换获得的HORS。设rec-reeatEven f x=if*则x else f(repeatOdd f x)和repeatOdd f x=f(repeatEven f x)let main()=if(repeatEven not true)then()else失败**/%开始主->RepeatEven C不正确。重复偶数k f x->如果TF(k x)(重复奇数(f k)f x)。重复奇数k f x->重复偶数(f k)f x。C b->如果b端失效。非k b->如果b(k为假)(k为真)。如果b x y->b x y。真x y->x。错误x y->y。TF x y->br x y。%结束%贝吉纳q0 br->q0 q0。q0结束->。%ENDA公司

循环程序

/**通过以下按值调用程序的CPS转换获得的HORS。让rec循环x=如果x,则循环x,否则x设f x=失败让main()=f(循环为true)**/%开始S->回路真G。回路x k->如果x(回路x k)(k x)。F x k->失败。Id x->x。G r->F r Id。如果b x y->b x y。真x y->x。错误x y->y。%ENDG(结束)%贝吉纳q0 br->q0 q0。q0结束->。%ENDA公司

斐波那契单词

%乞求S->纤维b a。Fib x y->br(x e)(Fib y(Concat y x))。Concat x y z->x(y z)。%ENDG(结束)%贝吉纳q0 br->q0 q0。q1 br->q1 q1。q0 a->q0。q0 b->q1。q1 a->q0。q0 e->。问题1 e->。%恩达