src/Pure/thm.ML
changeset 79322 f321ab14dd94
parent 79321 dbfe6d1fdfb6
child 79323 3bbe31b35f5b
equal deleted inserted replaced
79321:dbfe6d1fdfb6 79322:f321ab14dd94
  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));