src/HOL/SMT/Tools/smt_translate.ML
changeset 33664 d62805a237ef
parent 33299 73af7831ba1e
child 34010 ac78f5cdc430
equal deleted inserted replaced
33663:a84fd6385832 33664:d62805a237ef
   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 =>