691 (* ------------------------------------------------------------------------- *) |
691 (* ------------------------------------------------------------------------- *) |
692 (* a result about functions with flat codomain *) |
692 (* a result about functions with flat codomain *) |
693 (* ------------------------------------------------------------------------- *) |
693 (* ------------------------------------------------------------------------- *) |
694 |
694 |
695 val flat_codom = prove_goalw Fix.thy [flat_def] |
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)" |
696 "[|flat(y::'b);f[x::'a]=(c::'b)|] ==> f[UU::'a]=(UU::'b) | (!z.f[z::'a]=c)" |
697 (fn prems => |
697 (fn prems => |
698 [ |
698 [ |
699 (cut_facts_tac prems 1), |
699 (cut_facts_tac prems 1), |
700 (res_inst_tac [("Q","f[x::'a]=UU::'b")] classical2 1), |
700 (res_inst_tac [("Q","f[x::'a]=(UU::'b)")] classical2 1), |
701 (rtac disjI1 1), |
701 (rtac disjI1 1), |
702 (rtac UU_I 1), |
702 (rtac UU_I 1), |
703 (res_inst_tac [("s","f[x]"),("t","UU::'b")] subst 1), |
703 (res_inst_tac [("s","f[x]"),("t","UU::'b")] subst 1), |
704 (atac 1), |
704 (atac 1), |
705 (rtac (minimal RS monofun_cfun_arg) 1), |
705 (rtac (minimal RS monofun_cfun_arg) 1), |
706 (res_inst_tac [("Q","f[UU::'a]=UU::'b")] classical2 1), |
706 (res_inst_tac [("Q","f[UU::'a]=(UU::'b)")] classical2 1), |
707 (etac disjI1 1), |
707 (etac disjI1 1), |
708 (rtac disjI2 1), |
708 (rtac disjI2 1), |
709 (rtac allI 1), |
709 (rtac allI 1), |
710 (res_inst_tac [("s","f[x]"),("t","c")] subst 1), |
710 (res_inst_tac [("s","f[x]"),("t","c")] subst 1), |
711 (atac 1), |
711 (atac 1), |