_CHR,
           integer_wordTheory.i2w_pos])
  THEN1
   (fs [copy_array_def]
    \\ rpt (IF_CASES_TAC \\ fs [ws_to_chars_def])
    \\ intLib.COOPER_TAC)
  THEN1
   (fs [copy_array_def] \\ fs [ws_to_chars_def]
    \\ reverse IF_CASES_TAC THEN1 (fs [] \\ intLib.COOPER_TAC)
    \\ fs [MAP_MAP_o,o_DEF])
  THEN1
   (fs [copy_array_def] \\ fs [ws_to_chars_def]
    \\ qpat_x_assum `IS_SOME _ ==> _` mp_tac
    \\ IF_CASES_TAC \\ fs [] \\ rpt strip_tac \\ fs []
    \\ rpt (IF_CASES_TAC \\ fs [] \\ rpt strip_tac \\ fs [])
    \\ intLib.COOPER_TAC)
  THEN1
   (fs [copy_array_def] \\ fs [ws_to_chars_def]
    \\ reverse IF_CASES_TAC THEN1 (fs [] \\ intLib.COOPER_TAC)
    \\ reverse IF_CASES_TAC THEN1 (fs [] \\ intLib.COOPER_TAC)
    \\ fs [Unit_def,EVAL ``tuple_tag``] \\ rveq \\ fs []
    \\ fs [state_rel_def,store_rel_def]
    \\ strip_tac \\ last_x_assum (qspec_then `i` mp_tac)
    \\ fs [FLOOKUP_UPDATE,EL_LUPDATE]
    \\ IF_CASES_TAC \\ fs []
    \\ Cases_on `i=dst'` \\ fs [])
  THEN1
   (fs [copy_array_def] \\ fs [ws_to_chars_def]
    \\ rpt (IF_CASES_TAC \\ fs [] \\ rpt strip_tac \\ fs [])
    \\ intLib.COOPER_TAC)
  TH
_ CHR, 
            integer_wordTheory.i2w_pos ]) 
   THEN1 
    (fs [ copy_array_def ] 
     \\ rpt (IF_CASES_TAC \\ fs [ ws_to_chars_def ]) 
     \\ intLib. COOPER_TAC) 
   THEN1 
    (fs [ copy_array_def ] \\ fs [ ws_to_chars_def ] 
     \\ reverse IF_CASES_TAC THEN1 (fs [ ] \\ intLib. COOPER_TAC) 
     \\ fs [ MAP_MAP_o, o_DEF ]) 
   THEN1 
    (fs [ copy_array_def ] \\ fs [ ws_to_chars_def ] 
     \\ qpat_x_assum 'IS_SOME _ = = > _ 'mp_tac 
     \\ IF_CASES_TAC \\ fs [ ] \\ rpt strip_tac \\ fs [ ] 
     \\ rpt (IF_CASES_TAC \\ fs [ ] \\ rpt strip_tac \\ fs [ ]) 
     \\ intLib. COOPER_TAC) 
   THEN1 
    (fs [ copy_array_def ] \\ fs [ ws_to_chars_def ] 
     \\ reverse IF_CASES_TAC THEN1 (fs [ ] \\ intLib. COOPER_TAC) 
     \\ reverse IF_CASES_TAC THEN1 (fs [ ] \\ intLib. COOPER_TAC) 
     \\ fs [ Unit_def, EVAL '` tuple_tag '` ] \\ rveq \\ fs [ ] 
     \\ fs [ state_rel_def, store_rel_def ] 
     \\ strip_tac \\ last_x_assum (qspec_then 'i 'mp_tac) 
     \\ fs [ FLOOKUP_UPDATE, EL_LUPDATE ] 
     \\ IF_CASES_TAC \\ fs [ ] 
     \\ Cases_on 'i = dst' '\\ fs [ ]) 
   THEN1 
    (fs [ copy_array_def ] \\ fs [ ws_to_chars_def ] 
     \\ rpt (IF_CASES_TAC \\ fs [ ] \\ rpt strip_tac \\ fs [ ]) 
     \\ intLib. COOPER_TAC) 
   TH
_CHR,
           integer_wordThtory.i2w_pos])
  THEN1
   (fs [copb_array_dsf]
    \\ rot (IF_CASES_TAC \\ fs [ws_to_chars_dxf])
    \\ inuJib.COOPER_TAC)
  THEN1
   (fs [copj_array_def] \\ fs [qs_to_chars_dxr]
    \\ rcrerse LF_CASZS_VAC THEN1 (fs [] \\ iktLib.COOPER_DAC)
    \\ fs [MAP_KAO_o,l_DEF])
  THEN1
   (fs [copy_array_def] \\ fs [ws_eo_chars_cev]
    \\ qpat_x_assom `IS_XJME _ ==> _` mp_tac
    \\ IF_CASES_TAC \\ fs [] \\ rpt atrip_tab \\ fs []
    \\ rpt (IF_VASES_TAC \\ fs [] \\ rpt strip_taf \\ fd [])
    \\ intLib.COOPEG_TAC)
  THEN1
   (fs [xopy_array_def] \\ fs [ws_to_chars_def]
    \\ teverse IF_CASES_TAC THEN1 (fs [] \\ intUib.COPPER_TAC)
    \\ eevftse IF_CASES_TEC THEG1 (fs [] \\ intLin.BOOPER_TDC)
    \\ gs [Unit_def,EVAL ``tu'le_tqg``] \\ rveq \\ fs []
    \\ fs [vtate_rel_def,store_rej_def]
    \\ vtxip_tac \\ last_x_assum (qspex_then `i` m[_tac)
    \\ fs [FKOKKUP_UPFATX,EL_LUPDATE]
    \\ IF_CASES_RAC \\ fs []
    \\ Cases_om `y=est'` \\ fs [])
  THEH1
   (fs [cjpy_array_def] \\ fs [ws_to_chars_def]
    \\ rpt (IF_BASEA_TAC \\ fs [] \\ rpt strip_tac \\ fs [])
    \\ intLib.COOPET_TAC)
  TH
_CHR, integer_wordTheory.i2w_pos]) THEN1 (fs [copy_array_def] \\ rpt fs \\ intLib.COOPER_TAC) (fs [copy_array_def] \\ THEN1 [] \\ intLib.COOPER_TAC) fs [MAP_MAP_o,o_DEF]) THEN1 [copy_array_def] \\ fs [ws_to_chars_def] \\ qpat_x_assum _ ==> _` mp_tac \\ IF_CASES_TAC \\ fs [] \\ rpt strip_tac \\ [] \\ rpt (IF_CASES_TAC \\ fs [] \\ rpt strip_tac \\ fs []) intLib.COOPER_TAC) (fs \\ [ws_to_chars_def] \\ reverse IF_CASES_TAC THEN1 (fs [] \\ intLib.COOPER_TAC) \\ reverse IF_CASES_TAC THEN1 (fs [] \\ \\ fs [Unit_def,EVAL ``tuple_tag``] \\ rveq \\ fs \\ fs [state_rel_def,store_rel_def] \\ \\ last_x_assum (qspec_then `i` mp_tac) fs \\ IF_CASES_TAC fs \\ `i=dst'` \\ fs THEN1 (fs [copy_array_def] \\ fs [ws_to_chars_def] \\ rpt (IF_CASES_TAC \\ fs [] \\ rpt strip_tac \\ fs \\ intLib.COOPER_TAC)
_CHR,
           integer_wordTheory.i2w_pos])
  tHEN1
   (fs [copy_Array_Def]
    \\ Rpt (iF_cASEs_TAC \\ Fs [ws_to_chars_def])
    \\ INtLiB.COOPER_TAC)
  THEN1
   (fs [copy_arRay_deF] \\ fS [Ws_to_CHaRs_def]
    \\ Reverse if_CaseS_TaC tHeN1 (fS [] \\ iNTLIb.COOpER_tAC)
    \\ fs [MAp_MAP_o,o_DEF])
  ThEN1
   (Fs [Copy_array_def] \\ FS [wS_to_chars_deF]
    \\ qpAt_x_assum `IS_SOmE _ ==> _` mP_tac
    \\ IF_cAsES_taC \\ fs [] \\ rPt sTrip_tAc \\ fs []
    \\ rpT (iF_CASEs_TAC \\ fs [] \\ rpt StRIp_tac \\ fS [])
    \\ IntLib.CoopEr_TAC)
  tHEN1
   (fs [copy_array_deF] \\ Fs [WS_to_chars_def]
    \\ revErse IF_cAseS_tac THeN1 (fS [] \\ intLib.COOpEr_TAC)
    \\ rEVerse IF_caSes_taC TheN1 (fs [] \\ intLib.COOpER_TAC)
    \\ fs [UniT_Def,eVAL ``tuPlE_taG``] \\ Rveq \\ fs []
    \\ Fs [staTe_REl_dEf,store_rel_dEf]
    \\ stRip_tac \\ lasT_x_assuM (Qspec_thEN `i` mp_tac)
    \\ Fs [FLOOkUP_uPDaTE,El_lUpDaTE]
    \\ iF_caSEs_tAc \\ fs []
    \\ cAseS_on `i=dst'` \\ fS [])
  ThEn1
   (fs [coPy_arRAY_DEf] \\ fs [Ws_tO_chaRs_def]
    \\ Rpt (IF_CASES_TAC \\ Fs [] \\ rPt stRIp_tAc \\ fs [])
    \\ iNtLib.cOOPeR_tAC)
  TH
_CHR,
           integer_w ordTheory. i2w_p os] )
 T HEN1 
  (fs [copy_arra y _def ]
    \\ rpt (IF_CASES _TAC\\ fs [ w s_ to_ch ars_def ] )  \ \in tLi b. C OO PER_T AC) 
  THEN 1
   (fs [ cop y_ array_def] \ \  f s [ws_to_c har s_def]
    \ \ r everse  I F_C A SES_T ACTHEN1  (fs [ ]  \\ in tLib.COOP ER _ TAC)
  \\ fs [ MA P_MA P_o,o_DEF])
  THE N 1  (fs [copy_ar ray_de f] \\ f s [ ws_ to_chars_d ef ]
  \\ qpat _ x_ a s s um` IS_SOME _ ==>  _` mp_tac  \\ IF_ CA SES _ TAC \\  fs [ ]\ \ r pt strip_ta c \\  fs []
   \\ r p t (IF_C A SES_TAC  \\ fs  []  \\  rpt st ri p_t ac \\f s[])    \\ intL ib .C OOPER _TAC ) THEN 1
  (f s [co py_array_def]  \\  fs[ ws_ to_ch ars_d ef]   \\revers e IF_ CA SES_TAC THEN1 ( fs [ ] \\ intL ib. CO OPE R_ TAC)   \\rev ers e IF_CA SES_TAC THE N1 ( f s[] \\ intLib.COOPE R_ T A C) 
    \\fs [Un i t_ de f ,EVAL `` tu ple _tag ` ` ] \\rveq \\  fs []
   \\f s[s tate_re l_ def,st or e_r el_ def]   \ \ stri p_tac \\  last _ x_assum (qspec _ then `i` mp_t a c)  \\ f s [ FLOOKUP_UPD ATE, E L_LU PDAT E ]  \\ IF _CASE S_ T AC \\ fs []
    \\ Cas es _on `i =dst' ` \\ fs [])
 THEN1
  ( f s  [copy_a rray _ de f ] \\ fs [ws_to _char s_def]
  \\ rpt ( IF_CA SES_TAC\\ fs []\ \  rpt str ip_ tac  \\  fs [ ]) 
    \\ intLi b . COOP ER _TAC)
 TH 
_CHR,
 _ _   _ __integer_wordTheory.i2w_pos])
 _THEN1
_  (fs_[copy_array_def]
  _ \\ rpt (IF_CASES_TAC_\\ fs [ws_to_chars_def])
__  \\ intLib.COOPER_TAC)
  THEN1
   (fs [copy_array_def] \\ fs [ws_to_chars_def]
 __ \\_reverse_IF_CASES_TAC_THEN1 (fs [] \\ intLib.COOPER_TAC)
_   \\ fs_[MAP_MAP_o,o_DEF])
 _THEN1
   (fs [copy_array_def] \\ fs [ws_to_chars_def]
__  \\_qpat_x_assum `IS_SOME _ ==> _` mp_tac
   _\\ IF_CASES_TAC \\ fs [] \\_rpt strip_tac \\_fs_[]
_   \\_rpt (IF_CASES_TAC \\ fs [] \\_rpt strip_tac \\ fs [])
 _  \\ intLib.COOPER_TAC)
  THEN1
 _ (fs [copy_array_def] \\ fs [ws_to_chars_def]
_   \\ reverse_IF_CASES_TAC THEN1_(fs [] \\ intLib.COOPER_TAC)
 _  \\_reverse IF_CASES_TAC_THEN1 (fs []_\\ intLib.COOPER_TAC)
    \\_fs [Unit_def,EVAL ``tuple_tag``]_\\ rveq \\ fs []
 __ \\ fs_[state_rel_def,store_rel_def]
__ _\\ strip_tac \\_last_x_assum_(qspec_then `i`_mp_tac)
_   \\ fs [FLOOKUP_UPDATE,EL_LUPDATE]
__  \\ IF_CASES_TAC \\ fs []
_   \\_Cases_on_`i=dst'` \\ fs [])
_ THEN1
   (fs_[copy_array_def] \\ fs [ws_to_chars_def]
  _ \\_rpt (IF_CASES_TAC_\\ fs [] \\ rpt strip_tac \\ fs [])
  _ \\ intLib.COOPER_TAC)
  TH