319 @{lemma "if P then True else False == P" by (rule eq_reflection) simp}] |
319 @{lemma "if P then True else False == P" by (rule eq_reflection) simp}] |
320 |
320 |
321 exception BAD_PATTERN of unit |
321 exception BAD_PATTERN of unit |
322 |
322 |
323 fun wrap_in_if pat t = |
323 fun wrap_in_if pat t = |
324 if pat then raise BAD_PATTERN () |
324 if pat then raise BAD_PATTERN () else @{const If (bool)} $ t $ @{const True} $ @{const False} |
325 else @{const If (bool)} $ t $ @{const True} $ @{const False} |
|
326 |
325 |
327 fun is_builtin_conn_or_pred ctxt c ts = |
326 fun is_builtin_conn_or_pred ctxt c ts = |
328 is_some (SMT2_Builtin.dest_builtin_conn ctxt c ts) orelse |
327 is_some (SMT2_Builtin.dest_builtin_conn ctxt c ts) orelse |
329 is_some (SMT2_Builtin.dest_builtin_pred ctxt c ts) |
328 is_some (SMT2_Builtin.dest_builtin_pred ctxt c ts) |
330 in |
329 in |
336 fun in_term pat t = |
335 fun in_term pat t = |
337 (case Term.strip_comb t of |
336 (case Term.strip_comb t of |
338 (@{const True}, []) => t |
337 (@{const True}, []) => t |
339 | (@{const False}, []) => t |
338 | (@{const False}, []) => t |
340 | (u as Const (@{const_name If}, _), [t1, t2, t3]) => |
339 | (u as Const (@{const_name If}, _), [t1, t2, t3]) => |
341 if pat then raise BAD_PATTERN () |
340 if pat then raise BAD_PATTERN () else u $ in_form t1 $ in_term pat t2 $ in_term pat t3 |
342 else u $ in_form t1 $ in_term pat t2 $ in_term pat t3 |
|
343 | (Const (c as (n, _)), ts) => |
341 | (Const (c as (n, _)), ts) => |
344 if is_builtin_conn_or_pred ctxt c ts then wrap_in_if pat (in_form t) |
342 if is_builtin_conn_or_pred ctxt c ts then wrap_in_if pat (in_form t) |
345 else if is_quant n then wrap_in_if pat (in_form t) |
343 else if is_quant n then wrap_in_if pat (in_form t) |
346 else Term.list_comb (Const c, map (in_term pat) ts) |
344 else Term.list_comb (Const c, map (in_term pat) ts) |
347 | (Free c, ts) => Term.list_comb (Free c, map (in_term pat) ts) |
345 | (Free c, ts) => Term.list_comb (Free c, map (in_term pat) ts) |
355 | in_pat ((p as Const (@{const_name SMT2.nopat}, _)) $ t) = |
353 | in_pat ((p as Const (@{const_name SMT2.nopat}, _)) $ t) = |
356 p $ in_term true t |
354 p $ in_term true t |
357 | in_pat t = raise TERM ("bad pattern", [t]) |
355 | in_pat t = raise TERM ("bad pattern", [t]) |
358 |
356 |
359 and in_pats ps = |
357 and in_pats ps = |
360 in_list @{typ "SMT2.pattern list"} |
358 in_list @{typ "SMT2.pattern list"} (SOME o in_list @{typ SMT2.pattern} (try in_pat)) ps |
361 (SOME o in_list @{typ SMT2.pattern} (try in_pat)) ps |
359 |
362 |
360 and in_trigger ((c as @{const SMT2.trigger}) $ p $ t) = c $ in_pats p $ in_weight t |
363 and in_trigger ((c as @{const SMT2.trigger}) $ p $ t) = |
|
364 c $ in_pats p $ in_weight t |
|
365 | in_trigger t = in_weight t |
361 | in_trigger t = in_weight t |
366 |
362 |
367 and in_form t = |
363 and in_form t = |
368 (case Term.strip_comb t of |
364 (case Term.strip_comb t of |
369 (q as Const (qn, _), [Abs (n, T, u)]) => |
365 (q as Const (qn, _), [Abs (n, T, u)]) => |
460 |
456 |
461 and transs t T ts = |
457 and transs t T ts = |
462 let val (Us, U) = SMT2_Util.dest_funT (length ts) T |
458 let val (Us, U) = SMT2_Util.dest_funT (length ts) T |
463 in |
459 in |
464 fold_map transT Us ##>> transT U #-> (fn Up => |
460 fold_map transT Us ##>> transT U #-> (fn Up => |
465 add_fun t (SOME Up) ##>> fold_map trans ts #>> SApp) |
461 add_fun t (SOME Up) ##>> fold_map trans ts #>> SApp) |
466 end |
462 end |
467 |
463 |
468 val (us, trx') = fold_map trans ts trx |
464 val (us, trx') = fold_map trans ts trx |
469 in ((sign_of (header ts) dtyps trx', us), trx') end |
465 in ((sign_of (header ts) dtyps trx', us), trx') end |
470 |
466 |
526 map mk_trigger defs @ ts' |
522 map mk_trigger defs @ ts' |
527 |> intro_explicit_application ctxt' funcs |
523 |> intro_explicit_application ctxt' funcs |
528 |> pair ctxt') |
524 |> pair ctxt') |
529 |
525 |
530 val ((rewrite_rules, builtin), ts4) = folify ctxt2 ts3 |
526 val ((rewrite_rules, builtin), ts4) = folify ctxt2 ts3 |
531 |
527 |>> apfst (cons fun_app_eq) |
532 val rewrite_rules' = fun_app_eq :: rewrite_rules |
|
533 in |
528 in |
534 (ts4, tr_context) |
529 (ts4, tr_context) |
535 |-> intermediate header dtyps (builtin SMT2_Builtin.dest_builtin) ctxt2 |
530 |-> intermediate header dtyps (builtin SMT2_Builtin.dest_builtin) ctxt2 |
536 |>> uncurry (serialize comments) |
531 |>> uncurry (serialize comments) |
537 ||> replay_data_of ctxt2 rewrite_rules' ithms |
532 ||> replay_data_of ctxt2 rewrite_rules ithms |
538 end |
533 end |
539 |
534 |
540 end |
535 end |