src/HOL/Matrix_LP/SparseMatrix.thy
author haftmann
Thu, 19 Jun 2025 17:15:40 +0200
changeset 82734 89347c0cc6a3
parent 80756 4d592706086e
permissions -rw-r--r--
treat map_filter similar to list_all, list_ex, list_ex1
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
47455
26315a545e26 updated headers;
wenzelm
parents: 47108
diff changeset
     1
(*  Title:      HOL/Matrix_LP/SparseMatrix.thy
80756
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
     2
    Author:     Steven Obua; updated to Isar by LCP
16487
2060ebae96f9 proper header;
wenzelm
parents: 16417
diff changeset
     3
*)
2060ebae96f9 proper header;
wenzelm
parents: 16417
diff changeset
     4
27484
dbb9981c3d18 added marginal setup for code generation
haftmann
parents: 26300
diff changeset
     5
theory SparseMatrix
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
     6
  imports Matrix 
27484
dbb9981c3d18 added marginal setup for code generation
haftmann
parents: 26300
diff changeset
     7
begin
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
     8
42463
f270e3e18be5 modernized specifications;
wenzelm
parents: 38273
diff changeset
     9
type_synonym 'a spvec = "(nat * 'a) list"
f270e3e18be5 modernized specifications;
wenzelm
parents: 38273
diff changeset
    10
type_synonym 'a spmat = "'a spvec spvec"
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
    11
38273
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
    12
definition sparse_row_vector :: "('a::ab_group_add) spvec \<Rightarrow> 'a matrix"
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
    13
  where "sparse_row_vector arr = foldl (% m x. m + (singleton_matrix 0 (fst x) (snd x))) 0 arr"
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
    14
38273
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
    15
definition sparse_row_matrix :: "('a::ab_group_add) spmat \<Rightarrow> 'a matrix"
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
    16
  where "sparse_row_matrix arr = foldl (% m r. m + (move_matrix (sparse_row_vector (snd r)) (int (fst r)) 0)) 0 arr"
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
    17
27484
dbb9981c3d18 added marginal setup for code generation
haftmann
parents: 26300
diff changeset
    18
code_datatype sparse_row_vector sparse_row_matrix
dbb9981c3d18 added marginal setup for code generation
haftmann
parents: 26300
diff changeset
    19
dbb9981c3d18 added marginal setup for code generation
haftmann
parents: 26300
diff changeset
    20
lemma sparse_row_vector_empty [simp]: "sparse_row_vector [] = 0"
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
    21
  by (simp add: sparse_row_vector_def)
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
    22
27484
dbb9981c3d18 added marginal setup for code generation
haftmann
parents: 26300
diff changeset
    23
lemma sparse_row_matrix_empty [simp]: "sparse_row_matrix [] = 0"
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
    24
  by (simp add: sparse_row_matrix_def)
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
    25
28562
4e74209f113e `code func` now just `code`
haftmann
parents: 27653
diff changeset
    26
lemmas [code] = sparse_row_vector_empty [symmetric]
27484
dbb9981c3d18 added marginal setup for code generation
haftmann
parents: 26300
diff changeset
    27
67613
ce654b0e6d69 more symbols;
wenzelm
parents: 61945
diff changeset
    28
lemma foldl_distrstart: "\<forall>a x y. (f (g x y) a = g x (f y a)) \<Longrightarrow> (foldl f (g x y) l = g x (foldl f y l))"
31817
9b34b1449cb7 removed old primrecs
nipkow
parents: 31816
diff changeset
    29
  by (induct l arbitrary: x y, auto)
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
    30
27653
180e28bab764 more class instantiations
haftmann
parents: 27484
diff changeset
    31
lemma sparse_row_vector_cons[simp]:
180e28bab764 more class instantiations
haftmann
parents: 27484
diff changeset
    32
  "sparse_row_vector (a # arr) = (singleton_matrix 0 (fst a) (snd a)) + (sparse_row_vector arr)"
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
    33
  by (induct arr) (auto simp: foldl_distrstart sparse_row_vector_def)
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
    34
27653
180e28bab764 more class instantiations
haftmann
parents: 27484
diff changeset
    35
lemma sparse_row_vector_append[simp]:
180e28bab764 more class instantiations
haftmann
parents: 27484
diff changeset
    36
  "sparse_row_vector (a @ b) = (sparse_row_vector a) + (sparse_row_vector b)"
180e28bab764 more class instantiations
haftmann
parents: 27484
diff changeset
    37
  by (induct a) auto
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
    38
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
    39
lemma nrows_spvec[simp]: "nrows (sparse_row_vector x) \<le> (Suc 0)"
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
    40
  by (induct x) (auto simp: add_nrows)
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
    41
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
    42
lemma sparse_row_matrix_cons: "sparse_row_matrix (a#arr) = ((move_matrix (sparse_row_vector (snd a)) (int (fst a)) 0)) + sparse_row_matrix arr"
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
    43
  by (induct arr) (auto simp: foldl_distrstart sparse_row_matrix_def)
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
    44
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
    45
lemma sparse_row_matrix_append: "sparse_row_matrix (arr@brr) = (sparse_row_matrix arr) + (sparse_row_matrix brr)"
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
    46
  by (induct arr) (auto simp: sparse_row_matrix_cons)
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
    47
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
    48
fun sorted_spvec :: "'a spvec \<Rightarrow> bool"
38273
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
    49
where
27653
180e28bab764 more class instantiations
haftmann
parents: 27484
diff changeset
    50
  "sorted_spvec [] = True"
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
    51
| sorted_spvec_step1: "sorted_spvec [a] = True" 
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
    52
| sorted_spvec_step: "sorted_spvec ((m,x)#(n,y)#bs) =  ((m < n) \<and> (sorted_spvec ((n,y)#bs)))" 
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
    53
38273
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
    54
primrec sorted_spmat :: "'a spmat \<Rightarrow> bool"
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
    55
where
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
    56
  "sorted_spmat [] = True"
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
    57
| "sorted_spmat (a#as) = ((sorted_spvec (snd a)) \<and> (sorted_spmat as))"
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
    58
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
    59
declare sorted_spvec.simps [simp del]
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
    60
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
    61
lemma sorted_spvec_empty[simp]: "sorted_spvec [] = True"
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
    62
  by (simp add: sorted_spvec.simps)
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
    63
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
    64
lemma sorted_spvec_cons1: "sorted_spvec (a#as) \<Longrightarrow> sorted_spvec as"
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
    65
  using sorted_spvec.elims(2) sorted_spvec_empty by blast
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
    66
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
    67
lemma sorted_spvec_cons2: "sorted_spvec (a#b#t) \<Longrightarrow> sorted_spvec (a#t)"
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
    68
  by (smt (verit, del_insts) sorted_spvec_step order.strict_trans list.inject sorted_spvec.elims(3) surj_pair)
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
    69
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
    70
lemma sorted_spvec_cons3: "sorted_spvec(a#b#t) \<Longrightarrow> fst a < fst b"
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
    71
  by (metis sorted_spvec_step prod.collapse)
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
    72
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
    73
lemma sorted_sparse_row_vector_zero: 
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
    74
  assumes "m \<le> n"
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
    75
  shows "sorted_spvec ((n,a)#arr) \<Longrightarrow> Rep_matrix (sparse_row_vector arr) j m = 0"
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
    76
proof (induct arr)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
    77
  case Nil
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
    78
  then show ?case by auto
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
    79
next
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
    80
  case (Cons a arr)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
    81
  with assms show ?case
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
    82
    by (auto dest: sorted_spvec_cons2 sorted_spvec_cons3)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
    83
qed
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
    84
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
    85
lemma sorted_sparse_row_matrix_zero[rule_format]: 
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
    86
  assumes "m \<le> n"
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
    87
  shows "sorted_spvec ((n,a)#arr) \<Longrightarrow> Rep_matrix (sparse_row_matrix arr) m j = 0"
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
    88
proof (induct arr)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
    89
  case Nil
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
    90
  then show ?case by auto
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
    91
next
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
    92
  case (Cons a arr)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
    93
  with assms show ?case
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
    94
    unfolding sparse_row_matrix_cons
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
    95
    by (auto dest: sorted_spvec_cons2 sorted_spvec_cons3)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
    96
qed
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
    97
38273
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
    98
primrec minus_spvec :: "('a::ab_group_add) spvec \<Rightarrow> 'a spvec"
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
    99
where
15178
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   100
  "minus_spvec [] = []"
38273
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   101
| "minus_spvec (a#as) = (fst a, -(snd a))#(minus_spvec as)"
15178
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   102
38273
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   103
primrec abs_spvec :: "('a::lattice_ab_group_add_abs) spvec \<Rightarrow> 'a spvec"
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   104
where
15178
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   105
  "abs_spvec [] = []"
61945
1135b8de26c3 more symbols;
wenzelm
parents: 61169
diff changeset
   106
| "abs_spvec (a#as) = (fst a, \<bar>snd a\<bar>)#(abs_spvec as)"
15178
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   107
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   108
lemma sparse_row_vector_minus: 
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   109
  "sparse_row_vector (minus_spvec v) = - (sparse_row_vector v)"
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   110
proof (induct v)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   111
  case Nil
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   112
  then show ?case
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   113
    by auto
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   114
next
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   115
  case (Cons a v)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   116
  then have "singleton_matrix 0 (fst a) (- snd a) = - singleton_matrix 0 (fst a) (snd a)"
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   117
    by (simp add: Rep_matrix_inject minus_matrix_def)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   118
  then show ?case
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   119
    by (simp add: local.Cons)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   120
qed
27653
180e28bab764 more class instantiations
haftmann
parents: 27484
diff changeset
   121
15178
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   122
lemma sparse_row_vector_abs:
61945
1135b8de26c3 more symbols;
wenzelm
parents: 61169
diff changeset
   123
  "sorted_spvec (v :: 'a::lattice_ring spvec) \<Longrightarrow> sparse_row_vector (abs_spvec v) = \<bar>sparse_row_vector v\<bar>"
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   124
proof (induct v)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   125
  case Nil
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   126
  then show ?case
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   127
    by simp
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   128
next
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   129
  case (Cons ab v)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   130
  then have v: "sorted_spvec v"
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   131
    using sorted_spvec_cons1 by blast
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   132
  show ?case
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   133
  proof (cases ab)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   134
    case (Pair a b)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   135
    then have 0: "Rep_matrix (sparse_row_vector v) 0 a = 0"
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   136
      using Cons.prems sorted_sparse_row_vector_zero by blast
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   137
    with v Cons show ?thesis
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   138
      by (fastforce simp: Pair simp flip: Rep_matrix_inject)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   139
  qed
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   140
qed
15178
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   141
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   142
lemma sorted_spvec_minus_spvec:
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   143
  "sorted_spvec v \<Longrightarrow> sorted_spvec (minus_spvec v)"
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   144
  by (induct v rule: sorted_spvec.induct) (auto simp: sorted_spvec_step1 sorted_spvec_step)
15178
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   145
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   146
lemma sorted_spvec_abs_spvec:
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   147
  "sorted_spvec v \<Longrightarrow> sorted_spvec (abs_spvec v)"
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   148
  by (induct v rule: sorted_spvec.induct) (auto simp: sorted_spvec_step1 sorted_spvec_step)
15178
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   149
  
38273
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   150
definition "smult_spvec y = map (% a. (fst a, y * snd a))"  
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   151
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   152
lemma smult_spvec_empty[simp]: "smult_spvec y [] = []"
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   153
  by (simp add: smult_spvec_def)
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   154
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   155
lemma smult_spvec_cons: "smult_spvec y (a#arr) = (fst a, y * (snd a)) # (smult_spvec y arr)"
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   156
  by (simp add: smult_spvec_def)
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   157
38273
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   158
fun addmult_spvec :: "('a::ring) \<Rightarrow> 'a spvec \<Rightarrow> 'a spvec \<Rightarrow> 'a spvec"
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   159
where
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   160
  "addmult_spvec y arr [] = arr"
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   161
| "addmult_spvec y [] brr = smult_spvec y brr"
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   162
| "addmult_spvec y ((i,a)#arr) ((j,b)#brr) = (
31816
ffaf6dd53045 replaced recdefs by funs
nipkow
parents: 29667
diff changeset
   163
    if i < j then ((i,a)#(addmult_spvec y arr ((j,b)#brr))) 
ffaf6dd53045 replaced recdefs by funs
nipkow
parents: 29667
diff changeset
   164
    else (if (j < i) then ((j, y * b)#(addmult_spvec y ((i,a)#arr) brr))
ffaf6dd53045 replaced recdefs by funs
nipkow
parents: 29667
diff changeset
   165
    else ((i, a + y*b)#(addmult_spvec y arr brr))))"
ffaf6dd53045 replaced recdefs by funs
nipkow
parents: 29667
diff changeset
   166
(* Steven used termination "measure (% (y, a, b). length a + (length b))" *)
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   167
31816
ffaf6dd53045 replaced recdefs by funs
nipkow
parents: 29667
diff changeset
   168
lemma addmult_spvec_empty1[simp]: "addmult_spvec y [] a = smult_spvec y a"
27484
dbb9981c3d18 added marginal setup for code generation
haftmann
parents: 26300
diff changeset
   169
  by (induct a) auto
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   170
31816
ffaf6dd53045 replaced recdefs by funs
nipkow
parents: 29667
diff changeset
   171
lemma addmult_spvec_empty2[simp]: "addmult_spvec y a [] = a"
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   172
  by simp
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   173
67613
ce654b0e6d69 more symbols;
wenzelm
parents: 61945
diff changeset
   174
lemma sparse_row_vector_map: "(\<forall>x y. f (x+y) = (f x) + (f y)) \<Longrightarrow> (f::'a\<Rightarrow>('a::lattice_ring)) 0 = 0 \<Longrightarrow> 
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   175
  sparse_row_vector (map (% x. (fst x, f (snd x))) a) = apply_matrix f (sparse_row_vector a)"
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   176
  by (induct a) (simp_all add: apply_matrix_add)
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   177
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   178
lemma sparse_row_vector_smult: "sparse_row_vector (smult_spvec y a) = scalar_mult y (sparse_row_vector a)"
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   179
  by (induct a) (simp_all add: smult_spvec_cons scalar_mult_add)
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   180
35028
108662d50512 more consistent naming of type classes involving orderings (and lattices) -- c.f. NEWS
haftmann
parents: 32491
diff changeset
   181
lemma sparse_row_vector_addmult_spvec: "sparse_row_vector (addmult_spvec (y::'a::lattice_ring) a b) = 
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   182
  (sparse_row_vector a) + (scalar_mult y (sparse_row_vector b))"
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   183
  by (induct y a b rule: addmult_spvec.induct)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   184
     (simp_all add: scalar_mult_add smult_spvec_cons sparse_row_vector_smult singleton_matrix_add)
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   185
31817
9b34b1449cb7 removed old primrecs
nipkow
parents: 31816
diff changeset
   186
lemma sorted_smult_spvec: "sorted_spvec a \<Longrightarrow> sorted_spvec (smult_spvec y a)"
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   187
  by (induct a rule: sorted_spvec.induct) (auto simp: smult_spvec_def sorted_spvec_step1 sorted_spvec_step)
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   188
31816
ffaf6dd53045 replaced recdefs by funs
nipkow
parents: 29667
diff changeset
   189
lemma sorted_spvec_addmult_spvec_helper: "\<lbrakk>sorted_spvec (addmult_spvec y ((a, b) # arr) brr); aa < a; sorted_spvec ((a, b) # arr); 
ffaf6dd53045 replaced recdefs by funs
nipkow
parents: 29667
diff changeset
   190
  sorted_spvec ((aa, ba) # brr)\<rbrakk> \<Longrightarrow> sorted_spvec ((aa, y * ba) # addmult_spvec y ((a, b) # arr) brr)"  
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   191
  by (induct brr) (auto simp: sorted_spvec.simps)
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   192
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   193
lemma sorted_spvec_addmult_spvec_helper2: 
31816
ffaf6dd53045 replaced recdefs by funs
nipkow
parents: 29667
diff changeset
   194
 "\<lbrakk>sorted_spvec (addmult_spvec y arr ((aa, ba) # brr)); a < aa; sorted_spvec ((a, b) # arr); sorted_spvec ((aa, ba) # brr)\<rbrakk>
ffaf6dd53045 replaced recdefs by funs
nipkow
parents: 29667
diff changeset
   195
       \<Longrightarrow> sorted_spvec ((a, b) # addmult_spvec y arr ((aa, ba) # brr))"
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   196
  by (induct arr) (auto simp: smult_spvec_def sorted_spvec.simps)
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   197
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   198
lemma sorted_spvec_addmult_spvec_helper3[rule_format]:
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   199
  "sorted_spvec (addmult_spvec y arr brr) \<Longrightarrow> 
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   200
   sorted_spvec ((aa, b) # arr) \<Longrightarrow> 
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   201
  sorted_spvec ((aa, ba) # brr) \<Longrightarrow>
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   202
   sorted_spvec ((aa, b + y * ba) # (addmult_spvec y arr brr))"
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   203
  by (smt (verit, ccfv_threshold) sorted_spvec_step addmult_spvec.simps(1) list.distinct(1) list.sel(3) sorted_spvec.elims(1) sorted_spvec_addmult_spvec_helper2)
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   204
31817
9b34b1449cb7 removed old primrecs
nipkow
parents: 31816
diff changeset
   205
lemma sorted_addmult_spvec: "sorted_spvec a \<Longrightarrow> sorted_spvec b \<Longrightarrow> sorted_spvec (addmult_spvec y a b)"
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   206
proof (induct y a b rule: addmult_spvec.induct)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   207
  case (1 y arr)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   208
  then show ?case
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   209
    by simp
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   210
next
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   211
  case (2 y v va)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   212
  then show ?case 
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   213
    by (simp add: sorted_smult_spvec)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   214
next
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   215
  case (3 y i a arr j b brr)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   216
  show ?case 
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   217
  proof (cases i j rule: linorder_cases)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   218
    case less
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   219
    with 3 show ?thesis
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   220
      by (simp add: sorted_spvec_addmult_spvec_helper2 sorted_spvec_cons1)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   221
  next
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   222
    case equal
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   223
    with 3 show ?thesis 
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   224
      by (simp add: sorted_spvec_addmult_spvec_helper3 sorted_spvec_cons1)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   225
  next
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   226
    case greater
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   227
    with 3 show ?thesis 
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   228
      by (simp add: sorted_spvec_addmult_spvec_helper sorted_spvec_cons1)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   229
  qed
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   230
qed
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   231
38273
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   232
fun mult_spvec_spmat :: "('a::lattice_ring) spvec \<Rightarrow> 'a spvec \<Rightarrow> 'a spmat  \<Rightarrow> 'a spvec"
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   233
where
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   234
  "mult_spvec_spmat c [] brr = c"
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   235
| "mult_spvec_spmat c arr [] = c"
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   236
| "mult_spvec_spmat c ((i,a)#arr) ((j,b)#brr) = (
31816
ffaf6dd53045 replaced recdefs by funs
nipkow
parents: 29667
diff changeset
   237
     if (i < j) then mult_spvec_spmat c arr ((j,b)#brr)
ffaf6dd53045 replaced recdefs by funs
nipkow
parents: 29667
diff changeset
   238
     else if (j < i) then mult_spvec_spmat c ((i,a)#arr) brr 
ffaf6dd53045 replaced recdefs by funs
nipkow
parents: 29667
diff changeset
   239
     else mult_spvec_spmat (addmult_spvec a c b) arr brr)"
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   240
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   241
lemma sparse_row_mult_spvec_spmat: 
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   242
  assumes "sorted_spvec (a::('a::lattice_ring) spvec)" "sorted_spvec B"
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   243
  shows "sparse_row_vector (mult_spvec_spmat c a B) = (sparse_row_vector c) + (sparse_row_vector a) * (sparse_row_matrix B)"
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   244
proof -
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   245
  have comp_1: "!! a b. a < b \<Longrightarrow> Suc 0 \<le> nat ((int b)-(int a))" by arith
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   246
  have not_iff: "!! a b. a = b \<Longrightarrow> (~ a) = (~ b)" by simp
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   247
  {
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   248
    fix a 
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   249
    fix v :: "(nat \<times> 'a) list"
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   250
    assume a: "a < nrows(sparse_row_vector v)"
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   251
    have "nrows(sparse_row_vector v) \<le> 1" by simp
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   252
    then have "a = 0"
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   253
      using a dual_order.strict_trans1 by blast
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   254
  }
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   255
  note nrows_helper = this
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   256
  show ?thesis
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   257
    using assms
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   258
  proof (induct c a B rule: mult_spvec_spmat.induct)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   259
    case (1 c brr)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   260
    then show ?case
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   261
      by simp
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   262
  next
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   263
    case (2 c v va)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   264
    then show ?case
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   265
      by simp
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   266
  next
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   267
    case (3 c i a arr j b brr)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   268
    then have abrr: "sorted_spvec arr" "sorted_spvec brr"
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   269
      using sorted_spvec_cons1 by blast+
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   270
    have "\<And>m n. \<lbrakk>a \<noteq> 0; 0 < m\<rbrakk>
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   271
           \<Longrightarrow> a * Rep_matrix (sparse_row_vector b) m n = 0"
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   272
      by (metis mult_zero_right neq0_conv nrows_helper nrows_notzero)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   273
    then have \<dagger>: "scalar_mult a (sparse_row_vector b) =
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   274
            singleton_matrix 0 j a * move_matrix (sparse_row_vector b) (int j) 0"
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   275
      apply (intro matrix_eqI)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   276
      apply (simp)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   277
      apply (subst Rep_matrix_mult)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   278
      apply (subst foldseq_almostzero, auto)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   279
      done
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   280
    show ?case
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   281
    proof (cases i j rule: linorder_cases)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   282
      case less
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   283
      with 3 abrr \<dagger> show ?thesis
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   284
        apply (simp add: algebra_simps sparse_row_matrix_cons Rep_matrix_zero_imp_mult_zero)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   285
        by (metis Rep_matrix_zero_imp_mult_zero Rep_singleton_matrix less_imp_le_nat sorted_sparse_row_matrix_zero)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   286
    next
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   287
      case equal
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   288
      with 3 abrr \<dagger> show ?thesis
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   289
        apply (simp add: sparse_row_matrix_cons algebra_simps sparse_row_vector_addmult_spvec)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   290
        apply (subst Rep_matrix_zero_imp_mult_zero)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   291
        using sorted_sparse_row_matrix_zero apply fastforce
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   292
        apply (subst Rep_matrix_zero_imp_mult_zero)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   293
         apply (metis Rep_move_matrix comp_1 nrows_le nrows_spvec sorted_sparse_row_vector_zero verit_comp_simplify1(3))
80756
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   294
        apply simp
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   295
        done
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   296
    next
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   297
      case greater
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   298
      have "Rep_matrix (sparse_row_vector arr) j' k = 0 \<or>
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   299
           Rep_matrix (move_matrix (sparse_row_vector b) (int j) 0) k
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   300
            i' = 0"
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   301
        if "sorted_spvec ((i, a) # arr)" for j' i' k
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   302
      proof (cases "k \<le> j")
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   303
        case True
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   304
        with greater that show ?thesis
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   305
          by (meson order.trans nat_less_le sorted_sparse_row_vector_zero)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   306
      qed (use nrows_helper nrows_notzero in force)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   307
      then have "sparse_row_vector arr * move_matrix (sparse_row_vector b) (int j) 0 = 0"
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   308
        using greater 3 
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   309
        by (simp add: Rep_matrix_zero_imp_mult_zero)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   310
      with greater 3 abrr show ?thesis
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   311
        apply (simp add: algebra_simps sparse_row_matrix_cons)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   312
        by (metis Rep_matrix_zero_imp_mult_zero Rep_move_matrix Rep_singleton_matrix comp_1 nrows_le nrows_spvec)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   313
    qed
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   314
  qed
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   315
qed
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   316
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   317
lemma sorted_mult_spvec_spmat: 
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   318
  "sorted_spvec (c::('a::lattice_ring) spvec) \<Longrightarrow> sorted_spmat B \<Longrightarrow> sorted_spvec (mult_spvec_spmat c a B)"
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   319
  by (induct c a B rule: mult_spvec_spmat.induct) (simp_all add: sorted_addmult_spvec)
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   320
38273
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   321
primrec mult_spmat :: "('a::lattice_ring) spmat \<Rightarrow> 'a spmat \<Rightarrow> 'a spmat"
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   322
where
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   323
  "mult_spmat [] A = []"
38273
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   324
| "mult_spmat (a#as) A = (fst a, mult_spvec_spmat [] (snd a) A)#(mult_spmat as A)"
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   325
31817
9b34b1449cb7 removed old primrecs
nipkow
parents: 31816
diff changeset
   326
lemma sparse_row_mult_spmat: 
9b34b1449cb7 removed old primrecs
nipkow
parents: 31816
diff changeset
   327
  "sorted_spmat A \<Longrightarrow> sorted_spvec B \<Longrightarrow>
9b34b1449cb7 removed old primrecs
nipkow
parents: 31816
diff changeset
   328
   sparse_row_matrix (mult_spmat A B) = (sparse_row_matrix A) * (sparse_row_matrix B)"
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   329
  by (induct A) (auto simp: sparse_row_matrix_cons sparse_row_mult_spvec_spmat algebra_simps move_matrix_mult)
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   330
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   331
lemma sorted_spvec_mult_spmat:
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   332
  fixes A :: "('a::lattice_ring) spmat"
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   333
  shows "sorted_spvec A \<Longrightarrow> sorted_spvec (mult_spmat A B)"
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   334
by (induct A rule: sorted_spvec.induct) (auto simp: sorted_spvec.simps)
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   335
31817
9b34b1449cb7 removed old primrecs
nipkow
parents: 31816
diff changeset
   336
lemma sorted_spmat_mult_spmat:
35028
108662d50512 more consistent naming of type classes involving orderings (and lattices) -- c.f. NEWS
haftmann
parents: 32491
diff changeset
   337
  "sorted_spmat (B::('a::lattice_ring) spmat) \<Longrightarrow> sorted_spmat (mult_spmat A B)"
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   338
  by (induct A) (auto simp: sorted_mult_spvec_spmat) 
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   339
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   340
38273
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   341
fun add_spvec :: "('a::lattice_ab_group_add) spvec \<Rightarrow> 'a spvec \<Rightarrow> 'a spvec"
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   342
where
31816
ffaf6dd53045 replaced recdefs by funs
nipkow
parents: 29667
diff changeset
   343
(* "measure (% (a, b). length a + (length b))" *)
38273
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   344
  "add_spvec arr [] = arr"
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   345
| "add_spvec [] brr = brr"
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   346
| "add_spvec ((i,a)#arr) ((j,b)#brr) = (
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   347
     if i < j then (i,a)#(add_spvec arr ((j,b)#brr)) 
31816
ffaf6dd53045 replaced recdefs by funs
nipkow
parents: 29667
diff changeset
   348
     else if (j < i) then (j,b) # add_spvec ((i,a)#arr) brr
ffaf6dd53045 replaced recdefs by funs
nipkow
parents: 29667
diff changeset
   349
     else (i, a+b) # add_spvec arr brr)"
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   350
31816
ffaf6dd53045 replaced recdefs by funs
nipkow
parents: 29667
diff changeset
   351
lemma add_spvec_empty1[simp]: "add_spvec [] a = a"
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   352
  by (cases a, auto)
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   353
31816
ffaf6dd53045 replaced recdefs by funs
nipkow
parents: 29667
diff changeset
   354
lemma sparse_row_vector_add: "sparse_row_vector (add_spvec a b) = (sparse_row_vector a) + (sparse_row_vector b)"
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   355
  by (induct a b rule: add_spvec.induct) (simp_all add: singleton_matrix_add)
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   356
38273
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   357
fun add_spmat :: "('a::lattice_ab_group_add) spmat \<Rightarrow> 'a spmat \<Rightarrow> 'a spmat"
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   358
where
31816
ffaf6dd53045 replaced recdefs by funs
nipkow
parents: 29667
diff changeset
   359
(* "measure (% (A,B). (length A)+(length B))" *)
38273
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   360
  "add_spmat [] bs = bs"
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   361
| "add_spmat as [] = as"
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   362
| "add_spmat ((i,a)#as) ((j,b)#bs) = (
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   363
    if i < j then 
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   364
      (i,a) # add_spmat as ((j,b)#bs)
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   365
    else if j < i then
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   366
      (j,b) # add_spmat ((i,a)#as) bs
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   367
    else
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   368
      (i, add_spvec a b) # add_spmat as bs)"
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   369
31816
ffaf6dd53045 replaced recdefs by funs
nipkow
parents: 29667
diff changeset
   370
lemma add_spmat_Nil2[simp]: "add_spmat as [] = as"
ffaf6dd53045 replaced recdefs by funs
nipkow
parents: 29667
diff changeset
   371
by(cases as) auto
ffaf6dd53045 replaced recdefs by funs
nipkow
parents: 29667
diff changeset
   372
ffaf6dd53045 replaced recdefs by funs
nipkow
parents: 29667
diff changeset
   373
lemma sparse_row_add_spmat: "sparse_row_matrix (add_spmat A B) = (sparse_row_matrix A) + (sparse_row_matrix B)"
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   374
  by (induct A B rule: add_spmat.induct) (auto simp: sparse_row_matrix_cons sparse_row_vector_add move_matrix_add)
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   375
28562
4e74209f113e `code func` now just `code`
haftmann
parents: 27653
diff changeset
   376
lemmas [code] = sparse_row_add_spmat [symmetric]
4e74209f113e `code func` now just `code`
haftmann
parents: 27653
diff changeset
   377
lemmas [code] = sparse_row_vector_add [symmetric]
27484
dbb9981c3d18 added marginal setup for code generation
haftmann
parents: 26300
diff changeset
   378
31816
ffaf6dd53045 replaced recdefs by funs
nipkow
parents: 29667
diff changeset
   379
lemma sorted_add_spvec_helper1[rule_format]: "add_spvec ((a,b)#arr) brr = (ab, bb) # list \<longrightarrow> (ab = a | (brr \<noteq> [] & ab = fst (hd brr)))"
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   380
proof - 
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   381
  have "(\<forall>x ab a. x = (a,b)#arr \<longrightarrow> add_spvec x brr = (ab, bb) # list \<longrightarrow> (ab = a | (ab = fst (hd brr))))"
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   382
    by (induct brr rule: add_spvec.induct) (auto split:if_splits)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   383
  then show ?thesis
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   384
    by (case_tac brr, auto)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   385
qed
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   386
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   387
lemma sorted_add_spmat_helper1[rule_format]:
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   388
  "add_spmat ((a,b)#arr) brr = (ab, bb) # list \<Longrightarrow> (ab = a | (brr \<noteq> [] & ab = fst (hd brr)))"
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   389
  by (smt (verit) add_spmat.elims fst_conv list.distinct(1) list.sel(1))
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   390
31817
9b34b1449cb7 removed old primrecs
nipkow
parents: 31816
diff changeset
   391
lemma sorted_add_spvec_helper: "add_spvec arr brr = (ab, bb) # list \<Longrightarrow> ((arr \<noteq> [] & ab = fst (hd arr)) | (brr \<noteq> [] & ab = fst (hd brr)))"
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   392
  by (induct arr brr rule: add_spvec.induct) (auto split:if_splits)
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   393
31817
9b34b1449cb7 removed old primrecs
nipkow
parents: 31816
diff changeset
   394
lemma sorted_add_spmat_helper: "add_spmat arr brr = (ab, bb) # list \<Longrightarrow> ((arr \<noteq> [] & ab = fst (hd arr)) | (brr \<noteq> [] & ab = fst (hd brr)))"
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   395
  by (induct arr brr rule: add_spmat.induct) (auto split:if_splits)
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   396
31816
ffaf6dd53045 replaced recdefs by funs
nipkow
parents: 29667
diff changeset
   397
lemma add_spvec_commute: "add_spvec a b = add_spvec b a"
31817
9b34b1449cb7 removed old primrecs
nipkow
parents: 31816
diff changeset
   398
by (induct a b rule: add_spvec.induct) auto
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   399
31816
ffaf6dd53045 replaced recdefs by funs
nipkow
parents: 29667
diff changeset
   400
lemma add_spmat_commute: "add_spmat a b = add_spmat b a"
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   401
  by (induct a b rule: add_spmat.induct) (simp_all add: add_spvec_commute)
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   402
  
31816
ffaf6dd53045 replaced recdefs by funs
nipkow
parents: 29667
diff changeset
   403
lemma sorted_add_spvec_helper2: "add_spvec ((a,b)#arr) brr = (ab, bb) # list \<Longrightarrow> aa < a \<Longrightarrow> sorted_spvec ((aa, ba) # brr) \<Longrightarrow> aa < ab"
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   404
  by (smt (verit, best) add_spvec.elims fst_conv list.sel(1) sorted_spvec_cons3)
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   405
31816
ffaf6dd53045 replaced recdefs by funs
nipkow
parents: 29667
diff changeset
   406
lemma sorted_add_spmat_helper2: "add_spmat ((a,b)#arr) brr = (ab, bb) # list \<Longrightarrow> aa < a \<Longrightarrow> sorted_spvec ((aa, ba) # brr) \<Longrightarrow> aa < ab"
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   407
  by (metis (no_types, opaque_lifting) add_spmat.simps(1) list.sel(1) neq_Nil_conv sorted_add_spmat_helper sorted_spvec_cons3)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   408
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   409
lemma sorted_spvec_add_spvec: "sorted_spvec a \<Longrightarrow> sorted_spvec b \<Longrightarrow> sorted_spvec (add_spvec a b)"
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   410
proof (induct a b rule: add_spvec.induct)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   411
  case (3 i a arr j b brr)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   412
  then have "sorted_spvec arr" "sorted_spvec brr"
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   413
    using sorted_spvec_cons1 by blast+
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   414
  with 3 show ?case
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   415
    apply simp
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   416
    by (smt (verit, ccfv_SIG) add_spvec.simps(2) list.sel(3) sorted_add_spvec_helper sorted_spvec.elims(1))
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   417
qed auto
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   418
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   419
lemma sorted_spvec_add_spmat:
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   420
  "sorted_spvec A \<Longrightarrow> sorted_spvec B \<Longrightarrow> sorted_spvec (add_spmat A B)"
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   421
proof (induct A B rule: add_spmat.induct)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   422
  case (1 bs)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   423
  then show ?case by auto
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   424
next
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   425
  case (2 v va)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   426
  then show ?case by auto
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   427
next
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   428
  case (3 i a as j b bs)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   429
  then have "sorted_spvec as" "sorted_spvec bs"
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   430
    using sorted_spvec_cons1 by blast+
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   431
  with 3 show ?case
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   432
    apply simp
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   433
    by (smt (verit) Pair_inject add_spmat.elims list.discI list.inject sorted_spvec.elims(1))
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   434
qed
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   435
31817
9b34b1449cb7 removed old primrecs
nipkow
parents: 31816
diff changeset
   436
lemma sorted_spmat_add_spmat[rule_format]: "sorted_spmat A \<Longrightarrow> sorted_spmat B \<Longrightarrow> sorted_spmat (add_spmat A B)"
80756
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   437
  by (induct A B rule: add_spmat.induct) (simp_all add: sorted_spvec_add_spvec)
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   438
38273
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   439
fun le_spvec :: "('a::lattice_ab_group_add) spvec \<Rightarrow> 'a spvec \<Rightarrow> bool"
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   440
where
31816
ffaf6dd53045 replaced recdefs by funs
nipkow
parents: 29667
diff changeset
   441
(* "measure (% (a,b). (length a) + (length b))" *)
38273
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   442
  "le_spvec [] [] = True"
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   443
| "le_spvec ((_,a)#as) [] = (a \<le> 0 & le_spvec as [])"
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   444
| "le_spvec [] ((_,b)#bs) = (0 \<le> b & le_spvec [] bs)"
38273
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   445
| "le_spvec ((i,a)#as) ((j,b)#bs) = (
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   446
    if (i < j) then a \<le> 0 & le_spvec as ((j,b)#bs)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   447
    else if (j < i) then 0 \<le> b & le_spvec ((i,a)#as) bs
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   448
    else a \<le> b & le_spvec as bs)"
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   449
38273
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   450
fun le_spmat :: "('a::lattice_ab_group_add) spmat \<Rightarrow> 'a spmat \<Rightarrow> bool"
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   451
where
31816
ffaf6dd53045 replaced recdefs by funs
nipkow
parents: 29667
diff changeset
   452
(* "measure (% (a,b). (length a) + (length b))" *)
38273
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   453
  "le_spmat [] [] = True"
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   454
| "le_spmat ((i,a)#as) [] = (le_spvec a [] & le_spmat as [])"
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   455
| "le_spmat [] ((j,b)#bs) = (le_spvec [] b & le_spmat [] bs)"
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   456
| "le_spmat ((i,a)#as) ((j,b)#bs) = (
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   457
    if i < j then (le_spvec a [] & le_spmat as ((j,b)#bs))
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   458
    else if j < i then (le_spvec [] b & le_spmat ((i,a)#as) bs)
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   459
    else (le_spvec a b & le_spmat as bs))"
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   460
35416
d8d7d1b785af replaced a couple of constsdefs by definitions (also some old primrecs by modern ones)
haftmann
parents: 35028
diff changeset
   461
definition disj_matrices :: "('a::zero) matrix \<Rightarrow> 'a matrix \<Rightarrow> bool" where
38273
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   462
  "disj_matrices A B \<longleftrightarrow>
67613
ce654b0e6d69 more symbols;
wenzelm
parents: 61945
diff changeset
   463
    (\<forall>j i. (Rep_matrix A j i \<noteq> 0) \<longrightarrow> (Rep_matrix B j i = 0)) & (\<forall>j i. (Rep_matrix B j i \<noteq> 0) \<longrightarrow> (Rep_matrix A j i = 0))"  
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   464
15580
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   465
lemma disj_matrices_contr1: "disj_matrices A B \<Longrightarrow> Rep_matrix A j i \<noteq> 0 \<Longrightarrow> Rep_matrix B j i = 0"
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   466
   by (simp add: disj_matrices_def)
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   467
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   468
lemma disj_matrices_contr2: "disj_matrices A B \<Longrightarrow> Rep_matrix B j i \<noteq> 0 \<Longrightarrow> Rep_matrix A j i = 0"
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   469
   by (simp add: disj_matrices_def)
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   470
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   471
80756
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   472
lemma disj_matrices_add:
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   473
  fixes A :: "('a::lattice_ab_group_add) matrix"
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   474
  shows  "disj_matrices A B \<Longrightarrow> disj_matrices C D \<Longrightarrow> disj_matrices A D 
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   475
       \<Longrightarrow> disj_matrices B C \<Longrightarrow> (A + B \<le> C + D) = (A \<le> C \<and> B \<le> D)"
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   476
  apply (intro iffI conjI)
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   477
  unfolding le_matrix_def disj_matrices_def
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   478
  apply (metis Rep_matrix_add group_cancel.rule0 order_refl)
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   479
  apply (metis (no_types, lifting) Rep_matrix_add add_cancel_right_left dual_order.refl)
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   480
  by (meson add_mono le_matrix_def)
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   481
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   482
lemma disj_matrices_zero1[simp]: "disj_matrices 0 B"
80756
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   483
  by (simp add: disj_matrices_def)
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   484
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   485
lemma disj_matrices_zero2[simp]: "disj_matrices A 0"
80756
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   486
  by (simp add: disj_matrices_def)
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   487
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   488
lemma disj_matrices_commute: "disj_matrices A B = disj_matrices B A"
80756
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   489
  by (auto simp: disj_matrices_def)
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   490
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   491
lemma disj_matrices_add_le_zero: "disj_matrices A B \<Longrightarrow>
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   492
  (A + B \<le> 0) = (A \<le> 0 & (B::('a::lattice_ab_group_add) matrix) \<le> 0)"
80756
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   493
  by (rule disj_matrices_add[of A B 0 0, simplified])
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   494
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   495
lemma disj_matrices_add_zero_le: "disj_matrices A B \<Longrightarrow>
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   496
  (0 \<le> A + B) = (0 \<le> A & 0 \<le> (B::('a::lattice_ab_group_add) matrix))"
80756
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   497
  by (rule disj_matrices_add[of 0 0 A B, simplified])
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   498
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   499
lemma disj_matrices_add_x_le: "disj_matrices A B \<Longrightarrow> disj_matrices B C \<Longrightarrow> 
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   500
  (A \<le> B + C) = (A \<le> C & 0 \<le> (B::('a::lattice_ab_group_add) matrix))"
80756
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   501
  by (auto simp: disj_matrices_add[of 0 A B C, simplified])
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   502
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   503
lemma disj_matrices_add_le_x: "disj_matrices A B \<Longrightarrow> disj_matrices B C \<Longrightarrow> 
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   504
  (B + A \<le> C) = (A \<le> C &  (B::('a::lattice_ab_group_add) matrix) \<le> 0)"
80756
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   505
  by (auto simp: disj_matrices_add[of B A 0 C,simplified] disj_matrices_commute)
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   506
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   507
lemma disj_sparse_row_singleton: "i \<le> j \<Longrightarrow> sorted_spvec((j,y)#v) \<Longrightarrow> disj_matrices (sparse_row_vector v) (singleton_matrix 0 i x)"
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   508
  apply (simp add: disj_matrices_def)
80756
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   509
  using sorted_sparse_row_vector_zero by blast
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   510
35028
108662d50512 more consistent naming of type classes involving orderings (and lattices) -- c.f. NEWS
haftmann
parents: 32491
diff changeset
   511
lemma disj_matrices_x_add: "disj_matrices A B \<Longrightarrow> disj_matrices A C \<Longrightarrow> disj_matrices (A::('a::lattice_ab_group_add) matrix) (B+C)"
80756
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   512
  by (smt (verit, ccfv_SIG) Rep_matrix_add add_0 disj_matrices_def)
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   513
35028
108662d50512 more consistent naming of type classes involving orderings (and lattices) -- c.f. NEWS
haftmann
parents: 32491
diff changeset
   514
lemma disj_matrices_add_x: "disj_matrices A B \<Longrightarrow> disj_matrices A C \<Longrightarrow> disj_matrices (B+C) (A::('a::lattice_ab_group_add) matrix)" 
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   515
  by (simp add: disj_matrices_x_add disj_matrices_commute)
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   516
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   517
lemma disj_singleton_matrices[simp]: "disj_matrices (singleton_matrix j i x) (singleton_matrix u v y) = (j \<noteq> u | i \<noteq> v | x = 0 | y = 0)" 
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   518
  by (auto simp: disj_matrices_def)
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   519
80756
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   520
lemma disj_move_sparse_vec_mat:
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   521
  assumes "j \<le> a" and "sorted_spvec ((a, c) # as)"
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   522
  shows "disj_matrices (sparse_row_matrix as) (move_matrix (sparse_row_vector b) (int j) i)"
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   523
proof -
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   524
  have "Rep_matrix (sparse_row_vector b) (n-j) (nat (int m - i)) = 0"
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   525
    if "\<not> n<j" and nz: "Rep_matrix (sparse_row_matrix as) n m \<noteq> 0"
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   526
    for n m
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   527
  proof -
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   528
    have "n \<noteq> j"
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   529
      using assms sorted_sparse_row_matrix_zero nz by blast
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   530
    with that have "j < n"  by auto
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   531
    then show ?thesis
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   532
      by (metis One_nat_def Suc_diff_Suc nrows nrows_spvec plus_1_eq_Suc trans_le_add1)
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   533
  qed
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   534
  then show ?thesis
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   535
    by (auto simp: disj_matrices_def nat_minus_as_int)
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   536
qed
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   537
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   538
lemma disj_move_sparse_row_vector_twice:
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   539
  "j \<noteq> u \<Longrightarrow> disj_matrices (move_matrix (sparse_row_vector a) j i) (move_matrix (sparse_row_vector b) u v)"
80756
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   540
  unfolding disj_matrices_def
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   541
  by (smt (verit, ccfv_SIG) One_nat_def Rep_move_matrix of_nat_1 le_nat_iff nrows nrows_spvec of_nat_le_iff)
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   542
80756
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   543
lemma le_spvec_iff_sparse_row_le:
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   544
  "sorted_spvec a \<Longrightarrow> sorted_spvec b \<Longrightarrow> (le_spvec a b) \<longleftrightarrow> (sparse_row_vector a \<le> sparse_row_vector b)"
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   545
proof (induct a b rule: le_spvec.induct)
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   546
  case 1
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   547
  then show ?case
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   548
    by auto
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   549
next
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   550
  case (2 uu a as)
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   551
  then have "sorted_spvec as"
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   552
    by (metis sorted_spvec_cons1)
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   553
  with 2 show ?case
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   554
    apply (simp add: add.commute)
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   555
    by (metis disj_matrices_add_le_zero disj_sparse_row_singleton le_refl singleton_le_zero)
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   556
next
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   557
  case (3 uv b bs)
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   558
  then have "sorted_spvec bs"
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   559
    by (metis sorted_spvec_cons1)
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   560
  with 3 show ?case
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   561
    apply (simp add: add.commute)
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   562
    by (metis disj_matrices_add_zero_le disj_sparse_row_singleton le_refl singleton_ge_zero)
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   563
next
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   564
  case (4 i a as j b bs)
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   565
  then obtain \<section>: "sorted_spvec as" "sorted_spvec bs"
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   566
    by (metis sorted_spvec_cons1)
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   567
  show ?case
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   568
  proof (cases i j rule: linorder_cases)
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   569
    case less
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   570
    with 4 \<section> show ?thesis
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   571
      apply (simp add: )
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   572
      by (metis disj_matrices_add_le_x disj_matrices_add_x disj_matrices_commute disj_singleton_matrices disj_sparse_row_singleton less_imp_le_nat singleton_le_zero not_le)
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   573
  next
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   574
    case equal
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   575
    with 4 \<section> show ?thesis
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   576
      apply (simp add: )
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   577
      by (metis disj_matrices_add disj_matrices_commute disj_sparse_row_singleton order_refl singleton_matrix_le)
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   578
  next
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   579
    case greater
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   580
    with 4 \<section> show ?thesis
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   581
      apply (simp add: )
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   582
      by (metis disj_matrices_add_x disj_matrices_add_x_le disj_matrices_commute disj_singleton_matrices disj_sparse_row_singleton le_refl order_less_le singleton_ge_zero)
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   583
  qed
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   584
qed
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   585
80756
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   586
lemma le_spvec_empty2_sparse_row: 
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   587
  "sorted_spvec b \<Longrightarrow> le_spvec b [] = (sparse_row_vector b \<le> 0)"
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   588
  by (simp add: le_spvec_iff_sparse_row_le)
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   589
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   590
lemma le_spvec_empty1_sparse_row: 
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   591
  "(sorted_spvec b) \<Longrightarrow> (le_spvec [] b = (0 \<le> sparse_row_vector b))"
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   592
  by (simp add: le_spvec_iff_sparse_row_le)
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   593
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   594
lemma le_spmat_iff_sparse_row_le:
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   595
  "\<lbrakk>sorted_spvec A; sorted_spmat A; sorted_spvec B; sorted_spmat B\<rbrakk> \<Longrightarrow> 
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   596
  le_spmat A B = (sparse_row_matrix A \<le> sparse_row_matrix B)"
80756
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   597
proof (induct A B rule: le_spmat.induct)
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   598
  case (4 i a as j b bs)
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   599
  then obtain \<section>: "sorted_spvec as" "sorted_spvec bs"
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   600
    by (metis sorted_spvec_cons1)
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   601
  show ?case
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   602
  proof (cases i j rule: linorder_cases)
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   603
    case less
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   604
    with 4 \<section> show ?thesis
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   605
      apply (simp add: sparse_row_matrix_cons le_spvec_empty2_sparse_row)
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   606
      by (metis disj_matrices_add_le_x disj_matrices_add_x disj_matrices_commute disj_move_sparse_row_vector_twice disj_move_sparse_vec_mat int_eq_iff less_not_refl move_matrix_le_zero order_le_less)
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   607
  next
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   608
    case equal
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   609
    with 4 \<section> show ?thesis
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   610
      by (simp add: sparse_row_matrix_cons le_spvec_iff_sparse_row_le disj_matrices_commute disj_move_sparse_vec_mat[OF order_refl] disj_matrices_add)
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   611
  next
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   612
    case greater
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   613
    with 4 \<section> show ?thesis
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   614
      apply (simp add: sparse_row_matrix_cons le_spvec_empty1_sparse_row)
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   615
      by (metis disj_matrices_add_x disj_matrices_add_x_le disj_matrices_commute disj_move_sparse_row_vector_twice disj_move_sparse_vec_mat move_matrix_zero_le nat_int nat_less_le of_nat_0_le_iff order_refl)
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   616
  qed
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   617
qed (auto simp add: sparse_row_matrix_cons disj_matrices_add_le_zero disj_matrices_add_zero_le disj_move_sparse_vec_mat[OF order_refl] 
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   618
    disj_matrices_commute sorted_spvec_cons1 le_spvec_empty2_sparse_row le_spvec_empty1_sparse_row)
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   619
15178
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   620
38273
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   621
primrec abs_spmat :: "('a::lattice_ring) spmat \<Rightarrow> 'a spmat"
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   622
where
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   623
  "abs_spmat [] = []"
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   624
| "abs_spmat (a#as) = (fst a, abs_spvec (snd a))#(abs_spmat as)"
15178
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   625
38273
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   626
primrec minus_spmat :: "('a::lattice_ring) spmat \<Rightarrow> 'a spmat"
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   627
where
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   628
  "minus_spmat [] = []"
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   629
| "minus_spmat (a#as) = (fst a, minus_spvec (snd a))#(minus_spmat as)"
15178
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   630
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   631
lemma sparse_row_matrix_minus:
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   632
  "sparse_row_matrix (minus_spmat A) = - (sparse_row_matrix A)"
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   633
proof (induct A)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   634
  case Nil
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   635
  then show ?case by auto
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   636
next
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   637
  case (Cons a A)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   638
  then show ?case
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   639
    by (simp add: sparse_row_vector_minus sparse_row_matrix_cons matrix_eqI)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   640
qed
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   641
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   642
lemma Rep_sparse_row_vector_zero:
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   643
  assumes "x \<noteq> 0"
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   644
    shows "Rep_matrix (sparse_row_vector v) x y = 0"
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   645
  by (metis Suc_leI assms le0 le_eq_less_or_eq nrows_le nrows_spvec)
15178
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   646
    
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   647
lemma sparse_row_matrix_abs:
61945
1135b8de26c3 more symbols;
wenzelm
parents: 61169
diff changeset
   648
  "sorted_spvec A \<Longrightarrow> sorted_spmat A \<Longrightarrow> sparse_row_matrix (abs_spmat A) = \<bar>sparse_row_matrix A\<bar>"
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   649
proof (induct A)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   650
  case Nil
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   651
  then show ?case by auto
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   652
next
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   653
  case (Cons ab A)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   654
  then have A: "sorted_spvec A"
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   655
    using sorted_spvec_cons1 by blast
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   656
  show ?case 
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   657
  proof (cases ab)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   658
    case (Pair a b)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   659
    show ?thesis
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   660
      unfolding Pair
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   661
    proof (intro matrix_eqI)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   662
      fix m n
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   663
      show "Rep_matrix (sparse_row_matrix (abs_spmat ((a,b) # A))) m n 
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   664
          = Rep_matrix \<bar>sparse_row_matrix ((a,b) # A)\<bar> m n"
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   665
        using Cons Pair A 
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   666
        apply (simp add: sparse_row_vector_abs sparse_row_matrix_cons)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   667
        apply (cases "m=a")
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   668
        using sorted_sparse_row_matrix_zero apply fastforce
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   669
        by (simp add: Rep_sparse_row_vector_zero)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   670
    qed
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   671
  qed
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   672
qed
15178
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   673
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   674
lemma sorted_spvec_minus_spmat: "sorted_spvec A \<Longrightarrow> sorted_spvec (minus_spmat A)"
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   675
by (induct A rule: sorted_spvec.induct) (auto simp: sorted_spvec.simps)
15178
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   676
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   677
lemma sorted_spvec_abs_spmat: "sorted_spvec A \<Longrightarrow> sorted_spvec (abs_spmat A)" 
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   678
  by (induct A rule: sorted_spvec.induct) (auto simp: sorted_spvec.simps)
15178
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   679
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   680
lemma sorted_spmat_minus_spmat: "sorted_spmat A \<Longrightarrow> sorted_spmat (minus_spmat A)"
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   681
  by (induct A) (simp_all add: sorted_spvec_minus_spvec)
15178
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   682
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   683
lemma sorted_spmat_abs_spmat: "sorted_spmat A \<Longrightarrow> sorted_spmat (abs_spmat A)"
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   684
  by (induct A) (simp_all add: sorted_spvec_abs_spvec)
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   685
38273
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   686
definition diff_spmat :: "('a::lattice_ring) spmat \<Rightarrow> 'a spmat \<Rightarrow> 'a spmat"
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   687
  where "diff_spmat A B = add_spmat A (minus_spmat B)"
15178
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   688
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   689
lemma sorted_spmat_diff_spmat: "sorted_spmat A \<Longrightarrow> sorted_spmat B \<Longrightarrow> sorted_spmat (diff_spmat A B)"
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   690
  by (simp add: diff_spmat_def sorted_spmat_minus_spmat sorted_spmat_add_spmat)
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   691
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   692
lemma sorted_spvec_diff_spmat: "sorted_spvec A \<Longrightarrow> sorted_spvec B \<Longrightarrow> sorted_spvec (diff_spmat A B)"
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   693
  by (simp add: diff_spmat_def sorted_spvec_minus_spmat sorted_spvec_add_spmat)
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   694
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   695
lemma sparse_row_diff_spmat: "sparse_row_matrix (diff_spmat A B ) = (sparse_row_matrix A) - (sparse_row_matrix B)"
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   696
  by (simp add: diff_spmat_def sparse_row_add_spmat sparse_row_matrix_minus)
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   697
38273
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   698
definition sorted_sparse_matrix :: "'a spmat \<Rightarrow> bool"
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   699
  where "sorted_sparse_matrix A \<longleftrightarrow> sorted_spvec A & sorted_spmat A"
15178
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   700
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   701
lemma sorted_sparse_matrix_imp_spvec: "sorted_sparse_matrix A \<Longrightarrow> sorted_spvec A"
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   702
  by (simp add: sorted_sparse_matrix_def)
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   703
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   704
lemma sorted_sparse_matrix_imp_spmat: "sorted_sparse_matrix A \<Longrightarrow> sorted_spmat A"
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   705
  by (simp add: sorted_sparse_matrix_def)
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   706
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   707
lemmas sorted_sp_simps = 
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   708
  sorted_spvec.simps
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   709
  sorted_spmat.simps
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   710
  sorted_sparse_matrix_def
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   711
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   712
lemma bool1: "(\<not> True) = False"  by blast
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   713
lemma bool2: "(\<not> False) = True"  by blast
61076
bdc1e2f0a86a eliminated \<Colon>;
wenzelm
parents: 54892
diff changeset
   714
lemma bool3: "((P::bool) \<and> True) = P" by blast
bdc1e2f0a86a eliminated \<Colon>;
wenzelm
parents: 54892
diff changeset
   715
lemma bool4: "(True \<and> (P::bool)) = P" by blast
bdc1e2f0a86a eliminated \<Colon>;
wenzelm
parents: 54892
diff changeset
   716
lemma bool5: "((P::bool) \<and> False) = False" by blast
bdc1e2f0a86a eliminated \<Colon>;
wenzelm
parents: 54892
diff changeset
   717
lemma bool6: "(False \<and> (P::bool)) = False" by blast
bdc1e2f0a86a eliminated \<Colon>;
wenzelm
parents: 54892
diff changeset
   718
lemma bool7: "((P::bool) \<or> True) = True" by blast
bdc1e2f0a86a eliminated \<Colon>;
wenzelm
parents: 54892
diff changeset
   719
lemma bool8: "(True \<or> (P::bool)) = True" by blast
bdc1e2f0a86a eliminated \<Colon>;
wenzelm
parents: 54892
diff changeset
   720
lemma bool9: "((P::bool) \<or> False) = P" by blast
bdc1e2f0a86a eliminated \<Colon>;
wenzelm
parents: 54892
diff changeset
   721
lemma bool10: "(False \<or> (P::bool)) = P" by blast
15178
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   722
lemmas boolarith = bool1 bool2 bool3 bool4 bool5 bool6 bool7 bool8 bool9 bool10
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   723
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   724
lemma if_case_eq: "(if b then x else y) = (case b of True => x | False => y)" by simp
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   725
38273
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   726
primrec pprt_spvec :: "('a::{lattice_ab_group_add}) spvec \<Rightarrow> 'a spvec"
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   727
where
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   728
  "pprt_spvec [] = []"
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   729
| "pprt_spvec (a#as) = (fst a, pprt (snd a)) # (pprt_spvec as)"
15580
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   730
38273
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   731
primrec nprt_spvec :: "('a::{lattice_ab_group_add}) spvec \<Rightarrow> 'a spvec"
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   732
where
15580
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   733
  "nprt_spvec [] = []"
38273
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   734
| "nprt_spvec (a#as) = (fst a, nprt (snd a)) # (nprt_spvec as)"
15580
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   735
38273
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   736
primrec pprt_spmat :: "('a::{lattice_ab_group_add}) spmat \<Rightarrow> 'a spmat"
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   737
where
15580
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   738
  "pprt_spmat [] = []"
38273
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   739
| "pprt_spmat (a#as) = (fst a, pprt_spvec (snd a))#(pprt_spmat as)"
15580
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   740
38273
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   741
primrec nprt_spmat :: "('a::{lattice_ab_group_add}) spmat \<Rightarrow> 'a spmat"
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   742
where
15580
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   743
  "nprt_spmat [] = []"
38273
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   744
| "nprt_spmat (a#as) = (fst a, nprt_spvec (snd a))#(nprt_spmat as)"
15580
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   745
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   746
35028
108662d50512 more consistent naming of type classes involving orderings (and lattices) -- c.f. NEWS
haftmann
parents: 32491
diff changeset
   747
lemma pprt_add: "disj_matrices A (B::(_::lattice_ring) matrix) \<Longrightarrow> pprt (A+B) = pprt A + pprt B"
22452
8a86fd2a1bf0 adjusted to new lattice theory developement in Lattices.thy / FixedPoint.thy
haftmann
parents: 20432
diff changeset
   748
  apply (simp add: pprt_def sup_matrix_def)
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   749
  apply (intro matrix_eqI)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   750
  by (smt (verit, del_insts) Rep_combine_matrix Rep_zero_matrix_def add.commute comm_monoid_add_class.add_0 disj_matrices_def plus_matrix_def sup.idem)
15580
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   751
35028
108662d50512 more consistent naming of type classes involving orderings (and lattices) -- c.f. NEWS
haftmann
parents: 32491
diff changeset
   752
lemma nprt_add: "disj_matrices A (B::(_::lattice_ring) matrix) \<Longrightarrow> nprt (A+B) = nprt A + nprt B"
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   753
  unfolding nprt_def inf_matrix_def
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   754
  apply (intro matrix_eqI)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   755
  by (smt (verit, ccfv_threshold) Rep_combine_matrix Rep_matrix_add add.commute add_cancel_right_right add_eq_inf_sup disj_matrices_contr2 sup.idem)
15580
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   756
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   757
lemma pprt_singleton[simp]: 
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   758
  fixes x:: "_::lattice_ring"
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   759
  shows "pprt (singleton_matrix j i x) = singleton_matrix j i (pprt x)"
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   760
  unfolding pprt_def sup_matrix_def
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   761
  by (simp add: matrix_eqI)
15580
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   762
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   763
lemma nprt_singleton[simp]:
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   764
  fixes x:: "_::lattice_ring"
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   765
  shows "nprt (singleton_matrix j i x) = singleton_matrix j i (nprt x)"
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   766
  by (metis add_left_imp_eq pprt_singleton prts singleton_matrix_add)
15580
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   767
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   768
lemma sparse_row_vector_pprt:
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   769
  fixes v:: "_::lattice_ring spvec"
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   770
  shows "sorted_spvec v \<Longrightarrow> sparse_row_vector (pprt_spvec v) = pprt (sparse_row_vector v)"
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   771
proof (induct v rule: sorted_spvec.induct)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   772
  case (3 m x n y bs)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   773
  then show ?case
80756
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   774
    apply simp
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   775
    apply (subst pprt_add)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   776
     apply (metis disj_matrices_commute disj_sparse_row_singleton order.refl fst_conv prod.sel(2) sparse_row_vector_cons)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   777
    by (metis pprt_singleton sorted_spvec_cons1)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   778
qed auto
15580
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   779
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   780
lemma sparse_row_vector_nprt:
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   781
  fixes v:: "_::lattice_ring spvec"
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   782
  shows "sorted_spvec v \<Longrightarrow> sparse_row_vector (nprt_spvec v) = nprt (sparse_row_vector v)"
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   783
proof (induct v rule: sorted_spvec.induct)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   784
  case (3 m x n y bs)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   785
  then show ?case
80756
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   786
    apply simp
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   787
    apply (subst nprt_add)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   788
    apply (metis disj_matrices_commute disj_sparse_row_singleton dual_order.refl fst_conv prod.sel(2) sparse_row_vector_cons)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   789
    using sorted_spvec_cons1 by force
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   790
qed auto
15580
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   791
  
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   792
  
35028
108662d50512 more consistent naming of type classes involving orderings (and lattices) -- c.f. NEWS
haftmann
parents: 32491
diff changeset
   793
lemma pprt_move_matrix: "pprt (move_matrix (A::('a::lattice_ring) matrix) j i) = move_matrix (pprt A) j i"
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   794
  by (simp add: pprt_def sup_matrix_def matrix_eqI)
15580
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   795
35028
108662d50512 more consistent naming of type classes involving orderings (and lattices) -- c.f. NEWS
haftmann
parents: 32491
diff changeset
   796
lemma nprt_move_matrix: "nprt (move_matrix (A::('a::lattice_ring) matrix) j i) = move_matrix (nprt A) j i"
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   797
  by (simp add: nprt_def inf_matrix_def matrix_eqI)
15580
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   798
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   799
lemma sparse_row_matrix_pprt: 
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   800
  fixes m:: "'a::lattice_ring spmat"
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   801
  shows "sorted_spvec m \<Longrightarrow> sorted_spmat m \<Longrightarrow> sparse_row_matrix (pprt_spmat m) = pprt (sparse_row_matrix m)"
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   802
proof (induct m rule: sorted_spvec.induct)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   803
  case (2 a)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   804
  then show ?case
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   805
    by (simp add: pprt_move_matrix sparse_row_matrix_cons sparse_row_vector_pprt)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   806
next
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   807
  case (3 m x n y bs)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   808
  then show ?case 
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   809
    apply (simp add: sparse_row_matrix_cons sparse_row_vector_pprt)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   810
    apply (subst pprt_add)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   811
     apply (subst disj_matrices_commute)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   812
     apply (metis disj_move_sparse_vec_mat eq_imp_le fst_conv prod.sel(2) sparse_row_matrix_cons)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   813
    apply (simp add: sorted_spvec.simps pprt_move_matrix)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   814
    done
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   815
qed auto
15580
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   816
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   817
lemma sparse_row_matrix_nprt:
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   818
  fixes m:: "'a::lattice_ring spmat"
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   819
  shows "sorted_spvec m \<Longrightarrow> sorted_spmat m \<Longrightarrow> sorted_spmat m \<Longrightarrow> sparse_row_matrix (nprt_spmat m) = nprt (sparse_row_matrix m)"
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   820
proof (induct m rule: sorted_spvec.induct)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   821
  case (2 a)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   822
  then show ?case
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   823
    by (simp add: nprt_move_matrix sparse_row_matrix_cons sparse_row_vector_nprt)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   824
next
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   825
  case (3 m x n y bs)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   826
  then show ?case
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   827
    apply (simp add: sparse_row_matrix_cons sparse_row_vector_nprt)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   828
    apply (subst nprt_add)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   829
     apply (subst disj_matrices_commute)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   830
     apply (metis disj_move_sparse_vec_mat fst_conv nle_le prod.sel(2) sparse_row_matrix_cons)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   831
    apply (simp add: sorted_spvec.simps nprt_move_matrix)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   832
    done
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   833
qed auto
15580
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   834
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   835
lemma sorted_pprt_spvec: "sorted_spvec v \<Longrightarrow> sorted_spvec (pprt_spvec v)"
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   836
proof (induct v rule: sorted_spvec.induct)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   837
  case 1
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   838
  then show ?case by auto
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   839
next
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   840
  case (2 a)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   841
  then show ?case 
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   842
    by (simp add: sorted_spvec_step1)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   843
next
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   844
  case (3 m x n y bs)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   845
  then show ?case
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   846
    by (simp add: sorted_spvec_step)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   847
qed
15580
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   848
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   849
lemma sorted_nprt_spvec: "sorted_spvec v \<Longrightarrow> sorted_spvec (nprt_spvec v)"
80756
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   850
  by (induct v rule: sorted_spvec.induct) (simp_all add: sorted_spvec.simps split:list.split_asm)
15580
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   851
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   852
lemma sorted_spvec_pprt_spmat: "sorted_spvec m \<Longrightarrow> sorted_spvec (pprt_spmat m)"
80756
4d592706086e Tidied some messy old proofs
paulson <lp15@cam.ac.uk>
parents: 80736
diff changeset
   853
  by (induct m rule: sorted_spvec.induct) (simp_all add: sorted_spvec.simps split:list.split_asm)
15580
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   854
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   855
lemma sorted_spvec_nprt_spmat: "sorted_spvec m \<Longrightarrow> sorted_spvec (nprt_spmat m)"
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   856
by (induct m rule: sorted_spvec.induct) (simp_all add: sorted_spvec.simps split:list.split_asm)
15580
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   857
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   858
lemma sorted_spmat_pprt_spmat: "sorted_spmat m \<Longrightarrow> sorted_spmat (pprt_spmat m)"
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   859
  by (induct m) (simp_all add: sorted_pprt_spvec)
15580
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   860
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   861
lemma sorted_spmat_nprt_spmat: "sorted_spmat m \<Longrightarrow> sorted_spmat (nprt_spmat m)"
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   862
  by (induct m) (simp_all add: sorted_nprt_spvec)
15580
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   863
35416
d8d7d1b785af replaced a couple of constsdefs by definitions (also some old primrecs by modern ones)
haftmann
parents: 35028
diff changeset
   864
definition mult_est_spmat :: "('a::lattice_ring) spmat \<Rightarrow> 'a spmat \<Rightarrow> 'a spmat \<Rightarrow> 'a spmat \<Rightarrow> 'a spmat" where
38273
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   865
  "mult_est_spmat r1 r2 s1 s2 =
31816
ffaf6dd53045 replaced recdefs by funs
nipkow
parents: 29667
diff changeset
   866
  add_spmat (mult_spmat (pprt_spmat s2) (pprt_spmat r2)) (add_spmat (mult_spmat (pprt_spmat s1) (nprt_spmat r2)) 
ffaf6dd53045 replaced recdefs by funs
nipkow
parents: 29667
diff changeset
   867
  (add_spmat (mult_spmat (nprt_spmat s2) (pprt_spmat r1)) (mult_spmat (nprt_spmat s1) (nprt_spmat r1))))"  
15580
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   868
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   869
lemmas sparse_row_matrix_op_simps =
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   870
  sorted_sparse_matrix_imp_spmat sorted_sparse_matrix_imp_spvec
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   871
  sparse_row_add_spmat sorted_spvec_add_spmat sorted_spmat_add_spmat
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   872
  sparse_row_diff_spmat sorted_spvec_diff_spmat sorted_spmat_diff_spmat
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   873
  sparse_row_matrix_minus sorted_spvec_minus_spmat sorted_spmat_minus_spmat
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   874
  sparse_row_mult_spmat sorted_spvec_mult_spmat sorted_spmat_mult_spmat
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   875
  sparse_row_matrix_abs sorted_spvec_abs_spmat sorted_spmat_abs_spmat
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   876
  le_spmat_iff_sparse_row_le
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   877
  sparse_row_matrix_pprt sorted_spvec_pprt_spmat sorted_spmat_pprt_spmat
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   878
  sparse_row_matrix_nprt sorted_spvec_nprt_spmat sorted_spmat_nprt_spmat
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   879
47108
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents: 46988
diff changeset
   880
lemmas sparse_row_matrix_arith_simps = 
15580
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   881
  mult_spmat.simps mult_spvec_spmat.simps 
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   882
  addmult_spvec.simps 
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   883
  smult_spvec_empty smult_spvec_cons
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   884
  add_spmat.simps add_spvec.simps
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   885
  minus_spmat.simps minus_spvec.simps
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   886
  abs_spmat.simps abs_spvec.simps
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   887
  diff_spmat_def
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   888
  le_spmat.simps le_spvec.simps
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   889
  pprt_spmat.simps pprt_spvec.simps
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   890
  nprt_spmat.simps nprt_spvec.simps
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   891
  mult_est_spmat_def
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   892
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   893
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   894
(*lemma spm_linprog_dual_estimate_1:
15178
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   895
  assumes  
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   896
  "sorted_sparse_matrix A1"
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   897
  "sorted_sparse_matrix A2"
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   898
  "sorted_sparse_matrix c1"
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   899
  "sorted_sparse_matrix c2"
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   900
  "sorted_sparse_matrix y"
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   901
  "sorted_spvec b"
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   902
  "sorted_spvec r"
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   903
  "le_spmat ([], y)"
35028
108662d50512 more consistent naming of type classes involving orderings (and lattices) -- c.f. NEWS
haftmann
parents: 32491
diff changeset
   904
  "A * x \<le> sparse_row_matrix (b::('a::lattice_ring) spmat)"
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   905
  "sparse_row_matrix A1 \<le> A"
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   906
  "A \<le> sparse_row_matrix A2"
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   907
  "sparse_row_matrix c1 \<le> c"
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   908
  "c \<le> sparse_row_matrix c2"
61945
1135b8de26c3 more symbols;
wenzelm
parents: 61169
diff changeset
   909
  "\<bar>x\<bar> \<le> sparse_row_matrix r"
15178
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   910
  shows
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   911
  "c * x \<le> sparse_row_matrix (add_spmat (mult_spmat y b, mult_spmat (add_spmat (add_spmat (mult_spmat y (diff_spmat A2 A1), 
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   912
  abs_spmat (diff_spmat (mult_spmat y A1) c1)), diff_spmat c2 c1)) r))"
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   913
  by (insert prems, simp add: sparse_row_matrix_op_simps linprog_dual_estimate_1[where A=A])
15580
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   914
*)
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   915
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   916
end