1147 |
1147 |
1148 |
1148 |
1149 |
1149 |
1150 (*** Oracles ***) |
1150 (*** Oracles ***) |
1151 |
1151 |
1152 fun add_oracle (b, oracle_fn) thy = |
1152 fun add_oracle (b, oracle_fn) thy1 = |
1153 let |
1153 let |
1154 val (name, oracles') = Name_Space.define (Context.Theory thy) true (b, ()) (get_oracles thy); |
1154 val (name, oracles') = Name_Space.define (Context.Theory thy1) true (b, ()) (get_oracles thy1); |
1155 val thy' = map_oracles (K oracles') thy; |
1155 val thy2 = map_oracles (K oracles') thy1; |
1156 fun invoke_oracle arg = |
1156 fun invoke_oracle arg = |
1157 let val ct as Cterm {cert = cert2, t = prop, T, maxidx, sorts} = oracle_fn arg in |
1157 let val ct as Cterm {cert = cert2, t = prop, T, maxidx, sorts} = oracle_fn arg in |
1158 if T <> propT then |
1158 if T <> propT then |
1159 raise THM ("Oracle's result must have type prop: " ^ name, 0, []) |
1159 raise THM ("Oracle's result must have type prop: " ^ name, 0, []) |
1160 else |
1160 else |
1161 let |
1161 let |
1162 val cert = Context.join_certificate (Context.Certificate thy', cert2); |
1162 val cert = Context.join_certificate (Context.Certificate thy2, cert2); |
1163 val proofs = Proofterm.get_proofs_level (); |
1163 val proofs = Proofterm.get_proofs_level (); |
1164 val oracle = |
1164 val oracle = |
1165 if Proofterm.oracle_enabled proofs |
1165 if Proofterm.oracle_enabled proofs |
1166 then ((name, Position.thread_data ()), SOME prop) |
1166 then ((name, Position.thread_data ()), SOME prop) |
1167 else ((name, Position.none), NONE); |
1167 else ((name, Position.none), NONE); |
1170 then Proofterm.oracle_proof name prop |
1170 then Proofterm.oracle_proof name prop |
1171 else MinProof; |
1171 else MinProof; |
1172 val zproof = |
1172 val zproof = |
1173 if Proofterm.zproof_enabled proofs then |
1173 if Proofterm.zproof_enabled proofs then |
1174 let |
1174 let |
1175 val thy'' = Context.certificate_theory cert handle ERROR msg => |
1175 val thy = Context.certificate_theory cert handle ERROR msg => |
1176 raise CONTEXT (msg, [], [ct], [], SOME (Context.Theory thy')); |
1176 raise CONTEXT (msg, [], [ct], [], SOME (Context.Theory thy2)); |
1177 in ZTerm.oracle_proof thy'' name prop end |
1177 in ZTerm.oracle_proof thy name prop end |
1178 else ZDummy; |
1178 else ZDummy; |
1179 in |
1179 in |
1180 Thm (make_deriv [] [oracle] [] [] zproof proof, |
1180 Thm (make_deriv [] [oracle] [] [] zproof proof, |
1181 {cert = cert, |
1181 {cert = cert, |
1182 tags = [], |
1182 tags = [], |
1186 hyps = [], |
1186 hyps = [], |
1187 tpairs = [], |
1187 tpairs = [], |
1188 prop = prop}) |
1188 prop = prop}) |
1189 end |
1189 end |
1190 end; |
1190 end; |
1191 in ((name, invoke_oracle), thy') end; |
1191 in ((name, invoke_oracle), thy2) end; |
1192 |
1192 |
1193 val oracle_space = Name_Space.space_of_table o get_oracles; |
1193 val oracle_space = Name_Space.space_of_table o get_oracles; |
1194 |
1194 |
1195 fun pretty_oracle ctxt = |
1195 fun pretty_oracle ctxt = |
1196 Name_Space.pretty ctxt (oracle_space (Proof_Context.theory_of ctxt)); |
1196 Name_Space.pretty ctxt (oracle_space (Proof_Context.theory_of ctxt)); |