Theory Big_Aux

theory Big_Aux
imports Big Common_Aux
begin    

text  Functions:

 size_new›: Returns the size that the deque end will have after the rebalancing is finished.
 size›: Minimum of size_new› and the number of elements contained in the current state.
 remaining_steps›: Returns how many steps are left until the rebalancing is finished.
 list›: List abstraction of the elements which this end will contain after the rebalancing is finished
 list_current›: List abstraction of the elements currently in this deque end.›

fun list :: "'a big_state  'a list" where
  "list (Big2 common) = Common_Aux.list common"
| "list (Big1 (Current extra _ _ remained) big aux count) = (
   let reversed = take_rev count (Stack_Aux.list big) @ aux in
    extra @ (take_rev remained reversed)
  )"

fun list_current :: "'a big_state  'a list" where
  "list_current (Big2 common) = Common_Aux.list_current common"
| "list_current (Big1 current _ _ _) = Current_Aux.list current"

instantiation big_state ::(type) invar
begin

fun invar_big_state :: "'a big_state  bool" where
  "invar (Big2 state)  invar state"
| "invar (Big1 current big aux count)  (
   case current of Current extra added old remained 
      invar current
     remained  length aux + count
     count  size big
     Stack_Aux.list old = rev (take (size old) ((rev (Stack_Aux.list big)) @ aux))
     take remained (Stack_Aux.list old) = 
      rev (take remained (take_rev count (Stack_Aux.list big) @ aux))
)"

instance..
end

instantiation big_state ::(type) size
begin

fun size_big_state :: "'a big_state  nat" where
  "size (Big2 state) = size state"
| "size (Big1 current _ _ _) = min (size current) (size_new current)"

instance..
end

instantiation big_state ::(type) size_new
begin

fun size_new_big_state :: "'a big_state  nat" where
  "size_new (Big2 state) = size_new state"
| "size_new (Big1 current _ _ _) = size_new current"

instance..
end

instantiation big_state ::(type) remaining_steps
begin

fun remaining_steps_big_state :: "'a big_state  nat" where
  "remaining_steps (Big2 state) = remaining_steps state"
| "remaining_steps (Big1 (Current _ _ _ remaining) _ _ count) = count + remaining + 1"

instance..
end

end