src/HOL/Tools/SMT2/smt2_translate.ML
changeset 56104 fd6e132ee4fb
parent 56096 3e717b56e955
child 56125 e03c0f6ad1b6
equal deleted inserted replaced
56103:6689512f3710 56104:fd6e132ee4fb
   319     @{lemma "if P then True else False == P" by (rule eq_reflection) simp}]
   319     @{lemma "if P then True else False == P" by (rule eq_reflection) simp}]
   320 
   320 
   321   exception BAD_PATTERN of unit
   321   exception BAD_PATTERN of unit
   322 
   322 
   323   fun wrap_in_if pat t =
   323   fun wrap_in_if pat t =
   324     if pat then raise BAD_PATTERN ()
   324     if pat then raise BAD_PATTERN () else @{const If (bool)} $ t $ @{const True} $ @{const False}
   325     else @{const If (bool)} $ t $ @{const True} $ @{const False}
       
   326 
   325 
   327   fun is_builtin_conn_or_pred ctxt c ts =
   326   fun is_builtin_conn_or_pred ctxt c ts =
   328     is_some (SMT2_Builtin.dest_builtin_conn ctxt c ts) orelse
   327     is_some (SMT2_Builtin.dest_builtin_conn ctxt c ts) orelse
   329     is_some (SMT2_Builtin.dest_builtin_pred ctxt c ts)
   328     is_some (SMT2_Builtin.dest_builtin_pred ctxt c ts)
   330 in
   329 in
   336     fun in_term pat t =
   335     fun in_term pat t =
   337       (case Term.strip_comb t of
   336       (case Term.strip_comb t of
   338         (@{const True}, []) => t
   337         (@{const True}, []) => t
   339       | (@{const False}, []) => t
   338       | (@{const False}, []) => t
   340       | (u as Const (@{const_name If}, _), [t1, t2, t3]) =>
   339       | (u as Const (@{const_name If}, _), [t1, t2, t3]) =>
   341           if pat then raise BAD_PATTERN ()
   340           if pat then raise BAD_PATTERN () else u $ in_form t1 $ in_term pat t2 $ in_term pat t3
   342           else u $ in_form t1 $ in_term pat t2 $ in_term pat t3
       
   343       | (Const (c as (n, _)), ts) =>
   341       | (Const (c as (n, _)), ts) =>
   344           if is_builtin_conn_or_pred ctxt c ts then wrap_in_if pat (in_form t)
   342           if is_builtin_conn_or_pred ctxt c ts then wrap_in_if pat (in_form t)
   345           else if is_quant n then wrap_in_if pat (in_form t)
   343           else if is_quant n then wrap_in_if pat (in_form t)
   346           else Term.list_comb (Const c, map (in_term pat) ts)
   344           else Term.list_comb (Const c, map (in_term pat) ts)
   347       | (Free c, ts) => Term.list_comb (Free c, map (in_term pat) ts)
   345       | (Free c, ts) => Term.list_comb (Free c, map (in_term pat) ts)
   355       | in_pat ((p as Const (@{const_name SMT2.nopat}, _)) $ t) =
   353       | in_pat ((p as Const (@{const_name SMT2.nopat}, _)) $ t) =
   356           p $ in_term true t
   354           p $ in_term true t
   357       | in_pat t = raise TERM ("bad pattern", [t])
   355       | in_pat t = raise TERM ("bad pattern", [t])
   358 
   356 
   359     and in_pats ps =
   357     and in_pats ps =
   360       in_list @{typ "SMT2.pattern list"}
   358       in_list @{typ "SMT2.pattern list"} (SOME o in_list @{typ SMT2.pattern} (try in_pat)) ps
   361         (SOME o in_list @{typ SMT2.pattern} (try in_pat)) ps
   359 
   362 
   360     and in_trigger ((c as @{const SMT2.trigger}) $ p $ t) = c $ in_pats p $ in_weight t
   363     and in_trigger ((c as @{const SMT2.trigger}) $ p $ t) =
       
   364           c $ in_pats p $ in_weight t
       
   365       | in_trigger t = in_weight t
   361       | in_trigger t = in_weight t
   366 
   362 
   367     and in_form t =
   363     and in_form t =
   368       (case Term.strip_comb t of
   364       (case Term.strip_comb t of
   369         (q as Const (qn, _), [Abs (n, T, u)]) =>
   365         (q as Const (qn, _), [Abs (n, T, u)]) =>
   460  
   456  
   461     and transs t T ts =
   457     and transs t T ts =
   462       let val (Us, U) = SMT2_Util.dest_funT (length ts) T
   458       let val (Us, U) = SMT2_Util.dest_funT (length ts) T
   463       in
   459       in
   464         fold_map transT Us ##>> transT U #-> (fn Up =>
   460         fold_map transT Us ##>> transT U #-> (fn Up =>
   465         add_fun t (SOME Up) ##>> fold_map trans ts #>> SApp)
   461           add_fun t (SOME Up) ##>> fold_map trans ts #>> SApp)
   466       end
   462       end
   467 
   463 
   468     val (us, trx') = fold_map trans ts trx
   464     val (us, trx') = fold_map trans ts trx
   469   in ((sign_of (header ts) dtyps trx', us), trx') end
   465   in ((sign_of (header ts) dtyps trx', us), trx') end
   470 
   466 
   526           map mk_trigger defs @ ts'
   522           map mk_trigger defs @ ts'
   527           |> intro_explicit_application ctxt' funcs 
   523           |> intro_explicit_application ctxt' funcs 
   528           |> pair ctxt')
   524           |> pair ctxt')
   529 
   525 
   530     val ((rewrite_rules, builtin), ts4) = folify ctxt2 ts3
   526     val ((rewrite_rules, builtin), ts4) = folify ctxt2 ts3
   531 
   527       |>> apfst (cons fun_app_eq)
   532     val rewrite_rules' = fun_app_eq :: rewrite_rules
       
   533   in
   528   in
   534     (ts4, tr_context)
   529     (ts4, tr_context)
   535     |-> intermediate header dtyps (builtin SMT2_Builtin.dest_builtin) ctxt2
   530     |-> intermediate header dtyps (builtin SMT2_Builtin.dest_builtin) ctxt2
   536     |>> uncurry (serialize comments)
   531     |>> uncurry (serialize comments)
   537     ||> replay_data_of ctxt2 rewrite_rules' ithms
   532     ||> replay_data_of ctxt2 rewrite_rules ithms
   538   end
   533   end
   539 
   534 
   540 end
   535 end