src/HOL/Tools/SMT/z3_model.ML
changeset 41129 b88cfc0f7456
parent 41122 72176ec5e031
child 41328 6792a5c92a58
equal deleted inserted replaced
41128:bb2fa5c13d1a 41129:b88cfc0f7456
   288 
   288 
   289 (* overall procedure *)
   289 (* overall procedure *)
   290 
   290 
   291 val is_free_constraint = Term.exists_subterm (fn Free _ => true | _ => false)
   291 val is_free_constraint = Term.exists_subterm (fn Free _ => true | _ => false)
   292 
   292 
       
   293 fun is_free_def (Const (@{const_name HOL.eq}, _) $ Free _ $ _) = true
       
   294   | is_free_def _ = false
       
   295 
       
   296 fun defined tp =
       
   297   try (pairself (fst o HOLogic.dest_eq)) tp
       
   298   |> the_default false o Option.map (op aconv)
       
   299 
       
   300 fun add_free_defs free_cs defs =
       
   301   let val (free_defs, defs') = List.partition is_free_def defs
       
   302   in (free_cs @ filter_out (member defined free_cs) free_defs, defs') end
       
   303 
   293 fun is_const_def (Const (@{const_name HOL.eq}, _) $ Const _ $ _) = true
   304 fun is_const_def (Const (@{const_name HOL.eq}, _) $ Const _ $ _) = true
   294   | is_const_def _ = false
   305   | is_const_def _ = false
   295 
   306 
   296 fun parse_counterex ctxt ({terms, ...} : SMT_Translate.recon) ls =
   307 fun parse_counterex ctxt ({terms, ...} : SMT_Translate.recon) ls =
   297   read_cex terms ls
   308   read_cex terms ls
   300   |> remove_int_nat_coercions
   311   |> remove_int_nat_coercions
   301   |> unfold_funapp
   312   |> unfold_funapp
   302   |> unfold_eqs
   313   |> unfold_eqs
   303   |>> map swap_free
   314   |>> map swap_free
   304   |>> filter is_free_constraint
   315   |>> filter is_free_constraint
       
   316   |-> add_free_defs
   305   |> frees_for_vars ctxt
   317   |> frees_for_vars ctxt
   306   ||> filter is_const_def
   318   ||> filter is_const_def
   307 
   319 
   308 end
   320 end
   309 
   321