在ACSL / Frama-C中使用reals键入声明

时间:2014-06-20 14:50:05

标签: c frama-c

我对最后一个Frama-C版本的ACSL规范有一些问题 我尝试了很多东西来宣布一对实物,但没有一个能够奏效。 这是一个很小的例子说明问题:

/*@ type real_pair = (real, real); */  

给出了:

  

[kernel]用户错误:意外令牌'('

最后,我希望附近有一个代码:

/*@ axiomatic RealPairs { 

type real_pair = (real, real);  

logic real Norm ( real_pair p ) =   
\let (x,y) = p;  
\sqrt(x*x + y*y);  

} */ 

有人看到错误的位置吗?我发现ACSL文档对类型声明非常模糊......

非常感谢您的回答。

致以最诚挚的问候,

Nilexys。

1 个答案:

答案 0 :(得分:2)

关于ACSL手册,您所写的内容是正确的。但是,正如您在ACSL 实施手册中看到的那样 (http://frama-c.com/download/frama-c-acsl-implementation.pdf),在Frama-C的当前ACSL实现中不支持对。事实上,ACSL这个领域唯一部分支持的是和类型。更确切地说,您可以定义和类型,但Frama-C不支持\match构造,这意味着您必须求助于公理。在目前的情况下,Frama-C应该接受以下内容(尽管未经过测试):

/*@ type real_pair = RPCons(real, real); */
/*@ axiomatic Real_pair {
     logic real rp_fst(real_pair p);
     logic real rp_snd(real_pair p);
     axiom rp_fst_def: \forall real x, y; rp_fst(RPCons(x,y)) == x;
     axiom rp_snd_def: \forall real x,y; rp_snd(RPCons(x,y)) == y;
 */