src/HOL/Tools/cnf_funcs.ML
changeset 39035 094848cf7ef3
parent 38864 4abe644fcea5
child 41447 537b290bbe38
equal deleted inserted replaced
39014:e820beaf7d8c 39035:094848cf7ef3
   428 					val thm1 = make_cnfx_disj_thm x' y1
   428 					val thm1 = make_cnfx_disj_thm x' y1
   429 					val thm2 = make_cnfx_disj_thm x' y2
   429 					val thm2 = make_cnfx_disj_thm x' y2
   430 				in
   430 				in
   431 					make_cnf_disj_conj_r OF [thm1, thm2]  (* (x' | (y1 & y2)) = ((x' | y1)' & (x' | y2)') *)
   431 					make_cnf_disj_conj_r OF [thm1, thm2]  (* (x' | (y1 & y2)) = ((x' | y1)' & (x' | y2)') *)
   432 				end
   432 				end
   433 			  | make_cnfx_disj_thm (Const (@{const_name Ex}, _) $ x') y' =
   433 			  | make_cnfx_disj_thm (@{term "Ex::(bool => bool) => bool"} $ x') y' =
   434 				let
   434 				let
   435 					val thm1 = inst_thm thy [x', y'] make_cnfx_disj_ex_l   (* ((Ex x') | y') = (Ex (x' | y')) *)
   435 					val thm1 = inst_thm thy [x', y'] make_cnfx_disj_ex_l   (* ((Ex x') | y') = (Ex (x' | y')) *)
   436 					val var  = new_free ()
   436 					val var  = new_free ()
   437 					val thm2 = make_cnfx_disj_thm (betapply (x', var)) y'  (* (x' | y') = body' *)
   437 					val thm2 = make_cnfx_disj_thm (betapply (x', var)) y'  (* (x' | y') = body' *)
   438 					val thm3 = Thm.forall_intr (cterm_of thy var) thm2     (* !!v. (x' | y') = body' *)
   438 					val thm3 = Thm.forall_intr (cterm_of thy var) thm2     (* !!v. (x' | y') = body' *)
   439 					val thm4 = Thm.strip_shyps (thm3 COMP allI)            (* ALL v. (x' | y') = body' *)
   439 					val thm4 = Thm.strip_shyps (thm3 COMP allI)            (* ALL v. (x' | y') = body' *)
   440 					val thm5 = Thm.strip_shyps (thm4 RS make_cnfx_ex_cong) (* (EX v. (x' | y')) = (EX v. body') *)
   440 					val thm5 = Thm.strip_shyps (thm4 RS make_cnfx_ex_cong) (* (EX v. (x' | y')) = (EX v. body') *)
   441 				in
   441 				in
   442 					iff_trans OF [thm1, thm5]  (* ((Ex x') | y') = (Ex v. body') *)
   442 					iff_trans OF [thm1, thm5]  (* ((Ex x') | y') = (Ex v. body') *)
   443 				end
   443 				end
   444 			  | make_cnfx_disj_thm x' (Const (@{const_name Ex}, _) $ y') =
   444 			  | make_cnfx_disj_thm x' (@{term "Ex::(bool => bool) => bool"} $ y') =
   445 				let
   445 				let
   446 					val thm1 = inst_thm thy [x', y'] make_cnfx_disj_ex_r   (* (x' | (Ex y')) = (Ex (x' | y')) *)
   446 					val thm1 = inst_thm thy [x', y'] make_cnfx_disj_ex_r   (* (x' | (Ex y')) = (Ex (x' | y')) *)
   447 					val var  = new_free ()
   447 					val var  = new_free ()
   448 					val thm2 = make_cnfx_disj_thm x' (betapply (y', var))  (* (x' | y') = body' *)
   448 					val thm2 = make_cnfx_disj_thm x' (betapply (y', var))  (* (x' | y') = body' *)
   449 					val thm3 = Thm.forall_intr (cterm_of thy var) thm2     (* !!v. (x' | y') = body' *)
   449 					val thm3 = Thm.forall_intr (cterm_of thy var) thm2     (* !!v. (x' | y') = body' *)