src/HOL/Quotient_Examples/Quotient_Int.thy
author hoelzl
Mon, 14 Mar 2011 14:37:41 +0100
changeset 41975 d47eabd80e59
parent 41467 8fc17c5e11c0
child 45605 a89b4bc311a5
permissions -rw-r--r--
simplified definition of open_extreal
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
36524
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
     1
(*  Title:      HOL/Quotient_Examples/Quotient_Int.thy
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
     2
    Author:     Cezary Kaliszyk
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
     3
    Author:     Christian Urban
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
     4
41467
8fc17c5e11c0 tuned headers;
wenzelm
parents: 41413
diff changeset
     5
Integers based on Quotients, based on an older version by Larry
8fc17c5e11c0 tuned headers;
wenzelm
parents: 41413
diff changeset
     6
Paulson.
36524
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
     7
*)
41467
8fc17c5e11c0 tuned headers;
wenzelm
parents: 41413
diff changeset
     8
36524
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
     9
theory Quotient_Int
41413
64cd30d6b0b8 explicit file specifications -- avoid secondary load path;
wenzelm
parents: 40928
diff changeset
    10
imports "~~/src/HOL/Library/Quotient_Product" Nat
36524
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    11
begin
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    12
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    13
fun
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    14
  intrel :: "(nat \<times> nat) \<Rightarrow> (nat \<times> nat) \<Rightarrow> bool" (infix "\<approx>" 50)
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    15
where
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    16
  "intrel (x, y) (u, v) = (x + v = u + y)"
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    17
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    18
quotient_type int = "nat \<times> nat" / intrel
39302
d7728f65b353 renamed lemmas: ext_iff -> fun_eq_iff, set_ext_iff -> set_eq_iff, set_ext -> set_eqI
nipkow
parents: 39198
diff changeset
    19
  by (auto simp add: equivp_def fun_eq_iff)
36524
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    20
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    21
instantiation int :: "{zero, one, plus, uminus, minus, times, ord, abs, sgn}"
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    22
begin
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    23
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    24
quotient_definition
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    25
  "0 \<Colon> int" is "(0\<Colon>nat, 0\<Colon>nat)"
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    26
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    27
quotient_definition
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    28
  "1 \<Colon> int" is "(1\<Colon>nat, 0\<Colon>nat)"
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    29
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    30
fun
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    31
  plus_int_raw :: "(nat \<times> nat) \<Rightarrow> (nat \<times> nat) \<Rightarrow> (nat \<times> nat)"
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    32
where
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    33
  "plus_int_raw (x, y) (u, v) = (x + u, y + v)"
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    34
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    35
quotient_definition
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    36
  "(op +) \<Colon> (int \<Rightarrow> int \<Rightarrow> int)" is "plus_int_raw"
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    37
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    38
fun
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    39
  uminus_int_raw :: "(nat \<times> nat) \<Rightarrow> (nat \<times> nat)"
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    40
where
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    41
  "uminus_int_raw (x, y) = (y, x)"
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    42
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    43
quotient_definition
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    44
  "(uminus \<Colon> (int \<Rightarrow> int))" is "uminus_int_raw"
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    45
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    46
definition
37767
a2b7a20d6ea3 dropped superfluous [code del]s
haftmann
parents: 37594
diff changeset
    47
  minus_int_def:  "z - w = z + (-w\<Colon>int)"
36524
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    48
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    49
fun
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    50
  times_int_raw :: "(nat \<times> nat) \<Rightarrow> (nat \<times> nat) \<Rightarrow> (nat \<times> nat)"
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    51
where
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    52
  "times_int_raw (x, y) (u, v) = (x*u + y*v, x*v + y*u)"
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    53
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    54
quotient_definition
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    55
  "(op *) :: (int \<Rightarrow> int \<Rightarrow> int)" is "times_int_raw"
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    56
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    57
fun
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    58
  le_int_raw :: "(nat \<times> nat) \<Rightarrow> (nat \<times> nat) \<Rightarrow> bool"
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    59
where
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    60
  "le_int_raw (x, y) (u, v) = (x+v \<le> u+y)"
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    61
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    62
quotient_definition
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    63
  le_int_def: "(op \<le>) :: int \<Rightarrow> int \<Rightarrow> bool" is "le_int_raw"
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    64
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    65
definition
37767
a2b7a20d6ea3 dropped superfluous [code del]s
haftmann
parents: 37594
diff changeset
    66
  less_int_def: "(z\<Colon>int) < w = (z \<le> w \<and> z \<noteq> w)"
36524
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    67
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    68
definition
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    69
  zabs_def: "\<bar>i\<Colon>int\<bar> = (if i < 0 then - i else i)"
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    70
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    71
definition
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    72
  zsgn_def: "sgn (i\<Colon>int) = (if i = 0 then 0 else if 0 < i then 1 else - 1)"
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    73
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    74
instance ..
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    75
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    76
end
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    77
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    78
lemma [quot_respect]:
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    79
  shows "(op \<approx> ===> op \<approx> ===> op \<approx>) plus_int_raw plus_int_raw"
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    80
  and   "(op \<approx> ===> op \<approx>) uminus_int_raw uminus_int_raw"
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    81
  and   "(op \<approx> ===> op \<approx> ===> op =) le_int_raw le_int_raw"
40468
d4aac200199e fun_rel_def is no simp rule by default
haftmann
parents: 39302
diff changeset
    82
  by (auto intro!: fun_relI)
36524
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    83
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    84
lemma times_int_raw_fst:
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    85
  assumes a: "x \<approx> z"
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    86
  shows "times_int_raw x y \<approx> times_int_raw z y"
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    87
  using a
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    88
  apply(cases x, cases y, cases z)
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    89
  apply(auto simp add: times_int_raw.simps intrel.simps)
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    90
  apply(rename_tac u v w x y z)
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    91
  apply(subgoal_tac "u*w + z*w = y*w + v*w  &  u*x + z*x = y*x + v*x")
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    92
  apply(simp add: mult_ac)
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    93
  apply(simp add: add_mult_distrib [symmetric])
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    94
  done
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    95
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    96
lemma times_int_raw_snd:
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    97
  assumes a: "x \<approx> z"
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    98
  shows "times_int_raw y x \<approx> times_int_raw y z"
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    99
  using a
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   100
  apply(cases x, cases y, cases z)
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   101
  apply(auto simp add: times_int_raw.simps intrel.simps)
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   102
  apply(rename_tac u v w x y z)
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   103
  apply(subgoal_tac "u*w + z*w = y*w + v*w  &  u*x + z*x = y*x + v*x")
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   104
  apply(simp add: mult_ac)
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   105
  apply(simp add: add_mult_distrib [symmetric])
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   106
  done
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   107
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   108
lemma [quot_respect]:
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   109
  shows "(op \<approx> ===> op \<approx> ===> op \<approx>) times_int_raw times_int_raw"
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   110
  apply(simp only: fun_rel_def)
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   111
  apply(rule allI | rule impI)+
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   112
  apply(rule equivp_transp[OF int_equivp])
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   113
  apply(rule times_int_raw_fst)
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   114
  apply(assumption)
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   115
  apply(rule times_int_raw_snd)
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   116
  apply(assumption)
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   117
  done
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   118
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   119
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   120
text{* The integers form a @{text comm_ring_1}*}
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   121
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   122
instance int :: comm_ring_1
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   123
proof
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   124
  fix i j k :: int
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   125
  show "(i + j) + k = i + (j + k)"
37594
32ad67684ee7 cosmetics: avoided statement of raw theorems, used the method descending instead
Christian Urban <urbanc@in.tum.de>
parents: 36524
diff changeset
   126
    by (descending) (auto)
36524
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   127
  show "i + j = j + i"
37594
32ad67684ee7 cosmetics: avoided statement of raw theorems, used the method descending instead
Christian Urban <urbanc@in.tum.de>
parents: 36524
diff changeset
   128
    by (descending) (auto)
36524
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   129
  show "0 + i = (i::int)"
37594
32ad67684ee7 cosmetics: avoided statement of raw theorems, used the method descending instead
Christian Urban <urbanc@in.tum.de>
parents: 36524
diff changeset
   130
    by (descending) (auto)
36524
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   131
  show "- i + i = 0"
37594
32ad67684ee7 cosmetics: avoided statement of raw theorems, used the method descending instead
Christian Urban <urbanc@in.tum.de>
parents: 36524
diff changeset
   132
    by (descending) (auto)
36524
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   133
  show "i - j = i + - j"
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   134
    by (simp add: minus_int_def)
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   135
  show "(i * j) * k = i * (j * k)"
37594
32ad67684ee7 cosmetics: avoided statement of raw theorems, used the method descending instead
Christian Urban <urbanc@in.tum.de>
parents: 36524
diff changeset
   136
    by (descending) (auto simp add: algebra_simps)
36524
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   137
  show "i * j = j * i"
37594
32ad67684ee7 cosmetics: avoided statement of raw theorems, used the method descending instead
Christian Urban <urbanc@in.tum.de>
parents: 36524
diff changeset
   138
    by (descending) (auto)
36524
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   139
  show "1 * i = i"
37594
32ad67684ee7 cosmetics: avoided statement of raw theorems, used the method descending instead
Christian Urban <urbanc@in.tum.de>
parents: 36524
diff changeset
   140
    by (descending) (auto)
36524
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   141
  show "(i + j) * k = i * k + j * k"
37594
32ad67684ee7 cosmetics: avoided statement of raw theorems, used the method descending instead
Christian Urban <urbanc@in.tum.de>
parents: 36524
diff changeset
   142
    by (descending) (auto simp add: algebra_simps)
36524
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   143
  show "0 \<noteq> (1::int)"
37594
32ad67684ee7 cosmetics: avoided statement of raw theorems, used the method descending instead
Christian Urban <urbanc@in.tum.de>
parents: 36524
diff changeset
   144
    by (descending) (auto)
36524
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   145
qed
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   146
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   147
lemma plus_int_raw_rsp_aux:
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   148
  assumes a: "a \<approx> b" "c \<approx> d"
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   149
  shows "plus_int_raw a c \<approx> plus_int_raw b d"
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   150
  using a
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   151
  by (cases a, cases b, cases c, cases d)
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   152
     (simp)
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   153
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   154
lemma add_abs_int:
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   155
  "(abs_int (x,y)) + (abs_int (u,v)) =
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   156
   (abs_int (x + u, y + v))"
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   157
  apply(simp add: plus_int_def id_simps)
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   158
  apply(fold plus_int_raw.simps)
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   159
  apply(rule Quotient_rel_abs[OF Quotient_int])
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   160
  apply(rule plus_int_raw_rsp_aux)
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   161
  apply(simp_all add: rep_abs_rsp_left[OF Quotient_int])
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   162
  done
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   163
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   164
definition int_of_nat_raw:
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   165
  "int_of_nat_raw m = (m :: nat, 0 :: nat)"
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   166
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   167
quotient_definition
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   168
  "int_of_nat :: nat \<Rightarrow> int" is "int_of_nat_raw"
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   169
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   170
lemma[quot_respect]:
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   171
  shows "(op = ===> op \<approx>) int_of_nat_raw int_of_nat_raw"
40468
d4aac200199e fun_rel_def is no simp rule by default
haftmann
parents: 39302
diff changeset
   172
  by (auto simp add: equivp_reflp [OF int_equivp])
36524
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   173
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   174
lemma int_of_nat:
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   175
  shows "of_nat m = int_of_nat m"
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   176
  by (induct m)
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   177
     (simp_all add: zero_int_def one_int_def int_of_nat_def int_of_nat_raw add_abs_int)
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   178
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   179
instance int :: linorder
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   180
proof
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   181
  fix i j k :: int
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   182
  show antisym: "i \<le> j \<Longrightarrow> j \<le> i \<Longrightarrow> i = j"
37594
32ad67684ee7 cosmetics: avoided statement of raw theorems, used the method descending instead
Christian Urban <urbanc@in.tum.de>
parents: 36524
diff changeset
   183
    by (descending) (auto)
36524
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   184
  show "(i < j) = (i \<le> j \<and> \<not> j \<le> i)"
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   185
    by (auto simp add: less_int_def dest: antisym)
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   186
  show "i \<le> i"
37594
32ad67684ee7 cosmetics: avoided statement of raw theorems, used the method descending instead
Christian Urban <urbanc@in.tum.de>
parents: 36524
diff changeset
   187
    by (descending) (auto)
36524
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   188
  show "i \<le> j \<Longrightarrow> j \<le> k \<Longrightarrow> i \<le> k"
37594
32ad67684ee7 cosmetics: avoided statement of raw theorems, used the method descending instead
Christian Urban <urbanc@in.tum.de>
parents: 36524
diff changeset
   189
    by (descending) (auto)
36524
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   190
  show "i \<le> j \<or> j \<le> i"
37594
32ad67684ee7 cosmetics: avoided statement of raw theorems, used the method descending instead
Christian Urban <urbanc@in.tum.de>
parents: 36524
diff changeset
   191
    by (descending) (auto)
36524
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   192
qed
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   193
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   194
instantiation int :: distrib_lattice
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   195
begin
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   196
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   197
definition
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   198
  "(inf \<Colon> int \<Rightarrow> int \<Rightarrow> int) = min"
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   199
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   200
definition
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   201
  "(sup \<Colon> int \<Rightarrow> int \<Rightarrow> int) = max"
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   202
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   203
instance
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   204
  by default
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   205
     (auto simp add: inf_int_def sup_int_def min_max.sup_inf_distrib1)
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   206
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   207
end
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   208
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   209
instance int :: ordered_cancel_ab_semigroup_add
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   210
proof
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   211
  fix i j k :: int
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   212
  show "i \<le> j \<Longrightarrow> k + i \<le> k + j"
37594
32ad67684ee7 cosmetics: avoided statement of raw theorems, used the method descending instead
Christian Urban <urbanc@in.tum.de>
parents: 36524
diff changeset
   213
    by (descending) (auto)
36524
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   214
qed
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   215
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   216
abbreviation
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   217
  "less_int_raw i j \<equiv> le_int_raw i j \<and> \<not>(i \<approx> j)"
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   218
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   219
lemma zmult_zless_mono2_lemma:
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   220
  fixes i j::int
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   221
  and   k::nat
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   222
  shows "i < j \<Longrightarrow> 0 < k \<Longrightarrow> of_nat k * i < of_nat k * j"
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   223
  apply(induct "k")
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   224
  apply(simp)
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   225
  apply(case_tac "k = 0")
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   226
  apply(simp_all add: left_distrib add_strict_mono)
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   227
  done
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   228
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   229
lemma zero_le_imp_eq_int_raw:
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   230
  fixes k::"(nat \<times> nat)"
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   231
  shows "less_int_raw (0, 0) k \<Longrightarrow> (\<exists>n > 0. k \<approx> int_of_nat_raw n)"
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   232
  apply(cases k)
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   233
  apply(simp add:int_of_nat_raw)
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   234
  apply(auto)
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   235
  apply(rule_tac i="b" and j="a" in less_Suc_induct)
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   236
  apply(auto)
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   237
  done
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   238
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   239
lemma zero_le_imp_eq_int:
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   240
  fixes k::int
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   241
  shows "0 < k \<Longrightarrow> \<exists>n > 0. k = of_nat n"
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   242
  unfolding less_int_def int_of_nat
37594
32ad67684ee7 cosmetics: avoided statement of raw theorems, used the method descending instead
Christian Urban <urbanc@in.tum.de>
parents: 36524
diff changeset
   243
  by (descending) (rule zero_le_imp_eq_int_raw)
36524
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   244
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   245
lemma zmult_zless_mono2:
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   246
  fixes i j k::int
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   247
  assumes a: "i < j" "0 < k"
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   248
  shows "k * i < k * j"
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   249
  using a
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   250
  by (drule_tac zero_le_imp_eq_int) (auto simp add: zmult_zless_mono2_lemma)
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   251
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   252
text{*The integers form an ordered integral domain*}
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   253
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   254
instance int :: linordered_idom
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   255
proof
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   256
  fix i j k :: int
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   257
  show "i < j \<Longrightarrow> 0 < k \<Longrightarrow> k * i < k * j"
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   258
    by (rule zmult_zless_mono2)
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   259
  show "\<bar>i\<bar> = (if i < 0 then -i else i)"
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   260
    by (simp only: zabs_def)
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   261
  show "sgn (i\<Colon>int) = (if i=0 then 0 else if 0<i then 1 else - 1)"
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   262
    by (simp only: zsgn_def)
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   263
qed
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   264
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   265
lemmas int_distrib =
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   266
  left_distrib [of "z1::int" "z2" "w", standard]
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   267
  right_distrib [of "w::int" "z1" "z2", standard]
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   268
  left_diff_distrib [of "z1::int" "z2" "w", standard]
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   269
  right_diff_distrib [of "w::int" "z1" "z2", standard]
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   270
  minus_add_distrib[of "z1::int" "z2", standard]
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   271
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   272
lemma int_induct_raw:
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   273
  assumes a: "P (0::nat, 0)"
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   274
  and     b: "\<And>i. P i \<Longrightarrow> P (plus_int_raw i (1, 0))"
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   275
  and     c: "\<And>i. P i \<Longrightarrow> P (plus_int_raw i (uminus_int_raw (1, 0)))"
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   276
  shows      "P x"
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   277
proof (cases x, clarify)
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   278
  fix a b
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   279
  show "P (a, b)"
40928
ace26e2cee91 eliminated unqualified accesses of datatype facts -- it seems like they all of them were unintended
krauss
parents: 40468
diff changeset
   280
  proof (induct a arbitrary: b rule: nat.induct)
36524
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   281
    case zero
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   282
    show "P (0, b)" using assms by (induct b) auto
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   283
  next
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   284
    case (Suc n)
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   285
    then show ?case using assms by auto
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   286
  qed
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   287
qed
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   288
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   289
lemma int_induct:
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   290
  fixes x :: int
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   291
  assumes a: "P 0"
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   292
  and     b: "\<And>i. P i \<Longrightarrow> P (i + 1)"
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   293
  and     c: "\<And>i. P i \<Longrightarrow> P (i - 1)"
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   294
  shows      "P x"
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   295
  using a b c unfolding minus_int_def
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   296
  by (lifting int_induct_raw)
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   297
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   298
text {* Magnitide of an Integer, as a Natural Number: @{term nat} *}
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   299
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   300
definition
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   301
  "int_to_nat_raw \<equiv> \<lambda>(x, y).x - (y::nat)"
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   302
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   303
quotient_definition
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   304
  "int_to_nat::int \<Rightarrow> nat"
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   305
is
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   306
  "int_to_nat_raw"
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   307
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   308
lemma [quot_respect]:
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   309
  shows "(intrel ===> op =) int_to_nat_raw int_to_nat_raw"
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   310
  by (auto iff: int_to_nat_raw_def)
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   311
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   312
lemma nat_le_eq_zle:
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   313
  fixes w z::"int"
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   314
  shows "0 < w \<or> 0 \<le> z \<Longrightarrow> (int_to_nat w \<le> int_to_nat z) = (w \<le> z)"
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   315
  unfolding less_int_def
37594
32ad67684ee7 cosmetics: avoided statement of raw theorems, used the method descending instead
Christian Urban <urbanc@in.tum.de>
parents: 36524
diff changeset
   316
  by (descending) (auto simp add: int_to_nat_raw_def)
36524
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   317
3909002beca5 Tuning the quotient examples
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   318
end