src/Pure/Isar/interpretation.ML
changeset 67450 b0ae74b86ef3
parent 66334 b210ae666a42
child 67702 2d9918f5b33c
equal deleted inserted replaced
67449:1caeb087d957 67450:b0ae74b86ef3
    53 
    53 
    54 (* reading of locale expressions with rewrite morphisms *)
    54 (* reading of locale expressions with rewrite morphisms *)
    55 
    55 
    56 local
    56 local
    57 
    57 
    58 fun augment_with_def prep_term deps ((name, atts), ((b, mx), raw_rhs)) lthy =
    58 fun augment_with_def prep_term ((name, atts), ((b, mx), raw_rhs)) lthy =
    59   let
    59   let
    60     val rhs = prep_term lthy raw_rhs;
    60     val rhs = prep_term lthy raw_rhs;
    61     val lthy' = Variable.declare_term rhs lthy;
    61     val lthy' = Variable.declare_term rhs lthy;
    62     val ((_, (_, def)), lthy'') =
    62     val ((_, (_, def)), lthy'') =
    63       Local_Theory.define ((b, mx), ((Thm.def_binding_optional b name, atts), rhs)) lthy';
    63       Local_Theory.define ((b, mx), ((Thm.def_binding_optional b name, atts), rhs)) lthy';
    64   in (def, lthy'') end;
    64   in (def, lthy'') end;
    65 
    65 
    66 fun augment_with_defs prep_term [] deps ctxt = ([], ctxt)
    66 fun augment_with_defs _ [] _ ctxt = ([], ctxt)
    67       (*quasi-inhomogeneous type: definitions demand local theory rather than bare proof context*)
    67       (*quasi-inhomogeneous type: definitions demand local theory rather than bare proof context*)
    68   | augment_with_defs prep_term raw_defs deps lthy =
    68   | augment_with_defs prep_term raw_defs deps lthy =
    69       let
    69       let
    70         val (_, inner_lthy) =
    70         val (_, inner_lthy) =
    71           Local_Theory.open_target lthy
    71           Local_Theory.open_target lthy
    72           ||> fold Locale.activate_declarations deps;
    72           ||> fold Locale.activate_declarations deps;
    73         val (inner_defs, inner_lthy') =
    73         val (inner_defs, inner_lthy') =
    74           fold_map (augment_with_def prep_term deps) raw_defs inner_lthy;
    74           fold_map (augment_with_def prep_term) raw_defs inner_lthy;
    75         val lthy' =
    75         val lthy' =
    76           inner_lthy'
    76           inner_lthy'
    77           |> Local_Theory.close_target;
    77           |> Local_Theory.close_target;
    78         val def_eqns =
    78         val def_eqns =
    79           map (singleton (Proof_Context.export inner_lthy' lthy') o Thm.symmetric) inner_defs
    79           map (singleton (Proof_Context.export inner_lthy' lthy') o Thm.symmetric) inner_defs
    80       in (def_eqns, lthy') end;
    80       in (def_eqns, lthy') end;
    81 
    81 
    82 fun prep_eqns prep_props prep_attr [] deps ctxt = ([], [])
    82 fun prep_eqns _ _ [] _ _ = ([], [])
    83   | prep_eqns prep_props prep_attr raw_eqns deps ctxt =
    83   | prep_eqns prep_props prep_attr raw_eqns deps ctxt =
    84       let
    84       let
       
    85         (* FIXME incompatibility, creating context for parsing rewrites equation may fail in
       
    86            presence of replaces clause *)
    85         val ctxt' = fold Locale.activate_declarations deps ctxt;
    87         val ctxt' = fold Locale.activate_declarations deps ctxt;
    86         val eqns =
    88         val eqns =
    87           (Variable.export_terms ctxt' ctxt o prep_props ctxt' o map snd) raw_eqns;
    89           (Variable.export_terms ctxt' ctxt o prep_props ctxt' o map snd) raw_eqns;
    88         val attrss = map (apsnd (map (prep_attr ctxt)) o fst) raw_eqns;
    90         val attrss = map (apsnd (map (prep_attr ctxt)) o fst) raw_eqns;
    89       in (eqns, attrss) end;
    91       in (eqns, attrss) end;
    90 
    92 
    91 fun prep_interpretation prep_expr prep_term prep_props prep_attr
    93 fun prep_interpretation prep_expr prep_term prep_props prep_attr
    92   expression raw_defs raw_eqns initial_ctxt =
    94   expression raw_defs raw_eqns initial_ctxt =
    93   let
    95   let
    94     val ((propss, deps, export), expr_ctxt) = prep_expr expression initial_ctxt;
    96     val ((propss, eq_propss, deps, eqnss, export), expr_ctxt) = prep_expr expression initial_ctxt;
    95     val (def_eqns, def_ctxt) =
    97     val (def_eqns, def_ctxt) =
    96       augment_with_defs prep_term raw_defs deps expr_ctxt;
    98       augment_with_defs prep_term raw_defs deps expr_ctxt;
    97     val (eqns, attrss) = prep_eqns prep_props prep_attr raw_eqns deps def_ctxt;
    99     val (eqns, attrss) = prep_eqns prep_props prep_attr raw_eqns deps def_ctxt;
    98     val goal_ctxt = fold Variable.auto_fixes eqns def_ctxt;
   100     val goal_ctxt = fold Variable.auto_fixes eqns def_ctxt;
    99     val export' = Variable.export_morphism goal_ctxt expr_ctxt;
   101     val export' = Variable.export_morphism goal_ctxt expr_ctxt;
   100   in (((propss, deps, export, export'), (def_eqns, eqns, attrss)), goal_ctxt) end;
   102   in (((propss, eq_propss, deps, eqnss, export, export'), (def_eqns, eqns, attrss)), goal_ctxt) end;
   101 
   103 
   102 in
   104 in
   103 
   105 
   104 fun cert_interpretation expression =
   106 fun cert_interpretation expression =
   105   prep_interpretation Expression.cert_goal_expression Syntax.check_term
   107   prep_interpretation Expression.cert_goal_expression Syntax.check_term
   117 local
   119 local
   118 
   120 
   119 fun meta_rewrite eqns ctxt =
   121 fun meta_rewrite eqns ctxt =
   120   (map (Local_Defs.abs_def_rule ctxt) (maps snd eqns), ctxt);
   122   (map (Local_Defs.abs_def_rule ctxt) (maps snd eqns), ctxt);
   121 
   123 
   122 fun note_eqns_register pos note activate deps witss def_eqns eqns attrss export export' ctxt =
   124 fun note_eqns_register pos note activate deps eqnss witss def_eqns thms attrss export export' ctxt =
   123   let
   125   let
       
   126     val (thmss, thms') = split_last (unflat ((map o map) fst eqnss @ [attrss]) thms);
       
   127     val factss =
       
   128       map2 (map2 (fn b => fn eq => (b, [([Morphism.thm export eq], [])]))) ((map o map) fst eqnss) thmss;
       
   129     val (eqnss', ctxt') = fold_map (fn facts => note Thm.theoremK facts #-> meta_rewrite) factss ctxt;
   124     val facts =
   130     val facts =
   125       (Binding.empty_atts, [(map (Morphism.thm (export' $> export)) def_eqns, [])]) ::
   131       (Binding.empty_atts, [(map (Morphism.thm (export' $> export)) def_eqns, [])]) ::
   126         map2 (fn attrs => fn eqn => (attrs, [([Morphism.thm (export' $> export) eqn], [])]))
   132         map2 (fn attrs => fn eqn => (attrs, [([Morphism.thm (export' $> export) eqn], [])]))
   127           attrss eqns;
   133           attrss thms';
   128     val (eqns', ctxt') = ctxt
   134     val (eqns', ctxt'') = ctxt'
   129       |> note Thm.theoremK facts
   135       |> note Thm.theoremK facts
   130       |-> meta_rewrite;
   136       |-> meta_rewrite;
   131     val dep_morphs =
   137     val dep_morphs =
   132       map2 (fn (dep, morph) => fn wits =>
   138       map2 (fn (dep, morph) => fn wits =>
   133         let val morph' = morph
   139         let val morph' = morph
   134           $> Element.satisfy_morphism (map (Element.transform_witness export') wits)
   140           $> Element.satisfy_morphism (map (Element.transform_witness export') wits)
   135           $> Morphism.binding_morphism "position" (Binding.set_pos pos)
   141           $> Morphism.binding_morphism "position" (Binding.set_pos pos)
   136         in (dep, morph') end) deps witss;
   142         in (dep, morph') end) deps witss;
   137     fun activate' dep_morph ctxt =
   143     fun activate' (dep_morph, eqns) ctxt =
   138       activate dep_morph
   144       activate dep_morph
   139         (Option.map (rpair true) (Element.eq_morphism (Proof_Context.theory_of ctxt) eqns'))
   145         (Option.map (rpair true) (Element.eq_morphism (Proof_Context.theory_of ctxt) (eqns @ eqns')))
   140         export ctxt;
   146         export ctxt;
   141   in ctxt' |> fold activate' dep_morphs end;
   147   in ctxt'' |> fold activate' (dep_morphs ~~ eqnss') end;
   142 
   148 
   143 in
   149 in
   144 
   150 
   145 fun generic_interpretation prep_interpretation setup_proof note add_registration
   151 fun generic_interpretation prep_interpretation setup_proof note add_registration
   146     expression raw_defs raw_eqns initial_ctxt =
   152     expression raw_defs raw_eqns initial_ctxt =
   147   let
   153   let
   148     val (((propss, deps, export, export'), (def_eqns, eqns, attrss)), goal_ctxt) =
   154     val (((propss, eq_propss, deps, eqnss, export, export'), (def_eqns, eqns, attrss)), goal_ctxt) =
   149       prep_interpretation expression raw_defs raw_eqns initial_ctxt;
   155       prep_interpretation expression raw_defs raw_eqns initial_ctxt;
   150     val pos = Position.thread_data ();
   156     val pos = Position.thread_data ();
   151     fun after_qed witss eqns =
   157     fun after_qed witss eqns =
   152       note_eqns_register pos note add_registration deps witss def_eqns eqns attrss export export';
   158       note_eqns_register pos note add_registration deps eqnss witss def_eqns eqns attrss export export';
   153   in setup_proof after_qed propss eqns goal_ctxt end;
   159   in setup_proof after_qed propss (flat (eq_propss @ [eqns])) goal_ctxt end;
   154 
   160 
   155 end;
   161 end;
   156 
   162 
   157 
   163 
   158 (** interfaces **)
   164 (** interfaces **)