如何在函数规范中使用8个以上的变量?

时间:2015-01-24 11:54:05

标签: verifiable-c

WITH构造仅定义最多8个变量。我怎样才能使用超过8个? 例如:

Definition find_key_spec :=
  DECLARE _find_key
    WITH sh : share, m : ArrMapZ, start : Z, key : Z, i : nat,
         vbb : val, vkeys : val, vstart : val, vkey : val, vi : val
    PRE ...

=>

Toplevel input, characters 176-177:
Syntax error: 'PRE' '[' expected after [constr:operconstr level 200]
(in [constr:binder_constr]).

我使用:VST 1.5(2014-10-02为6834P),CompCert 2.4,Coq 8.4pl3(Jan' 14),OCaml 4.01.0。

2 个答案:

答案 0 :(得分:1)

我的解决方案:使用10个变量为WITH定义符号:

Notation "'WITH'  x1 : t1 , x2 : t2 , x3 : t3 , x4 : t4 , x5 : t5 ,
                  x6 : t6 , x7 : t7 , x8 : t8 , x9 : t9 , x10 : t10
                  'PRE'  [ u , .. , v ] P 'POST' [ tz ] Q" :=
     (mk_funspec ((cons u%formals .. (cons v%formals nil) ..), tz)
                 (t1*t2*t3*t4*t5*t6*t7*t8*t9*t10)
           (fun x => match x with (x1,x2,x3,x4,x5,x6,x7,x8,x9,x10) =>
                                  P%logic end)
           (fun x => match x with (x1,x2,x3,x4,x5,x6,x7,x8,x9,x10) =>
                                  Q%logic end))
            (at level 200, x1 at level 0, x2 at level 0, x3 at level 0,
                           x4 at level 0, x5 at level 0, x6 at level 0,
                           x7 at level 0, x8 at level 0, x9 at level 0,
                           x10 at level 0, P at level 100, Q at level 100).

答案 1 :(得分:1)

另一种方法是在WITH子句中引入元组(例如WITH x12:(t1 * t2)%type),并通过投影在PRE和POST中引用它们的组件(例如,在PRE中使用fst x12代替x1) )。