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 |