This module contains the basic definitions of the program
specification and data refinement framework and the definitions of
some basic specification operations. See
(
** Module lib_adt_basics Imports lib_sigma lib_setoid
STR = ... : Type
$SPEC : Type(SPEC)
$make_SPEC : {Str:STR}(Str->Prop)->SPEC
$SPEC_elim :
{C_SPEC:SPEC->Type}
({Str:STR}{Ax:Str->Prop}C_SPEC (make_SPEC Str Ax))->{z:SPEC}C_SPEC z
[[C_SPEC:SPEC->Type]
[f_make_SPEC:{Str:STR}{Ax:Str->Prop}C_SPEC (make_SPEC Str Ax)][Str:STR]
[Ax:Str->Prop]
SPEC_elim C_SPEC f_make_SPEC (make_SPEC Str Ax) ==>
f_make_SPEC Str Ax]
Str = ... : SPEC->STR
Ax = ... : {z:SPEC}(Str z)->Prop
Spec = ... : STR->Type
Model = ... : SPEC->Type(sigma)
Consistent = ... : SPEC->Prop
Impl = ... : {S|STR}(Spec S)->(Spec S)->Prop
Sat = ... : {SP,SP'|SPEC}((Str SP')->Str SP)->Prop
$IMPL1 : SPEC->SPEC->Type(IMPL1)
$make_IMPL1 :
{SP,SP'|SPEC}{refn:(Str SP')->Str SP}(Sat refn)->IMPL1|SP|SP'
$IMPL1_elim :
{SP,SP'|SPEC}{C_IMPL1:(IMPL1|SP|SP')->Type}
({refn:(Str SP')->Str SP}{sat:Sat refn}
C_IMPL1 (make_IMPL1 refn sat))->{z:IMPL1|SP|SP'}C_IMPL1 z
[[SP,SP'|SPEC][C_IMPL1:(IMPL1|SP|SP')->Type]
[f_make_IMPL1:{refn:(Str SP')->Str SP}{sat:Sat refn}
C_IMPL1 (make_IMPL1 refn sat)][refn:(Str SP')->Str SP][sat:Sat refn]
IMPL1_elim C_IMPL1 f_make_IMPL1 (make_IMPL1 refn sat) ==>
f_make_IMPL1 refn sat]
refn = ... : {SP,SP'|SPEC}(IMPL1|SP|SP')->(Str SP')->Str SP
sat = ... : {SP,SP'|SPEC}{z:IMPL1|SP|SP'}Sat (refn z)
IMPL = ... : SPEC->SPEC->Type(IMPL1)
Extend = ... :
{SP:SPEC}{ext_str:(Str SP)->STR}
[S'=Sigma (Str SP) ([s:Str SP]ext_str s)](S'->Prop)->SPEC
Extend_AxOnly = ... : {SP:SPEC}((Str SP)->Prop)->SPEC
Join = ... : {S|STR}(Spec S)->(Spec S)->SPEC
Cross = ... : SPEC->SPEC->SPEC
SigmaCirc = ... : {SP:SPEC}((Str SP)->SPEC)->SPEC
Pi = ... : {SP:SPEC}((Str SP)->SPEC)->SPEC
Con = ... : {S,S'|STR}(S'->S)->(Spec S')->Spec S
Sel = ... : {S,S'|STR}(S'->S)->(Spec S)->Spec S'
Abs = ... : {S|STR}(S->S->Prop)->(Spec S)->Spec S
Hide = ... : {S|STR}{SP:SPEC}((Str SP)->S)->SPEC
An example of the the abstract datatype of stacks, with axiomatisation, proofs of congruence properties, and implementation as an array is also included.
** Module lib_adt_array Imports lib_nat lib_adt_basics
$Str_ARRAY : STR
$make_Str_ARRAY :
{Array:Setoid}(dom Array)->(nat->(dom Array)->nat->dom Array)->
((dom Array)->nat->nat)->Str_ARRAY
$Str_ARRAY_elim :
{C_Str_ARRAY:Str_ARRAY->Type}
({Array:Setoid}{newarray:dom Array}
{assign:nat->(dom Array)->nat->dom Array}
{access:(dom Array)->nat->nat}
C_Str_ARRAY (make_Str_ARRAY Array newarray assign access))->
{z:Str_ARRAY}C_Str_ARRAY z
[[C_Str_ARRAY:Str_ARRAY->Type]
[f_make_Str_ARRAY:{Array:Setoid}{newarray:dom Array}
{assign:nat->(dom Array)->nat->dom Array}
{access:(dom Array)->nat->nat}
C_Str_ARRAY (make_Str_ARRAY Array newarray assign access)]
[Array:Setoid][newarray:dom Array]
[assign:nat->(dom Array)->nat->dom Array][access:(dom Array)->nat->nat]
Str_ARRAY_elim C_Str_ARRAY f_make_Str_ARRAY
(make_Str_ARRAY Array newarray assign access) ==>
f_make_Str_ARRAY Array newarray assign access]
Array = ... : Str_ARRAY->Setoid
newarray = ... : {z:Str_ARRAY}dom (Array z)
assign = ... : {z:Str_ARRAY}nat->(dom (Array z))->nat->dom (Array z)
access = ... : {z:Str_ARRAY}(dom (Array z))->nat->nat
EqARRAY = ... : Str_ARRAY->Prop
AxARRAY1 = ... : Str_ARRAY->Prop
AxARRAY2 = ... : Str_ARRAY->Prop
Ax_ARRAY = ... : Str_ARRAY->Prop
ARRAY = ... : SPEC
** Module lib_adt_stack Imports lib_nat lib_adt_basics
eq = ... : {S|Setoid}(dom S)->(dom S)->Prop
$Str_STACK : STR
$make_Str_STACK :
{Stack:Setoid}(dom Stack)->(nat->(dom Stack)->dom Stack)->
((dom Stack)->dom Stack)->((dom Stack)->nat)->Str_STACK
$Str_STACK_elim :
{C_Str_STACK:Str_STACK->Type}
({Stack:Setoid}{empty:dom Stack}{push:nat->(dom Stack)->dom Stack}
{pop:(dom Stack)->dom Stack}{top:(dom Stack)->nat}
C_Str_STACK (make_Str_STACK Stack empty push pop top))->
{z:Str_STACK}C_Str_STACK z
[[C_Str_STACK:Str_STACK->Type]
[f_make_Str_STACK:{Stack:Setoid}{empty:dom Stack}
{push:nat->(dom Stack)->dom Stack}{pop:(dom Stack)->dom Stack}
{top:(dom Stack)->nat}
C_Str_STACK (make_Str_STACK Stack empty push pop top)][Stack:Setoid]
[empty:dom Stack][push:nat->(dom Stack)->dom Stack]
[pop:(dom Stack)->dom Stack][top:(dom Stack)->nat]
Str_STACK_elim C_Str_STACK f_make_Str_STACK
(make_Str_STACK Stack empty push pop top) ==>
f_make_Str_STACK Stack empty push pop top]
Stack = ... : Str_STACK->Setoid
empty = ... : {z:Str_STACK}dom (Stack z)
push = ... : {z:Str_STACK}nat->(dom (Stack z))->dom (Stack z)
pop = ... : {z:Str_STACK}(dom (Stack z))->dom (Stack z)
top = ... : {z:Str_STACK}(dom (Stack z))->nat
EqSTACK = ... : Str_STACK->Prop
AxSTACK1 = ... : Str_STACK->Prop
AxSTACK2 = ... : Str_STACK->Prop
AxSTACK3 = ... : Str_STACK->Prop
AxSTACK4 = ... : Str_STACK->Prop
Ax_STACK = ... : Str_STACK->Prop
STACK = ... : SPEC
** Module lib_adt_stack_cong Imports lib_adt_basics lib_adt_stack
RespSTACKpush = ... : Str_STACK->Prop
RespSTACKpop = ... : Str_STACK->Prop
RespSTACKtop = ... : Str_STACK->Prop
RespSTACK = ... : Str_STACK->Prop
STACK_CONG = ... : SPEC
iterate = ... : {A|Type}(A->A)->nat->A->A
pop_iterate = ... :
{S:Str STACK_CONG}(Ax STACK_CONG S)->{s:dom (Stack S)}{x:nat}
eq (iterate (pop S) (suc x) s) (iterate (pop S) x (pop S s))
pop_iterate_resp = ... :
{S:Str STACK_CONG}(Ax STACK_CONG S)->{s,s':dom (Stack S)}(eq s s')->
{x:nat}eq (iterate (pop S) x s) (iterate (pop S) x s')
pop_iterate_empty = ... :
{S:Str STACK_CONG}(Ax STACK_CONG S)->{i:nat}
eq (iterate (pop S) i (empty S)) (empty S)
pop_iterate_push = ... :
{S:Str STACK_CONG}(Ax STACK_CONG S)->{s:dom (Stack S)}{k,m:nat}
eq (iterate (pop S) (suc k) (push S m s)) (iterate (pop S) k s)
** Module lib_adt_list_stack Imports lib_list_basics lib_adt_stack_cong listStack = ... : Str_STACK eqStackL = ... : EqSTACK listStack axStack1L = ... : AxSTACK1 listStack axStack2L = ... : AxSTACK2 listStack axStack3L = ... : AxSTACK3 listStack axStack4L = ... : AxSTACK4 listStack listStack_correct = ... : Ax_STACK listStack respStackL = ... : RespSTACK listStack listStack_correct_cong = ... : Ax STACK_CONG listStack
** Module lib_adt_stack_by_array Imports lib_nat_Lt lib_adt_stack
lib_adt_array
refnSA = ... : (Str ARRAY)->Str STACK
equivSTACK = ... : {A:Str ARRAY}Equivalence (eq|(Stack (refnSA A)))
axSTACK1 = ... : {A:Str ARRAY}AxSTACK1 (refnSA A)
axSTACK2 = ... : {A:Str ARRAY}AxSTACK2 (refnSA A)
axSTACK3 = ... : {A:Str ARRAY}(Ax ARRAY A)->AxSTACK3 (refnSA A)
axSTACK4 = ... : {A:Str ARRAY}(Ax ARRAY A)->AxSTACK4 (refnSA A)
sat_refnSA = ... : Sat refnSA