src/HOL/Library/Old_SMT/old_z3_proof_reconstruction.ML
changeset 59058 a78612c67ec0
parent 58957 c9e744ea8a38
child 59498 50b60f501b05
equal deleted inserted replaced
59057:5b649fb2f2e1 59058:a78612c67ec0
   285     in
   285     in
   286       join_disj (Old_Z3_Proof_Literals.make_littab (thms @ explode_disj ts th)) t
   286       join_disj (Old_Z3_Proof_Literals.make_littab (thms @ explode_disj ts th)) t
   287     end
   287     end
   288 
   288 
   289   fun dest_arg2 ct = Thm.dest_arg (Thm.dest_arg ct)
   289   fun dest_arg2 ct = Thm.dest_arg (Thm.dest_arg ct)
   290   fun dest ct = pairself dest_arg2 (Thm.dest_binop ct)
   290   fun dest ct = apply2 dest_arg2 (Thm.dest_binop ct)
   291   val contrapos =
   291   val contrapos =
   292     Old_Z3_Proof_Tools.precompose2 dest @{lemma "(~P ==> ~Q) ==> Q ==> P" by fast}
   292     Old_Z3_Proof_Tools.precompose2 dest @{lemma "(~P ==> ~Q) ==> Q ==> P" by fast}
   293 in
   293 in
   294 fun unit_resolution thm thms ct =
   294 fun unit_resolution thm thms ct =
   295   Old_Z3_Proof_Literals.negate (Thm.dest_arg ct)
   295   Old_Z3_Proof_Literals.negate (Thm.dest_arg ct)
   480 local
   480 local
   481   exception MONO
   481   exception MONO
   482 
   482 
   483   fun prove_refl (ct, _) = Thm.reflexive ct
   483   fun prove_refl (ct, _) = Thm.reflexive ct
   484   fun prove_comb f g cp =
   484   fun prove_comb f g cp =
   485     let val ((ct1, ct2), (cu1, cu2)) = pairself Thm.dest_comb cp
   485     let val ((ct1, ct2), (cu1, cu2)) = apply2 Thm.dest_comb cp
   486     in Thm.combination (f (ct1, cu1)) (g (ct2, cu2)) end
   486     in Thm.combination (f (ct1, cu1)) (g (ct2, cu2)) end
   487   fun prove_arg f = prove_comb prove_refl f
   487   fun prove_arg f = prove_comb prove_refl f
   488 
   488 
   489   fun prove f cp = prove_comb (prove f) f cp handle CTERM _ => prove_refl cp
   489   fun prove f cp = prove_comb (prove f) f cp handle CTERM _ => prove_refl cp
   490 
   490 
   504     f (length (HOLogic.dest_list (Thm.term_of cl))) cp
   504     f (length (HOLogic.dest_list (Thm.term_of cl))) cp
   505 
   505 
   506   fun prove_distinct f = prove_arg (with_length (prove_list f))
   506   fun prove_distinct f = prove_arg (with_length (prove_list f))
   507 
   507 
   508   fun prove_eq exn lookup cp =
   508   fun prove_eq exn lookup cp =
   509     (case lookup (Logic.mk_equals (pairself Thm.term_of cp)) of
   509     (case lookup (Logic.mk_equals (apply2 Thm.term_of cp)) of
   510       SOME eq => eq
   510       SOME eq => eq
   511     | NONE => if exn then raise MONO else prove_refl cp)
   511     | NONE => if exn then raise MONO else prove_refl cp)
   512   
   512   
   513   val prove_exn = prove_eq true
   513   val prove_exn = prove_eq true
   514   and prove_safe = prove_eq false
   514   and prove_safe = prove_eq false