140 local |
140 local |
141 val dest_nat = (fn |
141 val dest_nat = (fn |
142 SApp (SConst (@{const_name nat}, _), [SApp (SNum (i, _), _)]) => SOME i |
142 SApp (SConst (@{const_name nat}, _), [SApp (SNum (i, _), _)]) => SOME i |
143 | _ => NONE) |
143 | _ => NONE) |
144 in |
144 in |
145 fun bv_rotate mk_name T ts = |
145 fun bv_rotate mk_name _ ts = |
146 dest_nat (hd ts) |> Option.map (fn i => (mk_name i, tl ts)) |
146 dest_nat (hd ts) |> Option.map (fn i => (mk_name i, tl ts)) |
147 |
147 |
148 fun bv_extend mk_name T ts = |
148 fun bv_extend mk_name T ts = |
149 (case (try dest_wordT (domain_type T), try dest_wordT (range_type T)) of |
149 (case (try dest_wordT (domain_type T), try dest_wordT (range_type T)) of |
150 (SOME i, SOME j) => if j - i >= 0 then SOME (mk_name (j - i), ts) else NONE |
150 (SOME i, SOME j) => if j - i >= 0 then SOME (mk_name (j - i), ts) else NONE |
194 | @{const_name Ex} => SOME SExists |
194 | @{const_name Ex} => SOME SExists |
195 | _ => NONE) |
195 | _ => NONE) |
196 |
196 |
197 fun group_quant qname vs (t as Const (q, _) $ Abs (n, T, u)) = |
197 fun group_quant qname vs (t as Const (q, _) $ Abs (n, T, u)) = |
198 if q = qname then group_quant qname ((n, T) :: vs) u else (vs, t) |
198 if q = qname then group_quant qname ((n, T) :: vs) u else (vs, t) |
199 | group_quant qname vs t = (vs, t) |
199 | group_quant _ vs t = (vs, t) |
200 |
200 |
201 fun dest_trigger (@{term trigger} $ tl $ t) = (HOLogic.dest_list tl, t) |
201 fun dest_trigger (@{term trigger} $ tl $ t) = (HOLogic.dest_list tl, t) |
202 | dest_trigger t = ([], t) |
202 | dest_trigger t = ([], t) |
203 |
203 |
204 fun pat f ts (Const (@{const_name pat}, _) $ t) = SPat (rev (f t :: ts)) |
204 fun pat f ts (Const (@{const_name pat}, _) $ t) = SPat (rev (f t :: ts)) |
206 | pat f ts (Const (@{const_name andpat}, _) $ p $ t) = pat f (f t :: ts) p |
206 | pat f ts (Const (@{const_name andpat}, _) $ p $ t) = pat f (f t :: ts) p |
207 | pat _ _ t = raise TERM ("pat", [t]) |
207 | pat _ _ t = raise TERM ("pat", [t]) |
208 |
208 |
209 fun trans Ts t = |
209 fun trans Ts t = |
210 (case Term.strip_comb t of |
210 (case Term.strip_comb t of |
211 (t1 as Const (qn, qT), [t2 as Abs (n, T, t3)]) => |
211 (Const (qn, _), [Abs (n, T, t1)]) => |
212 (case quantifier qn of |
212 (case quantifier qn of |
213 SOME q => |
213 SOME q => |
214 let |
214 let |
215 val (vs, u) = group_quant qn [(n, T)] t3 |
215 val (vs, u) = group_quant qn [(n, T)] t1 |
216 val Us = map snd vs @ Ts |
216 val Us = map snd vs @ Ts |
217 val (ps, b) = dest_trigger u |
217 val (ps, b) = dest_trigger u |
218 in SQuant (q, rev vs, map (pat (trans Us) []) ps, trans Us b) end |
218 in SQuant (q, rev vs, map (pat (trans Us) []) ps, trans Us b) end |
219 | NONE => raise TERM ("intermediate", [t])) |
219 | NONE => raise TERM ("intermediate", [t])) |
220 | (Const (@{const_name Let}, _), [t1, Abs (n, T, t2)]) => |
220 | (Const (@{const_name Let}, _), [t1, Abs (n, T, t2)]) => |
275 | SQuant (_, vs, _, u) => get_loc loc (i + length vs) u) |
275 | SQuant (_, vs, _, u) => get_loc loc (i + length vs) u) |
276 and get_locs loc i ts = fold (either o get_loc loc i) ts NONE |
276 and get_locs loc i ts = fold (either o get_loc loc i) ts NONE |
277 |
277 |
278 fun sep loc t = |
278 fun sep loc t = |
279 (case t of |
279 (case t of |
280 SVar i => pair t |
280 SVar _ => pair t |
281 | SApp (c as SConst (@{const_name If}, _), u :: us) => |
281 | SApp (c as SConst (@{const_name If}, _), u :: us) => |
282 mark sep false u ##>> fold_map (sep loc) us #>> app c o (op ::) |
282 mark sep false u ##>> fold_map (sep loc) us #>> app c o (op ::) |
283 | SApp (c, us) => |
283 | SApp (c, us) => |
284 if not loc andalso member (op =) connectives c |
284 if not loc andalso member (op =) connectives c |
285 then fold_map (sep loc) us #>> app c |
285 then fold_map (sep loc) us #>> app c |
427 SOME n => (n, st) |
427 SOME n => (n, st) |
428 | NONE => |
428 | NONE => |
429 let val (n, ns') = fresh_typ ns |
429 let val (n, ns') = fresh_typ ns |
430 in (n, (vars, ns', add_typ (T, n) sgn)) end) |
430 in (n, (vars, ns', add_typ (T, n) sgn)) end) |
431 |
431 |
432 fun rep_var bs (n, T) (vars, ns, sgn) = |
432 fun rep_var bs (_, T) (vars, ns, sgn) = |
433 let val (n', vars') = fresh_name vars |
433 let val (n', vars') = fresh_name vars |
434 in (vars', ns, sgn) |> rep_typ bs T |>> pair n' end |
434 in (vars', ns, sgn) |> rep_typ bs T |>> pair n' end |
435 |
435 |
436 fun rep_fun bs loc t T i (st as (_, _, sgn0)) = |
436 fun rep_fun bs loc t T i (st as (_, _, sgn0)) = |
437 (case lookup_fun loc sgn0 t of |
437 (case lookup_fun loc sgn0 t of |
456 val {builtin_fun, ...} = builtins |
456 val {builtin_fun, ...} = builtins |
457 |
457 |
458 fun sign loc t = |
458 fun sign loc t = |
459 (case t of |
459 (case t of |
460 SVar i => pair (SVar i) |
460 SVar i => pair (SVar i) |
461 | SApp (c as SConst (@{const_name term}, _), [u]) => |
461 | SApp (SConst (@{const_name term}, _), [u]) => |
462 sign true u #>> app term_marker o single |
462 sign true u #>> app term_marker o single |
463 | SApp (c as SConst (@{const_name formula}, _), [u]) => |
463 | SApp (SConst (@{const_name formula}, _), [u]) => |
464 sign false u #>> app formula_marker o single |
464 sign false u #>> app formula_marker o single |
465 | SApp (SConst (c as (_, T)), ts) => |
465 | SApp (SConst (c as (_, T)), ts) => |
466 (case builtin_lookup (builtin_fun loc) thy c ts of |
466 (case builtin_lookup (builtin_fun loc) thy c ts of |
467 SOME (n, ts') => fold_map (sign loc) ts' #>> app n |
467 SOME (n, ts') => fold_map (sign loc) ts' #>> app n |
468 | NONE => |
468 | NONE => |