src/HOLCF/Fix.ML
changeset 625 119391dd1d59
parent 442 13ac1fd0a14d
child 628 bb3f87f9cafe
equal deleted inserted replaced
624:33b9b5da3e6f 625:119391dd1d59
   686 	(res_inst_tac [("s","f[g[y]]"),("t","y")] subst 1),
   686 	(res_inst_tac [("s","f[g[y]]"),("t","y")] subst 1),
   687 	(etac spec 1),
   687 	(etac spec 1),
   688 	(etac cfun_arg_cong 1)
   688 	(etac cfun_arg_cong 1)
   689 	]);
   689 	]);
   690 
   690 
       
   691 (* ------------------------------------------------------------------------- *)
       
   692 (* a result about functions with flat codomain                               *)
       
   693 (* ------------------------------------------------------------------------- *)
       
   694 
       
   695 val flat_codom = prove_goalw Fix.thy [flat_def]
       
   696 "[|flat(y::'b);f[x::'a]=(c::'b)|] ==> f[UU::'a]=UU::'b | (!z.f[z::'a]=c)"
       
   697  (fn prems =>
       
   698 	[
       
   699 	(cut_facts_tac prems 1),
       
   700 	(res_inst_tac [("Q","f[x::'a]=UU::'b")] classical2 1),
       
   701 	(rtac disjI1 1),
       
   702 	(rtac UU_I 1),
       
   703 	(res_inst_tac [("s","f[x]"),("t","UU::'b")] subst 1),
       
   704 	(atac 1),
       
   705 	(rtac (minimal RS monofun_cfun_arg) 1),
       
   706 	(res_inst_tac [("Q","f[UU::'a]=UU::'b")] classical2 1),
       
   707 	(etac disjI1 1),
       
   708 	(rtac disjI2 1),
       
   709 	(rtac allI 1),
       
   710 	(res_inst_tac [("s","f[x]"),("t","c")] subst 1),
       
   711 	(atac 1),
       
   712 	(res_inst_tac [("a","f[UU::'a]")] (refl RS box_equals) 1),
       
   713 	(etac allE 1),(etac allE 1),
       
   714 	(dtac mp 1),
       
   715 	(res_inst_tac [("fo5","f")] (minimal RS monofun_cfun_arg) 1),
       
   716 	(etac disjE 1),
       
   717 	(contr_tac 1),
       
   718 	(atac 1),
       
   719 	(etac allE 1),
       
   720 	(etac allE 1),
       
   721 	(dtac mp 1),
       
   722 	(res_inst_tac [("fo5","f")] (minimal RS monofun_cfun_arg) 1),
       
   723 	(etac disjE 1),
       
   724 	(contr_tac 1),
       
   725 	(atac 1)
       
   726 	]);
       
   727 
   691 (* ------------------------------------------------------------------------ *)
   728 (* ------------------------------------------------------------------------ *)
   692 (* admissibility of special formulae and propagation                        *)
   729 (* admissibility of special formulae and propagation                        *)
   693 (* ------------------------------------------------------------------------ *)
   730 (* ------------------------------------------------------------------------ *)
   694 
   731 
   695 val adm_less = prove_goalw  Fix.thy [adm_def]
   732 val adm_less = prove_goalw  Fix.thy [adm_def]
   774 	(atac 1),
   811 	(atac 1),
   775 	(rtac allI 1),
   812 	(rtac allI 1),
   776 	(dtac spec 1),
   813 	(dtac spec 1),
   777 	(etac spec 1)
   814 	(etac spec 1)
   778 	]);
   815 	]);
       
   816 
       
   817 val adm_all2 = (allI RS adm_all);
   779 
   818 
   780 val adm_subst = prove_goal  Fix.thy  
   819 val adm_subst = prove_goal  Fix.thy  
   781 	"[|contX(t); adm(P)|] ==> adm(%x.P(t(x)))"
   820 	"[|contX(t); adm(P)|] ==> adm(%x.P(t(x)))"
   782  (fn prems =>
   821  (fn prems =>
   783 	[
   822 	[
  1125 	(atac 1),
  1164 	(atac 1),
  1126 	(atac 1)
  1165 	(atac 1)
  1127 	]);
  1166 	]);
  1128 
  1167 
  1129 
  1168 
  1130 val adm_all2 = (allI RS adm_all);
       
  1131 
  1169 
  1132 val adm_thms = [adm_impl,adm_disj,adm_eq,adm_not_UU,adm_UU_not_less,
  1170 val adm_thms = [adm_impl,adm_disj,adm_eq,adm_not_UU,adm_UU_not_less,
  1133 	adm_all2,adm_not_less,adm_not_free,adm_conj,adm_less
  1171 	adm_all2,adm_not_less,adm_not_free,adm_conj,adm_less
  1134 	];
  1172 	];
  1135 
  1173 
  1136 (* ------------------------------------------------------------------------- *)
       
  1137 (* a result about functions with flat codomain                               *)
       
  1138 (* ------------------------------------------------------------------------- *)
       
  1139 
       
  1140 val flat_codom = prove_goalw Fix.thy [flat_def]
       
  1141 "[|flat(y::'b);f[x::'a]=(c::'b)|] ==> f[UU::'a]=(UU::'b) | (!z.f[z::'a]=c)"
       
  1142  (fn prems =>
       
  1143 	[
       
  1144 	(cut_facts_tac prems 1),
       
  1145 	(res_inst_tac [("Q","f[x::'a]=(UU::'b)")] classical2 1),
       
  1146 	(rtac disjI1 1),
       
  1147 	(rtac UU_I 1),
       
  1148 	(res_inst_tac [("s","f[x]"),("t","UU::'b")] subst 1),
       
  1149 	(atac 1),
       
  1150 	(rtac (minimal RS monofun_cfun_arg) 1),
       
  1151 	(res_inst_tac [("Q","f[UU::'a]=(UU::'b)")] classical2 1),
       
  1152 	(etac disjI1 1),
       
  1153 	(rtac disjI2 1),
       
  1154 	(rtac allI 1),
       
  1155 	(res_inst_tac [("s","f[x]"),("t","c")] subst 1),
       
  1156 	(atac 1),
       
  1157 	(res_inst_tac [("a","f[UU::'a]")] (refl RS box_equals) 1),
       
  1158 	(etac allE 1),(etac allE 1),
       
  1159 	(dtac mp 1),
       
  1160 	(res_inst_tac [("fo5","f")] (minimal RS monofun_cfun_arg) 1),
       
  1161 	(etac disjE 1),
       
  1162 	(contr_tac 1),
       
  1163 	(atac 1),
       
  1164 	(etac allE 1),
       
  1165 	(etac allE 1),
       
  1166 	(dtac mp 1),
       
  1167 	(res_inst_tac [("fo5","f")] (minimal RS monofun_cfun_arg) 1),
       
  1168 	(etac disjE 1),
       
  1169 	(contr_tac 1),
       
  1170 	(atac 1)
       
  1171 	]);