-
Notifications
You must be signed in to change notification settings - Fork 21
/
Copy pathreverse_spec.k
53 lines (49 loc) · 1.51 KB
/
reverse_spec.k
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
require "../patterns/list/js-verifier.k"
module REVERSE-SPEC
imports JS-VERIFIER
rule [loop-inv]:
<lexicalEnv> @e(I:Int) </lexicalEnv>
<lastNonEmptyValue> _:Val => ?_:Val </lastNonEmptyValue>
<envs>...
<env>
<eid> @e(I) </eid>
<outer> _:Eid </outer>
<strict> _:Bool </strict>
<declEnvRec>...
"x" |-> @ve(OX:NullableObject => @NullVal, true, true, false)
"p" |-> @ve(OP1:NullableObject => ?OP2:NullableObject, true, true, false)
"y" |-> @ve(_:Val => ?_:Val, true, true, false)
...</declEnvRec>
</env>
(.Bag => ?_:Bag)
...</envs>
<objs>...
(list(OX)(B:List) list(OP1)(C:List) => list(?OP2)(rev(B) C))
OBJS:Bag
(.Bag => ?_:Bag)
...</objs>
<k>
%while ( %bop ( %neqs , %var ( "x" ) , %con ( %null ) ) , %seq ( %seq ( %exp ( %bop ( %assign , %var ( "y" ) , %mem ( %var ( "x" ) , %con ( "next" ) ) ) ) , %seq ( %exp ( %bop ( %assign , %mem ( %var ( "x" ) , %con ( "next" ) ) , %var ( "p" ) ) ) , %seq ( %exp ( %bop ( %assign , %var ( "p" ) , %var ( "x" ) ) ) , %exp ( %bop ( %assign , %var ( "x" ) , %var ( "y" ) ) ) ) ) ) , %labelContinue ( "" )) )
=>
@Normal
...</k>
rule [func-spec]:
<envs>...
ENVS:Bag
(.Bag => ?_:Bag)
...</envs>
<objs>...
(list(O1)(A:List) => list(?O2)(rev(A)))
OBJS:Bag
(.Bag => ?_:Bag)
...</objs>
<k>
Call(
// %var("reverse"),
@o(2),
Undefined,
@Cons(O1:NullableObject, @Nil))
=>
?O2:NullableObject
...</k>
endmodule