1251881Speterstructure patricia_castsSyntax :> patricia_castsSyntax = 2251881Speterstruct 3251881Speter 4251881Speter(* interactive use: 5251881Speter app load ["pred_setSyntax", "wordsSyntax", "patriciaSyntax", 6251881Speter "patricia_castsTheory"]; 7251881Speter*) 8251881Speter 9251881Speteropen Abbrev HolKernel pred_setSyntax wordsSyntax patriciaSyntax 10251881Speter patricia_castsTheory; 11251881Speter 12251881Speterval ERR = mk_HOL_ERR "patricia_castsSyntax" 13251881Speter 14251881Speter(* ------------------------------------------------------------------------- *) 15251881Speter 16251881Speterfun mk_word_ptree_type (aty, bty) = 17251881Speter Type.mk_thy_type{Tyop="word_ptree", Thy="patricia_casts", Args = [aty, bty]}; 18251881Speter 19251881Speterfun dest_word_ptree_type ty = 20251881Speter case total dest_thy_type ty of 21251881Speter SOME {Tyop="word_ptree",Thy="patricia_casts",Args=[aty, bty]} => (aty, bty) 22251881Speter | _ => raise ERR "dest_word_ptree_type" 23251881Speter "not an instance of ('a,'b) word_ptree"; 24251881Speter 25251881Speterval is_word_ptree_type = Lib.can dest_word_ptree_type; 26251881Speter 27251881Speter(* ......................................................................... *) 28251881Speter 29251881Speterfun mk_pat_const s = prim_mk_const{Name = s, Thy = "patricia_casts"}; 30251881Speter 31251881Speterval the_ptree_tm = mk_pat_const "THE_PTREE" 32251881Speterval some_ptree_tm = mk_pat_const "SOME_PTREE" 33251881Speterval wordempty_tm = mk_pat_const "WordEmpty"; 34251881Speter 35251881Speterval peekw_tm = mk_pat_const "PEEKw" 36251881Speterval findw_tm = mk_pat_const "FINDw" 37251881Speterval addw_tm = mk_pat_const "ADDw" 38251881Speterval add_listw_tm = mk_pat_const "ADD_LISTw" 39251881Speterval removew_tm = mk_pat_const "REMOVEw" 40251881Speterval traversew_tm = mk_pat_const "TRAVERSEw" 41251881Speterval keysw_tm = mk_pat_const "KEYSw" 42251881Speterval transformw_tm = mk_pat_const "TRANSFORMw" 43251881Speterval every_leafw_tm = mk_pat_const "EVERY_LEAFw" 44251881Speterval exists_leafw_tm = mk_pat_const "EXISTS_LEAFw" 45251881Speterval sizew_tm = mk_pat_const "SIZEw" 46251881Speterval depthw_tm = mk_pat_const "DEPTHw" 47251881Speterval in_ptreew_tm = mk_pat_const "IN_PTREEw" 48251881Speterval insert_ptreew_tm = mk_pat_const "INSERT_PTREEw" 49251881Speterval ptree_of_wordset_tm = mk_pat_const "PTREE_OF_WORDSET" 50251881Speterval wordset_of_ptree_tm = mk_pat_const "WORDSET_OF_PTREE"; 51251881Speter 52251881Speter(* ......................................................................... *) 53251881Speter 54251881Speterval peeks_tm = mk_pat_const "PEEKs" 55251881Speterval finds_tm = mk_pat_const "FINDs" 56251881Speterval adds_tm = mk_pat_const "ADDs" 57251881Speterval add_lists_tm = mk_pat_const "ADD_LISTs" 58251881Speterval removes_tm = mk_pat_const "REMOVEs" 59251881Speterval traverses_tm = mk_pat_const "TRAVERSEs" 60251881Speterval keyss_tm = mk_pat_const "KEYSs" 61251881Speterval in_ptrees_tm = mk_pat_const "IN_PTREEs" 62251881Speterval insert_ptrees_tm = mk_pat_const "INSERT_PTREEs" 63251881Speterval ptree_of_stringset_tm = mk_pat_const "PTREE_OF_STRINGSET" 64251881Speterval stringset_of_ptree_tm = mk_pat_const "STRINGSET_OF_PTREE"; 65251881Speter 66251881Speter(* ......................................................................... *) 67251881Speter 68251881Speterfun mk_wordempty(aty, bty) = 69251881Speter inst[alpha |-> aty, beta |-> bty] wordempty_tm 70251881Speter handle HOL_ERR _ => raise ERR "mk_wordempty" ""; 71251881Speter 72251881Speterfun mk_the_ptree t = 73251881Speterlet val (tya,tyb) = dest_word_ptree_type (type_of t) in 74251881Speter mk_comb(inst[alpha |-> tyb, beta |-> tya] the_ptree_tm,t) 75251881Speterend handle HOL_ERR _ => raise ERR "mk_the_ptree" ""; 76251881Speter 77251881Speterfun mk_some_ptree(ty,t) = 78251881Speter mk_comb(inst[alpha |-> ty, 79251881Speter beta |-> dest_ptree_type (type_of t)] some_ptree_tm,t) 80251881Speter handle HOL_ERR _ => raise ERR "mk_some_ptree" ""; 81251881Speter 82251881Speterfun mk_peekw(t,k) = 83251881Speterlet val (tya,tyb) = dest_word_ptree_type (type_of t) in 84251881Speter list_mk_comb(inst[alpha |-> tya, beta |-> tyb] peekw_tm,[t,k]) 85251881Speterend handle HOL_ERR _ => raise ERR "mk_peekw" ""; 86251881Speter 87251881Speterfun mk_findw(t,k) = 88251881Speterlet val (tya,tyb) = dest_word_ptree_type (type_of t) in 89251881Speter list_mk_comb(inst[alpha |-> tyb, beta |-> tya] findw_tm,[t,k]) 90251881Speterend handle HOL_ERR _ => raise ERR "mk_findw" ""; 91251881Speter 92251881Speterfun mk_addw(t,x) = 93251881Speterlet val (tya,tyb) = dest_word_ptree_type (type_of t) in 94251881Speter list_mk_comb(inst[alpha |-> tya, beta |-> tyb] addw_tm,[t,x]) 95251881Speterend handle HOL_ERR _ => raise ERR "mk_addw" ""; 96251881Speter 97251881Speterfun mk_add_listw(t,l) = 98251881Speterlet val (tya,tyb) = dest_word_ptree_type (type_of t) in 99251881Speter list_mk_comb(inst[alpha |-> tya, beta |-> tyb] add_listw_tm,[t,l]) 100251881Speterend handle HOL_ERR _ => raise ERR "mk_add_listw" ""; 101251881Speter 102251881Speterfun mk_removew(t,k) = 103251881Speterlet val (tya,tyb) = dest_word_ptree_type (type_of t) in 104251881Speter list_mk_comb(inst[alpha |-> tya, beta |-> tyb] removew_tm,[t,k]) 105251881Speterend handle HOL_ERR _ => raise ERR "mk_removew" ""; 106251881Speter 107251881Speterfun mk_traversew t = 108251881Speterlet val (tya,tyb) = dest_word_ptree_type (type_of t) in 109251881Speter mk_comb(inst[alpha |-> tya, beta |-> tyb] traversew_tm,t) 110251881Speterend handle HOL_ERR _ => raise ERR "mk_traversew" ""; 111251881Speter 112251881Speterfun mk_keysw t = 113251881Speterlet val (tya,tyb) = dest_word_ptree_type (type_of t) in 114251881Speter mk_comb(inst[alpha |-> tya, beta |-> tyb] keysw_tm,t) 115251881Speterend handle HOL_ERR _ => raise ERR "mk_keysw" ""; 116251881Speter 117251881Speterfun mk_transformw(f,t) = 118251881Speterlet val (typb, typa) = dom_rng (type_of f) 119251881Speter val tyc = fst (dest_word_ptree_type (type_of t)) 120251881Speterin 121251881Speter list_mk_comb(inst[alpha |-> typa, beta |-> typb, 122251881Speter gamma |-> tyc] transformw_tm,[f,t]) 123251881Speterend handle HOL_ERR _ => raise ERR "mk_transformw" ""; 124251881Speter 125251881Speterfun mk_every_leafw(p,t) = 126251881Speterlet val (tya,tyb) = dest_word_ptree_type (type_of t) in 127251881Speter list_mk_comb(inst[alpha |-> tya, beta |-> tyb] every_leafw_tm,[p,t]) 128251881Speterend handle HOL_ERR _ => raise ERR "mk_every_leafw" ""; 129251881Speter 130251881Speterfun mk_exists_leafw(p,t) = 131251881Speterlet val (tya,tyb) = dest_word_ptree_type (type_of t) in 132251881Speter list_mk_comb(inst[alpha |-> tya, beta |-> tyb] exists_leafw_tm,[p,t]) 133251881Speterend handle HOL_ERR _ => raise ERR "mk_exists_leafw" ""; 134251881Speter 135251881Speterfun mk_sizew t = 136251881Speterlet val (tya,tyb) = dest_word_ptree_type (type_of t) in 137251881Speter mk_comb(inst[alpha |-> tya, beta |-> tyb] sizew_tm,t) 138251881Speterend handle HOL_ERR _ => raise ERR "mk_sizew" ""; 139251881Speter 140251881Speterfun mk_depthw t = 141251881Speterlet val (tya,tyb) = dest_word_ptree_type (type_of t) in 142251881Speter mk_comb(inst[alpha |-> tya, beta |-> tyb] depthw_tm,t) 143251881Speterend handle HOL_ERR _ => raise ERR "mk_depthw" ""; 144251881Speter 145251881Speterfun mk_in_ptreew(k,t) = 146251881Speter list_mk_comb(inst[alpha |-> dest_word_type (type_of k)] in_ptreew_tm,[k,t]) 147251881Speter handle HOL_ERR _ => raise ERR "mk_in_ptreew" ""; 148251881Speter 149251881Speterfun mk_insert_ptreew(k,t) = 150251881Speter list_mk_comb 151251881Speter (inst[alpha |-> dest_word_type (type_of k)] insert_ptreew_tm,[k,t]) 152251881Speter handle HOL_ERR _ => raise ERR "mk_insert_ptreew" ""; 153251881Speter 154251881Speterfun mk_ptree_of_wordset s = 155251881Speterlet val typ = dest_word_type (dest_set_type (type_of s)) in 156251881Speter mk_comb(inst [alpha |-> typ] ptree_of_wordset_tm,s) 157251881Speterend handle HOL_ERR _ => raise ERR "mk_ptree_of_wordset" ""; 158251881Speter 159251881Speterfun mk_wordset_of_ptree t = 160251881Speterlet val typ = fst (dest_word_ptree_type (type_of t)) in 161251881Speter mk_comb(inst [alpha |-> typ] wordset_of_ptree_tm,t) 162251881Speterend handle HOL_ERR _ => raise ERR "mk_wordset_of_ptree" ""; 163251881Speter 164251881Speter(* ......................................................................... *) 165251881Speter 166251881Speterfun mk_peeks(t,k) = 167251881Speter list_mk_comb(inst[alpha |-> dest_ptree_type (type_of t)] peeks_tm,[t,k]) 168251881Speter handle HOL_ERR _ => raise ERR "mk_peeks" ""; 169251881Speter 170251881Speterfun mk_finds(t,k) = 171251881Speter list_mk_comb(inst[alpha |-> dest_ptree_type (type_of t)] finds_tm,[t,k]) 172251881Speter handle HOL_ERR _ => raise ERR "mk_finds" ""; 173251881Speter 174251881Speterfun mk_adds(t,x) = 175251881Speter list_mk_comb(inst[alpha |-> dest_ptree_type (type_of t)] adds_tm, [t,x]) 176251881Speter handle HOL_ERR _ => raise ERR "mk_adds" ""; 177251881Speter 178251881Speterfun mk_add_lists(t,l) = 179251881Speter list_mk_comb(inst[alpha |-> dest_ptree_type (type_of t)] add_lists_tm,[t,l]) 180251881Speter handle HOL_ERR _ => raise ERR "mk_add_lists" ""; 181251881Speter 182251881Speterfun mk_removes(t,k) = 183251881Speter list_mk_comb(inst[alpha |-> dest_ptree_type (type_of t)] removes_tm,[t,k]) 184251881Speter handle HOL_ERR _ => raise ERR "mk_removes" ""; 185251881Speter 186251881Speterfun mk_traverses t = 187251881Speter mk_comb(inst[alpha |-> dest_ptree_type (type_of t)] traverses_tm,t) 188251881Speter handle HOL_ERR _ => raise ERR "mk_traverses" ""; 189251881Speter 190251881Speterfun mk_keyss t = 191251881Speter mk_comb(inst[alpha |-> dest_ptree_type (type_of t)] keyss_tm,t) 192251881Speter handle HOL_ERR _ => raise ERR "mk_keyss" ""; 193251881Speter 194251881Speterfun mk_in_ptrees(k,t) = 195251881Speter list_mk_comb(in_ptrees_tm,[k,t]) 196251881Speter handle HOL_ERR _ => raise ERR "mk_in_ptrees" ""; 197251881Speter 198251881Speterfun mk_insert_ptrees(k,t) = 199251881Speter list_mk_comb (insert_ptrees_tm,[k,t]) 200251881Speter handle HOL_ERR _ => raise ERR "mk_insert_ptrees" ""; 201251881Speter 202251881Speterfun mk_ptree_of_stringset s = 203251881Speter mk_comb(ptree_of_stringset_tm,s) 204251881Speter handle HOL_ERR _ => raise ERR "mk_ptree_of_stringset" ""; 205251881Speter 206251881Speterfun mk_stringset_of_ptree s = 207251881Speter mk_comb(stringset_of_ptree_tm,s) 208251881Speter handle HOL_ERR _ => raise ERR "mk_stringset_of_ptree" ""; 209251881Speter 210251881Speter(* ......................................................................... *) 211251881Speter 212251881Speterval dest_the_ptree = dest_monop the_ptree_tm (ERR "dest_the_ptree" "") 213251881Speterval dest_some_ptree = dest_monop some_ptree_tm (ERR "dest_some_ptree" "") 214251881Speterval dest_wordempty = dest_monop wordempty_tm (ERR "dest_wordempty" "") 215251881Speterval dest_peekw = dest_binop peekw_tm (ERR "dest_peekw" "") 216251881Speterval dest_findw = dest_binop findw_tm (ERR "dest_findw" "") 217251881Speterval dest_addw = dest_binop addw_tm (ERR "dest_addw" "") 218251881Speterval dest_add_listw = dest_binop add_listw_tm (ERR "dest_add_listw" "") 219251881Speterval dest_removew = dest_binop removew_tm (ERR "dest_removew" "") 220251881Speterval dest_traversew = dest_monop traversew_tm (ERR "dest_traversew" "") 221251881Speterval dest_keysw = dest_monop keysw_tm (ERR "dest_keysw" "") 222251881Speterval dest_transformw = dest_binop transformw_tm (ERR "dest_transformw" "") 223251881Speterval dest_every_leafw = dest_binop every_leafw_tm (ERR "dest_every_leafw" "") 224251881Speterval dest_exists_leafw = dest_binop exists_leafw_tm (ERR "dest_exists_leafw" "") 225251881Speterval dest_sizew = dest_monop sizew_tm (ERR "dest_sizew" "") 226251881Speterval dest_depthw = dest_monop depthw_tm (ERR "dest_depthw" "") 227251881Speterval dest_in_ptreew = dest_binop in_ptreew_tm (ERR "dest_in_ptreew" "") 228251881Speterval dest_insert_ptreew = dest_binop insert_ptreew_tm 229251881Speter (ERR "dest_insert_ptreew" ""); 230251881Speter 231251881Speterval dest_ptree_of_wordset = 232251881Speter dest_monop ptree_of_wordset_tm (ERR "dest_ptree_of_numset" ""); 233251881Speter 234251881Speterval dest_wordset_of_ptree = 235251881Speter dest_monop wordset_of_ptree_tm (ERR "dest_numset_of_ptree" ""); 236251881Speter 237251881Speter(* ......................................................................... *) 238251881Speter 239251881Speterval dest_peeks = dest_binop peeks_tm (ERR "dest_peeks" "") 240251881Speterval dest_finds = dest_binop finds_tm (ERR "dest_finds" "") 241251881Speterval dest_adds = dest_binop adds_tm (ERR "dest_adds" "") 242251881Speterval dest_add_lists = dest_binop add_lists_tm (ERR "dest_add_lists" "") 243251881Speterval dest_removes = dest_binop removes_tm (ERR "dest_removes" "") 244253734Speterval dest_traverses = dest_monop traverses_tm (ERR "dest_traverses" "") 245251881Speterval dest_keyss = dest_monop keyss_tm (ERR "dest_keyss" "") 246251881Speterval dest_in_ptrees = dest_binop in_ptrees_tm (ERR "dest_in_ptrees" "") 247251881Speterval dest_insert_ptrees = dest_binop insert_ptrees_tm 248251881Speter (ERR "dest_insert_ptrees" ""); 249251881Speter 250251881Speterval dest_ptree_of_stringset = 251251881Speter dest_monop ptree_of_stringset_tm (ERR "dest_ptree_of_numset" ""); 252251881Speter 253251881Speterval dest_stringset_of_ptree = 254251881Speter dest_monop stringset_of_ptree_tm (ERR "dest_numset_of_ptree" ""); 255251881Speter 256251881Speter(* ......................................................................... *) 257251881Speter 258251881Speterval is_the_ptree = can dest_the_ptree 259251881Speterval is_some_ptree = can dest_some_ptree 260251881Speterval is_wordempty = can dest_wordempty 261251881Speterval is_peekw = can dest_peekw 262251881Speterval is_findw = can dest_findw 263251881Speterval is_addw = can dest_addw 264251881Speterval is_add_listw = can dest_add_listw 265251881Speterval is_removew = can dest_removew 266251881Speterval is_traversew = can dest_traversew 267251881Speterval is_keysw = can dest_keysw 268251881Speterval is_transformw = can dest_transformw 269251881Speterval is_every_leafw = can dest_every_leafw 270251881Speterval is_exists_leafw = can dest_exists_leafw 271251881Speterval is_sizew = can dest_sizew 272251881Speterval is_depthw = can dest_depthw 273251881Speterval is_in_ptreew = can dest_in_ptreew 274251881Speterval is_insert_ptreew = can dest_insert_ptreew 275251881Speterval is_ptree_of_wordset = can dest_ptree_of_wordset 276251881Speterval is_wordset_of_ptree = can dest_wordset_of_ptree; 277251881Speter 278251881Speter(* ......................................................................... *) 279251881Speter 280251881Speterval is_peeks = can dest_peeks 281251881Speterval is_finds = can dest_finds 282251881Speterval is_adds = can dest_adds 283251881Speterval is_add_lists = can dest_add_lists 284251881Speterval is_removes = can dest_removes 285251881Speterval is_traverses = can dest_traverses 286251881Speterval is_keyss = can dest_keyss 287251881Speterval is_in_ptrees = can dest_in_ptrees 288251881Speterval is_insert_ptrees = can dest_insert_ptrees 289251881Speterval is_ptree_of_stringset = can dest_ptree_of_stringset 290251881Speterval is_stringset_of_ptree = can dest_stringset_of_ptree; 291251881Speter 292251881Speterend 293251881Speter