src/Tools/isac/ProgLang/Prog_Expr.thy
changeset 60317 638d02a9a96a
parent 60278 343efa173023
child 60318 e6e7a9b9ced7
     1.1 --- a/src/Tools/isac/ProgLang/Prog_Expr.thy	Fri May 07 18:12:51 2021 +0200
     1.2 +++ b/src/Tools/isac/ProgLang/Prog_Expr.thy	Tue Jun 01 15:41:23 2021 +0200
     1.3 @@ -310,12 +310,12 @@
     1.4      (case arg of 
     1.5         Const (n1, _) =>
     1.6  	     SOME (TermC.mk_thmid thmid n1 "", HOLogic.Trueprop $ (TermC.mk_equality (t, @{term False})))
     1.7 -     | Free (n1, _) =>
     1.8 -	     if TermC.is_num' n1
     1.9 -	     then SOME (TermC.mk_thmid thmid n1 "", HOLogic.Trueprop $ (TermC.mk_equality (t, @{term True})))
    1.10 -	     else SOME (TermC.mk_thmid thmid n1 "", HOLogic.Trueprop $ (TermC.mk_equality (t, @{term False})))
    1.11 -     | _ => (*NONE*)
    1.12 -       SOME (TermC.mk_thmid thmid (UnparseC.term arg) "", HOLogic.Trueprop $ (TermC.mk_equality (t, @{term False}))))
    1.13 +     | n1 =>
    1.14 +	     if TermC.is_num n1
    1.15 +	     then SOME (TermC.mk_thmid thmid (TermC.string_of_num n1) "",
    1.16 +         HOLogic.Trueprop $ (TermC.mk_equality (t, @{term True})))
    1.17 +	     else SOME (TermC.mk_thmid thmid (UnparseC.term n1) "",
    1.18 +         HOLogic.Trueprop $ (TermC.mk_equality (t, @{term False}))))
    1.19    | eval_const _ _ _ _ = NONE; 
    1.20  
    1.21  (*. evaluate binary, associative, commutative operators: *,+,^ .*)
    1.22 @@ -336,17 +336,19 @@
    1.23  (*.evaluate < and <= for numerals.*)
    1.24  (*("le"      ,("Orderings.ord_class.less"        , Prog_Expr.eval_equ "#less_")),
    1.25    ("leq"     ,("Orderings.ord_class.less_eq"       , Prog_Expr.eval_equ "#less_equal_"))*)
    1.26 -fun eval_equ (thmid:string) (_(*op_*)) (t as 
    1.27 -	       (Const (op0, _) $ Free (n1, _) $ Free(n2, _))) _ = 
    1.28 -    (case (ThmC_Def.int_opt_of_string n1, ThmC_Def.int_opt_of_string n2) of
    1.29 -	 (SOME n1', SOME n2') =>
    1.30 -  if Eval.calc_equ (strip_thy op0) (n1', n2')
    1.31 -    then SOME (TermC.mk_thmid thmid n1 n2, 
    1.32 -	  HOLogic.Trueprop $ (TermC.mk_equality (t, @{term True})))
    1.33 -  else SOME (TermC.mk_thmid thmid n1 n2,  
    1.34 -	  HOLogic.Trueprop $ (TermC.mk_equality (t, @{term False})))
    1.35 -       | _ => NONE)
    1.36 -    
    1.37 +fun eval_equ (thmid:string) (_(*op_*)) (t as (Const (op0, _)) $ t1 $ t2) _ =
    1.38 +    if TermC.is_num t1 andalso TermC.is_num t2 then
    1.39 +      let
    1.40 +        val n1 = t1 |> HOLogic.dest_number |> snd 
    1.41 +        val n2 = t2 |> HOLogic.dest_number |> snd 
    1.42 +      in
    1.43 +        if Eval.calc_equ (strip_thy op0) (n1, n2)
    1.44 +        then SOME (TermC.mk_thmid thmid (string_of_int n1) (string_of_int n2), 
    1.45 +    	    HOLogic.Trueprop $ (TermC.mk_equality (t, @{term True})))
    1.46 +        else SOME (TermC.mk_thmid thmid (string_of_int n1) (string_of_int n2),  
    1.47 +    	   HOLogic.Trueprop $ (TermC.mk_equality (t, @{term False})))
    1.48 +      end
    1.49 +    else NONE
    1.50    | eval_equ _ _ _ _ = NONE;
    1.51  
    1.52  
    1.53 @@ -429,25 +431,21 @@
    1.54  
    1.55  (*. evaluate HOL.divide .*)
    1.56  (*("DIVIDE" ,("Rings.divide_class.divide"  , eval_cancel "#divide_e"))*)
    1.57 -fun eval_cancel (thmid: string) "Rings.divide_class.divide" (t as 
    1.58 -	       (Const (op0,t0) $ Free (n1, _) $ Free(n2, _))) _ = 
    1.59 -    (case (ThmC_Def.int_opt_of_string n1, ThmC_Def.int_opt_of_string n2) of
    1.60 -    	(SOME n1', SOME n2') =>
    1.61 -        let 
    1.62 -          val sg = Eval.sign_mult n1' n2';
    1.63 -          val (T1,T2,Trange) = TermC.dest_binop_typ t0;
    1.64 -          val gcd' = Eval.gcd (abs n1') (abs n2');
    1.65 -        in if gcd' = abs n2' 
    1.66 -           then let val rhs = TermC.term_of_num Trange (sg * (abs n1') div gcd')
    1.67 -    	        val prop = HOLogic.Trueprop $ (TermC.mk_equality (t, rhs))
    1.68 -    	    in SOME (TermC.mk_thmid thmid n1 n2, prop) end     
    1.69 -           else if 0 < n2' andalso gcd' = 1 then NONE
    1.70 -           else let val rhs = TermC.mk_num_op_num T1 T2 (op0,t0) (sg * (abs n1') div gcd')
    1.71 -    	  			   ((abs n2') div gcd')
    1.72 -    	        val prop = HOLogic.Trueprop $ (TermC.mk_equality (t, rhs))
    1.73 -    	    in SOME (TermC.mk_thmid thmid n1 n2, prop) end
    1.74 -        end
    1.75 -      | _ => ((*tracing"#>@ eval_cancel NONE";*)NONE))
    1.76 +fun eval_cancel thmid "Rings.divide_class.divide" (t as (Const _ $ t1 $ t2)) _ = 
    1.77 +    if TermC.is_num t1 andalso TermC.is_num t2 then
    1.78 +      let
    1.79 +        val (T, _) = HOLogic.dest_number t1;
    1.80 +        val (i1, i2) = (Eval.int_of_numeral t1, Eval.int_of_numeral t2);
    1.81 +        val res_int as (_, (i1', i2')) = Eval.cancel_int (i1, i2);
    1.82 +      in
    1.83 +        if (i1', i2') = (i1, i2) then NONE
    1.84 +        else
    1.85 +          let
    1.86 +            val res = TermC.mk_frac T res_int;
    1.87 +            val prop = HOLogic.Trueprop $ (HOLogic.mk_eq (t, res));
    1.88 +          in SOME (TermC.mk_thmid thmid (string_of_int i1) (string_of_int i2), prop) end
    1.89 +      end
    1.90 +    else NONE
    1.91    | eval_cancel _ _ _ _ = NONE;
    1.92  
    1.93  (* get the argument from a function-definition *)