# File MuIOAOracle.ML

    (* $Id: MuIOAOracle.ML,v 1.5 2005/09/03 14:47:40 wenzelm Exp $ *)

    (* call_sim_tac invokes oracle "Sim" *)
    fun call_sim_tac thm_list i state =
    let val sign = #sign (rep_thm state);
            val (subgoal::_) = Library.drop(i-1,prems_of state);
            val OraAss = sim_oracle sign (subgoal,thm_list);
    in
    (cut_facts_tac [OraAss] i) state
    end;

    (* is_sim_tac makes additionally to call_sim_tac some simplifications,
    	which are suitable for implementation realtion formulas *)
    fun is_sim_tac thm_list i state =
    let val sign = #sign (rep_thm state);
    in
    case Library.drop(i-1,prems_of state) of
            [] => no_tac state |
            subgoal::_ => EVERY[REPEAT(etac thin_rl i),
                            simp_tac (simpset() addsimps [ioa_implements_def]) i,
                            rtac conjI i,
                            rtac conjI (i+1),
    			TRY(call_sim_tac thm_list (i+2)),
    			TRY(atac (i+2)),
                            REPEAT(rtac refl (i+2)),
    	 		simp_tac (simpset() addsimps (thm_list @
    				comp_simps @ restrict_simps @ hide_simps @
    				rename_simps @  ioa_simps @ asig_simps)) (i+1),
    		 	simp_tac (simpset() addsimps (thm_list @
    				comp_simps @ restrict_simps @ hide_simps @
    				rename_simps @ ioa_simps @ asig_simps)) (i)] state
    end;