src/HOL/Tools/SMT/smt_normalize.ML
changeset 54489 03ff4d1e6784
parent 54293 cd896760fa0f
child 54883 dd04a8b654fc
equal deleted inserted replaced
54488:b60f1fab408c 54489:03ff4d1e6784
   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)