524 |
524 |
525 (** normalize numerals **) |
525 (** normalize numerals **) |
526 |
526 |
527 local |
527 local |
528 (* |
528 (* |
529 rewrite negative numerals into positive numerals, |
|
530 rewrite Numeral0 into 0 |
|
531 rewrite Numeral1 into 1 |
529 rewrite Numeral1 into 1 |
|
530 rewrite - 0 into 0 |
532 *) |
531 *) |
533 |
532 |
534 fun is_strange_number ctxt (t as Const (@{const_name neg_numeral}, _) $ _) = |
533 fun is_irregular_number (Const (@{const_name numeral}, _) $ Const (@{const_name num.One}, _)) = |
535 SMT_Builtin.is_builtin_num ctxt t |
534 true |
536 | is_strange_number _ _ = false |
535 | is_irregular_number (Const (@{const_name uminus}, _) $ Const (@{const_name Groups.zero}, _)) = |
537 |
536 true |
538 val pos_num_ss = |
537 | is_irregular_number _ = |
|
538 false; |
|
539 |
|
540 fun is_strange_number ctxt t = is_irregular_number t andalso SMT_Builtin.is_builtin_num ctxt t; |
|
541 |
|
542 val proper_num_ss = |
539 simpset_of (put_simpset HOL_ss @{context} |
543 simpset_of (put_simpset HOL_ss @{context} |
540 addsimps [@{thm Num.numeral_One}] |
544 addsimps @{thms Num.numeral_One minus_zero}) |
541 addsimps [@{thm Num.neg_numeral_def}]) |
|
542 |
545 |
543 fun norm_num_conv ctxt = |
546 fun norm_num_conv ctxt = |
544 SMT_Utils.if_conv (is_strange_number ctxt) |
547 SMT_Utils.if_conv (is_strange_number ctxt) |
545 (Simplifier.rewrite (put_simpset pos_num_ss ctxt)) Conv.no_conv |
548 (Simplifier.rewrite (put_simpset proper_num_ss ctxt)) Conv.no_conv |
546 in |
549 in |
547 |
550 |
548 fun normalize_numerals_conv ctxt = |
551 fun normalize_numerals_conv ctxt = |
549 SMT_Utils.if_exists_conv (is_strange_number ctxt) |
552 SMT_Utils.if_exists_conv (is_strange_number ctxt) |
550 (Conv.top_sweep_conv norm_num_conv ctxt) |
553 (Conv.top_sweep_conv norm_num_conv ctxt) |