Theory Common_Aux

theory Common_Aux
imports Common Current_Aux Idle_Aux
begin

text Functions:

 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.
 remaining_steps›: Returns how many steps are left until the rebalancing is finished.
 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.›

definition take_rev where 
[simp]:  "take_rev n xs = rev (take n xs)"

fun list :: "'a common_state  'a list" where
  "list (Idle _ idle) = Idle_Aux.list idle"
| "list (Copy (Current extra _ _ remained) old new moved) 
   = extra @ take_rev (remained - moved) old @ new"

fun list_current :: "'a common_state  'a list" where
  "list_current (Idle current _) = Current_Aux.list current"
| "list_current (Copy current _ _ _) = Current_Aux.list current"

instantiation common_state::(type) invar
begin

fun invar_common_state :: "'a common_state  bool" where
  "invar (Idle current idle) 
      invar idle 
     invar current 
     size_new current = size idle
     take (size idle) (Current_Aux.list current) = 
      take (size current) (Idle_Aux.list idle)"
| "invar (Copy current aux new moved)  (
    case current of Current _ _ old remained 
      moved < remained
     moved = length new
     remained  length aux + moved
     invar current
     take remained (Stack_Aux.list old) = take (size old) (take_rev (remained - moved) aux @ new)
 )"

instance..
end

instantiation common_state::(type) size
begin

fun size_common_state :: "'a common_state  nat" where
  "size (Idle current idle) = min (size current) (size idle)"
| "size (Copy current _ _ _) = min (size current) (size_new current)"

instance..
end

instantiation common_state::(type) size_new
begin

fun size_new_common_state :: "'a common_state  nat" where
  "size_new (Idle current _) = size_new current"
| "size_new (Copy current _ _ _) = size_new current"

instance..
end

instantiation common_state::(type) remaining_steps
begin

fun remaining_steps_common_state :: "'a common_state  nat" where
  "remaining_steps (Idle _ _) = 0"
| "remaining_steps (Copy (Current _ _ _ remained) aux new moved) = remained - moved"

instance..
end


end