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