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 **) |