src/HOL/Integ/Presburger.thy
changeset 18202 46af82efd311
parent 17589 58eeffd73be1
child 20051 859e7129961b
equal deleted inserted replaced
18201:6c63f0eb16d7 18202:46af82efd311
   980   by simp
   980   by simp
   981 
   981 
   982 theorem conj_le_cong: "(0 <= x \<Longrightarrow> P = P') \<Longrightarrow> (0 <= (x::int) \<and> P) = (0 <= x \<and> P')"
   982 theorem conj_le_cong: "(0 <= x \<Longrightarrow> P = P') \<Longrightarrow> (0 <= (x::int) \<and> P) = (0 <= x \<and> P')"
   983   by (simp cong: conj_cong)
   983   by (simp cong: conj_cong)
   984 
   984 
       
   985     (* Theorems used in presburger.ML for the computation simpset*)
       
   986     (* FIXME: They are present in Float.thy, so may be Float.thy should be lightened.*)
       
   987 
       
   988 lemma lift_bool: "x \<Longrightarrow> x=True"
       
   989   by simp
       
   990 
       
   991 lemma nlift_bool: "~x \<Longrightarrow> x=False"
       
   992   by simp
       
   993 
       
   994 lemma not_false_eq_true: "(~ False) = True" by simp
       
   995 
       
   996 lemma not_true_eq_false: "(~ True) = False" by simp
       
   997 
       
   998 
       
   999 lemma int_eq_number_of_eq: "(((number_of v)::int)=(number_of w)) = iszero ((number_of (bin_add v (bin_minus w)))::int)"
       
  1000   by simp
       
  1001 lemma int_iszero_number_of_Pls: "iszero (Numeral0::int)" 
       
  1002   by (simp only: iszero_number_of_Pls)
       
  1003 
       
  1004 lemma int_nonzero_number_of_Min: "~(iszero ((-1)::int))"
       
  1005   by simp
       
  1006 
       
  1007 lemma int_iszero_number_of_0: "iszero ((number_of (w BIT bit.B0))::int) = iszero ((number_of w)::int)"
       
  1008   by simp
       
  1009 
       
  1010 lemma int_iszero_number_of_1: "\<not> iszero ((number_of (w BIT bit.B1))::int)" 
       
  1011   by simp
       
  1012 
       
  1013 lemma int_less_number_of_eq_neg: "(((number_of x)::int) < number_of y) = neg ((number_of (bin_add x (bin_minus y)))::int)"
       
  1014   by simp
       
  1015 
       
  1016 lemma int_not_neg_number_of_Pls: "\<not> (neg (Numeral0::int))" 
       
  1017   by simp
       
  1018 
       
  1019 lemma int_neg_number_of_Min: "neg (-1::int)"
       
  1020   by simp
       
  1021 
       
  1022 lemma int_neg_number_of_BIT: "neg ((number_of (w BIT x))::int) = neg ((number_of w)::int)"
       
  1023   by simp
       
  1024 
       
  1025 lemma int_le_number_of_eq: "(((number_of x)::int) \<le> number_of y) = (\<not> neg ((number_of (bin_add y (bin_minus x)))::int))"
       
  1026   by simp
       
  1027 lemma int_number_of_add_sym: "((number_of v)::int) + number_of w = number_of (bin_add v w)"
       
  1028   by simp
       
  1029 
       
  1030 lemma int_number_of_diff_sym: "((number_of v)::int) - number_of w = number_of (bin_add v (bin_minus w))"
       
  1031   by simp
       
  1032 
       
  1033 lemma int_number_of_mult_sym: "((number_of v)::int) * number_of w = number_of (bin_mult v w)"
       
  1034   by simp
       
  1035 
       
  1036 lemma int_number_of_minus_sym: "- ((number_of v)::int) = number_of (bin_minus v)"
       
  1037   by simp
       
  1038 lemma add_left_zero: "0 + a = (a::'a::comm_monoid_add)"
       
  1039   by simp
       
  1040 
       
  1041 lemma add_right_zero: "a + 0 = (a::'a::comm_monoid_add)"
       
  1042   by simp
       
  1043 
       
  1044 lemma mult_left_one: "1 * a = (a::'a::semiring_1)"
       
  1045   by simp
       
  1046 
       
  1047 lemma mult_right_one: "a * 1 = (a::'a::semiring_1)"
       
  1048   by simp
       
  1049 
       
  1050 lemma int_pow_0: "(a::int)^(Numeral0) = 1"
       
  1051   by simp
       
  1052 
       
  1053 lemma int_pow_1: "(a::int)^(Numeral1) = a"
       
  1054   by simp
       
  1055 
       
  1056 lemma zero_eq_Numeral0_nring: "(0::'a::number_ring) = Numeral0"
       
  1057   by simp
       
  1058 
       
  1059 lemma one_eq_Numeral1_nring: "(1::'a::number_ring) = Numeral1"
       
  1060   by simp
       
  1061 
       
  1062 lemma zero_eq_Numeral0_nat: "(0::nat) = Numeral0"
       
  1063   by simp
       
  1064 
       
  1065 lemma one_eq_Numeral1_nat: "(1::nat) = Numeral1"
       
  1066   by simp
       
  1067 
       
  1068 lemma zpower_Pls: "(z::int)^Numeral0 = Numeral1"
       
  1069   by simp
       
  1070 
       
  1071 lemma zpower_Min: "(z::int)^((-1)::nat) = Numeral1"
       
  1072 proof -
       
  1073   have 1:"((-1)::nat) = 0"
       
  1074     by simp
       
  1075   show ?thesis by (simp add: 1)
       
  1076 qed
       
  1077 
   985 use "cooper_dec.ML"
  1078 use "cooper_dec.ML"
   986 use "reflected_presburger.ML" 
  1079 use "reflected_presburger.ML" 
   987 use "reflected_cooper.ML"
  1080 use "reflected_cooper.ML"
   988 oracle
  1081 oracle
   989   presburger_oracle ("term") = ReflectedCooper.presburger_oracle
  1082   presburger_oracle ("term") = ReflectedCooper.presburger_oracle