src/HOL/SMT_Examples/SMT_Examples.thy
changeset 37151 3e9e8dfb3c98
parent 37124 fe22fc54b876
child 40163 a462d5207aa6
equal deleted inserted replaced
37150:73e738371c90 37151:3e9e8dfb3c98
   333   by smt
   333   by smt
   334 
   334 
   335 
   335 
   336 lemma "let P = 2 * x + 1 > x + (x::real) in P \<or> False \<or> P" by smt
   336 lemma "let P = 2 * x + 1 > x + (x::real) in P \<or> False \<or> P" by smt
   337 
   337 
   338 lemma "x + (let y = x mod 2 in 2 * y + 1) \<ge> x + (1::int)"
   338 lemma "x + (let y = x mod 2 in 2 * y + 1) \<ge> x + (1::int)" by smt
   339   sorry (* FIXME: div/mod *)
   339 
   340 
   340 lemma "x + (let y = x mod 2 in y + y) < x + (3::int)" by smt
   341 lemma "x + (let y = x mod 2 in y + y) < x + (3::int)"
       
   342   sorry (* FIXME: div/mod *)
       
   343 
   341 
   344 lemma
   342 lemma
   345   assumes "x \<noteq> (0::real)"
   343   assumes "x \<noteq> (0::real)"
   346   shows "x + x \<noteq> (let P = (abs x > 1) in if P \<or> \<not>P then 4 else 2) * x"
   344   shows "x + x \<noteq> (let P = (abs x > 1) in if P \<or> \<not>P then 4 else 2) * x"
   347   using assms by smt
   345   using assms by smt
   348 
   346 
   349 lemma                                                                         
   347 lemma                                                                         
   350   assumes "(n + m) mod 2 = 0" and "n mod 4 = 3"                               
   348   assumes "(n + m) mod 2 = 0" and "n mod 4 = 3"                               
   351   shows "n mod 2 = 1 & m mod 2 = (1::int)"      
   349   shows "n mod 2 = 1 & m mod 2 = (1::int)"      
   352   using assms sorry (* FIXME: div/mod *)
   350   using assms by smt
       
   351 
   353 
   352 
   354 
   353 
   355 subsection {* Linear arithmetic with quantifiers *}
   354 subsection {* Linear arithmetic with quantifiers *}
   356 
   355 
   357 lemma "~ (\<exists>x::int. False)" by smt
   356 lemma "~ (\<exists>x::int. False)" by smt
   482 lemma
   481 lemma
   483   "(eval_dioph ks xs = l) =
   482   "(eval_dioph ks xs = l) =
   484    (eval_dioph ks (map (\<lambda>x. x mod 2) xs) mod 2 = l mod 2 \<and>
   483    (eval_dioph ks (map (\<lambda>x. x mod 2) xs) mod 2 = l mod 2 \<and>
   485     eval_dioph ks (map (\<lambda>x. x div 2) xs) =
   484     eval_dioph ks (map (\<lambda>x. x div 2) xs) =
   486       (l - eval_dioph ks (map (\<lambda>x. x mod 2) xs)) div 2)"
   485       (l - eval_dioph ks (map (\<lambda>x. x mod 2) xs)) div 2)"
   487   sorry (* FIXME: div/mod *)
       
   488 (*
       
   489   by (smt eval_dioph_mod[where n=2] eval_dioph_div_mult[where n=2])
   486   by (smt eval_dioph_mod[where n=2] eval_dioph_div_mult[where n=2])
   490 *)
       
   491 
   487 
   492 
   488 
   493 section {* Monomorphization examples *}
   489 section {* Monomorphization examples *}
   494 
   490 
   495 definition Pred :: "'a \<Rightarrow> bool" where "Pred x = True"
   491 definition Pred :: "'a \<Rightarrow> bool" where "Pred x = True"