src/HOL/Tools/SMT/z3_model.ML
changeset 40663 e080c9e68752
parent 40627 becf5d5187cc
child 40828 47ff261431c4
equal deleted inserted replaced
40662:798aad2229c0 40663:e080c9e68752
    10     term list
    10     term list
    11 end
    11 end
    12 
    12 
    13 structure Z3_Model: Z3_MODEL =
    13 structure Z3_Model: Z3_MODEL =
    14 struct
    14 struct
       
    15 
       
    16 structure U = SMT_Utils
       
    17 
    15 
    18 
    16 (* counterexample expressions *)
    19 (* counterexample expressions *)
    17 
    20 
    18 datatype expr = True | False | Number of int * int option | Value of int |
    21 datatype expr = True | False | Number of int * int option | Value of int |
    19   Array of array | App of string * expr list
    22   Array of array | App of string * expr list
   212       trans_pattern (Term.range_type T) (args, e) #>>
   215       trans_pattern (Term.range_type T) (args, e) #>>
   213       (fn (arg', (args', e')) => (arg' :: args', e'))
   216       (fn (arg', (args', e')) => (arg' :: args', e'))
   214 
   217 
   215 fun mk_fun_upd T U = Const (@{const_name fun_upd}, [T --> U, T, U, T] ---> U)
   218 fun mk_fun_upd T U = Const (@{const_name fun_upd}, [T --> U, T, U, T] ---> U)
   216 
   219 
   217 fun split_type T = (Term.domain_type T, Term.range_type T)
       
   218 
       
   219 fun mk_update ([], u) _ = u
   220 fun mk_update ([], u) _ = u
   220   | mk_update ([t], u) f =
   221   | mk_update ([t], u) f =
   221       uncurry mk_fun_upd (split_type (Term.fastype_of f)) $ f $ t $ u
   222       uncurry mk_fun_upd (U.split_type (Term.fastype_of f)) $ f $ t $ u
   222   | mk_update (t :: ts, u) f =
   223   | mk_update (t :: ts, u) f =
   223       let
   224       let
   224         val (dT, rT) = split_type (Term.fastype_of f)
   225         val (dT, rT) = U.split_type (Term.fastype_of f)
   225         val (dT', rT') = split_type rT
   226         val (dT', rT') = U.split_type rT
   226       in
   227       in
   227         mk_fun_upd dT rT $ f $ t $
   228         mk_fun_upd dT rT $ f $ t $
   228           mk_update (ts, u) (Term.absdummy (dT', Const ("_", rT')))
   229           mk_update (ts, u) (Term.absdummy (dT', Const ("_", rT')))
   229       end
   230       end
   230 
   231