src/HOL/Matrix_LP/SparseMatrix.thy
author paulson <lp15@cam.ac.uk>
Thu, 22 Aug 2024 22:26:28 +0100
changeset 80736 c8bcb14fcfa8
parent 67613 ce654b0e6d69
child 80756 4d592706086e
permissions -rw-r--r--
Partial tidying of old proofs
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
16487
2060ebae96f9 proper header;
wenzelm
parents: 16417
diff changeset
     2
    Author:     Steven Obua
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))
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   294
        apply (simp add: )
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)"
9b34b1449cb7 removed old primrecs
nipkow
parents: 31816
diff changeset
   437
  apply (induct A B rule: add_spmat.induct)
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   438
  apply (simp_all add: sorted_spvec_add_spvec)
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   439
  done
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   440
38273
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   441
fun le_spvec :: "('a::lattice_ab_group_add) spvec \<Rightarrow> 'a spvec \<Rightarrow> bool"
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   442
where
31816
ffaf6dd53045 replaced recdefs by funs
nipkow
parents: 29667
diff changeset
   443
(* "measure (% (a,b). (length a) + (length b))" *)
38273
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   444
  "le_spvec [] [] = True"
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   445
| "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
   446
| "le_spvec [] ((_,b)#bs) = (0 \<le> b & le_spvec [] bs)"
38273
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   447
| "le_spvec ((i,a)#as) ((j,b)#bs) = (
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   448
    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
   449
    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
   450
    else a \<le> b & le_spvec as bs)"
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   451
38273
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   452
fun le_spmat :: "('a::lattice_ab_group_add) spmat \<Rightarrow> 'a spmat \<Rightarrow> bool"
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   453
where
31816
ffaf6dd53045 replaced recdefs by funs
nipkow
parents: 29667
diff changeset
   454
(* "measure (% (a,b). (length a) + (length b))" *)
38273
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   455
  "le_spmat [] [] = True"
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   456
| "le_spmat ((i,a)#as) [] = (le_spvec a [] & le_spmat as [])"
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   457
| "le_spmat [] ((j,b)#bs) = (le_spvec [] b & le_spmat [] bs)"
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   458
| "le_spmat ((i,a)#as) ((j,b)#bs) = (
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   459
    if i < j then (le_spvec a [] & le_spmat as ((j,b)#bs))
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   460
    else if j < i then (le_spvec [] b & le_spmat ((i,a)#as) bs)
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   461
    else (le_spvec a b & le_spmat as bs))"
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   462
35416
d8d7d1b785af replaced a couple of constsdefs by definitions (also some old primrecs by modern ones)
haftmann
parents: 35028
diff changeset
   463
definition disj_matrices :: "('a::zero) matrix \<Rightarrow> 'a matrix \<Rightarrow> bool" where
38273
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   464
  "disj_matrices A B \<longleftrightarrow>
67613
ce654b0e6d69 more symbols;
wenzelm
parents: 61945
diff changeset
   465
    (\<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
   466
24124
4399175e3014 turned simp_depth_limit into configuration option;
wenzelm
parents: 23477
diff changeset
   467
declare [[simp_depth_limit = 6]]
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   468
15580
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   469
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
   470
   by (simp add: disj_matrices_def)
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   471
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   472
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
   473
   by (simp add: disj_matrices_def)
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   474
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   475
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   476
lemma disj_matrices_add: "disj_matrices A B \<Longrightarrow> disj_matrices C D \<Longrightarrow> disj_matrices A D \<Longrightarrow> disj_matrices B C \<Longrightarrow> 
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   477
  (A + B \<le> C + D) = (A \<le> C & B \<le> (D::('a::lattice_ab_group_add) matrix))"
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   478
  apply (auto)
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   479
  apply (simp (no_asm_use) only: le_matrix_def disj_matrices_def)
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   480
  apply (intro strip)
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   481
  apply (erule conjE)+
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   482
  apply (drule_tac j=j and i=i in spec2)+
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   483
  apply (case_tac "Rep_matrix B j i = 0")
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   484
  apply (case_tac "Rep_matrix D j i = 0")
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   485
  apply (simp_all)
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   486
  apply (simp (no_asm_use) only: le_matrix_def disj_matrices_def)
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   487
  apply (intro strip)
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   488
  apply (erule conjE)+
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   489
  apply (drule_tac j=j and i=i in spec2)+
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   490
  apply (case_tac "Rep_matrix A j i = 0")
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   491
  apply (case_tac "Rep_matrix C j i = 0")
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   492
  apply (simp_all)
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   493
  apply (erule add_mono)
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   494
  apply (assumption)
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   495
  done
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   496
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   497
lemma disj_matrices_zero1[simp]: "disj_matrices 0 B"
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   498
by (simp add: disj_matrices_def)
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   499
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   500
lemma disj_matrices_zero2[simp]: "disj_matrices A 0"
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   501
by (simp add: disj_matrices_def)
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   502
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   503
lemma disj_matrices_commute: "disj_matrices A B = disj_matrices B A"
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   504
by (auto simp: disj_matrices_def)
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   505
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   506
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
   507
  (A + B \<le> 0) = (A \<le> 0 & (B::('a::lattice_ab_group_add) matrix) \<le> 0)"
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   508
by (rule disj_matrices_add[of A B 0 0, simplified])
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   509
 
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   510
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
   511
  (0 \<le> A + B) = (0 \<le> A & 0 \<le> (B::('a::lattice_ab_group_add) matrix))"
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   512
by (rule disj_matrices_add[of 0 0 A B, simplified])
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   513
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   514
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
   515
  (A \<le> B + C) = (A \<le> C & 0 \<le> (B::('a::lattice_ab_group_add) matrix))"
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   516
by (auto simp: disj_matrices_add[of 0 A B C, simplified])
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   517
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   518
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
   519
  (B + A \<le> C) = (A \<le> C &  (B::('a::lattice_ab_group_add) matrix) \<le> 0)"
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   520
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
   521
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   522
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
   523
  apply (simp add: disj_matrices_def)
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   524
  apply (rule conjI)
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   525
  apply (rule neg_imp)
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   526
  apply (simp)
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   527
  apply (intro strip)
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   528
  apply (rule sorted_sparse_row_vector_zero)
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   529
  apply (simp_all)
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   530
  apply (intro strip)
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   531
  apply (rule sorted_sparse_row_vector_zero)
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   532
  apply (simp_all)
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   533
  done 
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   534
35028
108662d50512 more consistent naming of type classes involving orderings (and lattices) -- c.f. NEWS
haftmann
parents: 32491
diff changeset
   535
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)"
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   536
  apply (simp add: disj_matrices_def)
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   537
  apply (auto)
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   538
  apply (drule_tac j=j and i=i in spec2)+
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   539
  apply (case_tac "Rep_matrix B j i = 0")
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   540
  apply (case_tac "Rep_matrix C j i = 0")
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   541
  apply (simp_all)
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   542
  done
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   543
35028
108662d50512 more consistent naming of type classes involving orderings (and lattices) -- c.f. NEWS
haftmann
parents: 32491
diff changeset
   544
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
   545
  by (simp add: disj_matrices_x_add disj_matrices_commute)
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   546
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   547
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
   548
  by (auto simp: disj_matrices_def)
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   549
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   550
lemma disj_move_sparse_vec_mat[simplified disj_matrices_commute]: 
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   551
  "j \<le> a \<Longrightarrow> sorted_spvec((a,c)#as) \<Longrightarrow> disj_matrices (move_matrix (sparse_row_vector b) (int j) i) (sparse_row_matrix as)"
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   552
  apply (auto simp: disj_matrices_def)
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   553
  apply (drule nrows_notzero)
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   554
  apply (drule less_le_trans[OF _ nrows_spvec])
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   555
  apply (subgoal_tac "ja = j")
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   556
  apply (simp add: sorted_sparse_row_matrix_zero)
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   557
  apply (arith)
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   558
  apply (rule nrows)
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   559
  apply (rule order_trans[of _ 1 _])
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   560
  apply (simp)
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   561
  apply (case_tac "nat (int ja - int j) = 0")
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   562
  apply (case_tac "ja = j")
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   563
  apply (simp add: sorted_sparse_row_matrix_zero)
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   564
  apply arith+
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   565
  done
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   566
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   567
lemma disj_move_sparse_row_vector_twice:
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   568
  "j \<noteq> u \<Longrightarrow> disj_matrices (move_matrix (sparse_row_vector a) j i) (move_matrix (sparse_row_vector b) u v)"
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   569
  apply (auto simp: disj_matrices_def)
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   570
  apply (rule nrows, rule order_trans[of _ 1], simp, drule nrows_notzero, drule less_le_trans[OF _ nrows_spvec], arith)+
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   571
  done
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   572
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   573
lemma le_spvec_iff_sparse_row_le[rule_format]: "(sorted_spvec a) \<longrightarrow> (sorted_spvec b) \<longrightarrow> (le_spvec a b) = (sparse_row_vector a \<le> sparse_row_vector b)"
31817
9b34b1449cb7 removed old primrecs
nipkow
parents: 31816
diff changeset
   574
  apply (induct a b rule: le_spvec.induct)
15178
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   575
  apply (simp_all add: sorted_spvec_cons1 disj_matrices_add_le_zero disj_matrices_add_zero_le 
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   576
    disj_sparse_row_singleton[OF order_refl] disj_matrices_commute)
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   577
  apply (rule conjI, intro strip)
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   578
  apply (simp add: sorted_spvec_cons1)
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   579
  apply (subst disj_matrices_add_x_le)
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   580
  apply (simp add: disj_sparse_row_singleton[OF less_imp_le] disj_matrices_x_add disj_matrices_commute)
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   581
  apply (simp add: disj_sparse_row_singleton[OF order_refl] disj_matrices_commute)
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   582
  apply (simp, blast)
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   583
  apply (intro strip, rule conjI, intro strip)
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   584
  apply (simp add: sorted_spvec_cons1)
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   585
  apply (subst disj_matrices_add_le_x)
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   586
  apply (simp_all add: disj_sparse_row_singleton[OF order_refl] disj_sparse_row_singleton[OF less_imp_le] disj_matrices_commute disj_matrices_x_add)
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   587
  apply (blast)
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   588
  apply (intro strip)
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   589
  apply (simp add: sorted_spvec_cons1)
31816
ffaf6dd53045 replaced recdefs by funs
nipkow
parents: 29667
diff changeset
   590
  apply (case_tac "a=b", simp_all)
15178
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   591
  apply (subst disj_matrices_add)
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   592
  apply (simp_all add: disj_sparse_row_singleton[OF order_refl] disj_matrices_commute)
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   593
  done
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   594
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   595
lemma le_spvec_empty2_sparse_row[rule_format]: "sorted_spvec b \<longrightarrow> le_spvec b [] = (sparse_row_vector b \<le> 0)"
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   596
  apply (induct b)
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   597
  apply (simp_all add: sorted_spvec_cons1)
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   598
  apply (intro strip)
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   599
  apply (subst disj_matrices_add_le_zero)
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   600
  apply (auto simp: disj_matrices_commute disj_sparse_row_singleton[OF order_refl] sorted_spvec_cons1)
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   601
  done
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   602
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   603
lemma le_spvec_empty1_sparse_row[rule_format]: "(sorted_spvec b) \<longrightarrow> (le_spvec [] b = (0 \<le> sparse_row_vector b))"
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   604
  apply (induct b)
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   605
  apply (simp_all add: sorted_spvec_cons1)
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   606
  apply (intro strip)
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   607
  apply (subst disj_matrices_add_zero_le)
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   608
  apply (auto simp: disj_matrices_commute disj_sparse_row_singleton[OF order_refl] sorted_spvec_cons1)
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   609
  done
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   610
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   611
lemma le_spmat_iff_sparse_row_le[rule_format]: "(sorted_spvec A) \<longrightarrow> (sorted_spmat A) \<longrightarrow> (sorted_spvec B) \<longrightarrow> (sorted_spmat B) \<longrightarrow> 
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   612
  le_spmat A B = (sparse_row_matrix A \<le> sparse_row_matrix B)"
31817
9b34b1449cb7 removed old primrecs
nipkow
parents: 31816
diff changeset
   613
  apply (induct A B rule: le_spmat.induct)
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   614
  apply (simp add: sparse_row_matrix_cons disj_matrices_add_le_zero disj_matrices_add_zero_le disj_move_sparse_vec_mat[OF order_refl] 
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   615
    disj_matrices_commute sorted_spvec_cons1 le_spvec_empty2_sparse_row le_spvec_empty1_sparse_row)+ 
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   616
  apply (rule conjI, intro strip)
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   617
  apply (simp add: sorted_spvec_cons1)
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   618
  apply (subst disj_matrices_add_x_le)
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   619
  apply (rule disj_matrices_add_x)
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   620
  apply (simp add: disj_move_sparse_row_vector_twice)
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   621
  apply (simp add: disj_move_sparse_vec_mat[OF less_imp_le] disj_matrices_commute)
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   622
  apply (simp add: disj_move_sparse_vec_mat[OF order_refl] disj_matrices_commute)
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   623
  apply (simp, blast)
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   624
  apply (intro strip, rule conjI, intro strip)
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   625
  apply (simp add: sorted_spvec_cons1)
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   626
  apply (subst disj_matrices_add_le_x)
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   627
  apply (simp add: disj_move_sparse_vec_mat[OF order_refl])
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   628
  apply (rule disj_matrices_x_add)
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   629
  apply (simp add: disj_move_sparse_row_vector_twice)
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   630
  apply (simp add: disj_move_sparse_vec_mat[OF less_imp_le] disj_matrices_commute)
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   631
  apply (simp, blast)
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   632
  apply (intro strip)
31816
ffaf6dd53045 replaced recdefs by funs
nipkow
parents: 29667
diff changeset
   633
  apply (case_tac "i=j")
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   634
  apply (simp_all)
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   635
  apply (subst disj_matrices_add)
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   636
  apply (simp_all add: disj_matrices_commute disj_move_sparse_vec_mat[OF order_refl])
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   637
  apply (simp add: sorted_spvec_cons1 le_spvec_iff_sparse_row_le)
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   638
  done
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   639
24124
4399175e3014 turned simp_depth_limit into configuration option;
wenzelm
parents: 23477
diff changeset
   640
declare [[simp_depth_limit = 999]]
15178
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   641
38273
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   642
primrec abs_spmat :: "('a::lattice_ring) spmat \<Rightarrow> 'a spmat"
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   643
where
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   644
  "abs_spmat [] = []"
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   645
| "abs_spmat (a#as) = (fst a, abs_spvec (snd a))#(abs_spmat as)"
15178
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   646
38273
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   647
primrec minus_spmat :: "('a::lattice_ring) spmat \<Rightarrow> 'a spmat"
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   648
where
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   649
  "minus_spmat [] = []"
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   650
| "minus_spmat (a#as) = (fst a, minus_spvec (snd a))#(minus_spmat as)"
15178
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   651
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   652
lemma sparse_row_matrix_minus:
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   653
  "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
   654
proof (induct A)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   655
  case Nil
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   656
  then show ?case by auto
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   657
next
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   658
  case (Cons a A)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   659
  then show ?case
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   660
    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
   661
qed
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   662
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   663
lemma Rep_sparse_row_vector_zero:
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   664
  assumes "x \<noteq> 0"
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   665
    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
   666
  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
   667
    
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   668
lemma sparse_row_matrix_abs:
61945
1135b8de26c3 more symbols;
wenzelm
parents: 61169
diff changeset
   669
  "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
   670
proof (induct A)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   671
  case Nil
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   672
  then show ?case by auto
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   673
next
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   674
  case (Cons ab A)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   675
  then have A: "sorted_spvec A"
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   676
    using sorted_spvec_cons1 by blast
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   677
  show ?case 
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   678
  proof (cases ab)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   679
    case (Pair a b)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   680
    show ?thesis
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   681
      unfolding Pair
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   682
    proof (intro matrix_eqI)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   683
      fix m n
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   684
      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
   685
          = 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
   686
        using Cons Pair A 
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   687
        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
   688
        apply (cases "m=a")
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   689
        using sorted_sparse_row_matrix_zero apply fastforce
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   690
        by (simp add: Rep_sparse_row_vector_zero)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   691
    qed
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   692
  qed
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   693
qed
15178
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   694
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   695
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
   696
by (induct A rule: sorted_spvec.induct) (auto simp: sorted_spvec.simps)
15178
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   697
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   698
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
   699
  by (induct A rule: sorted_spvec.induct) (auto simp: sorted_spvec.simps)
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_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
   702
  by (induct A) (simp_all add: sorted_spvec_minus_spvec)
15178
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   703
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   704
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
   705
  by (induct A) (simp_all add: sorted_spvec_abs_spvec)
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   706
38273
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   707
definition diff_spmat :: "('a::lattice_ring) spmat \<Rightarrow> 'a spmat \<Rightarrow> 'a spmat"
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   708
  where "diff_spmat A B = add_spmat A (minus_spmat B)"
15178
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   709
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   710
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
   711
  by (simp add: diff_spmat_def sorted_spmat_minus_spmat sorted_spmat_add_spmat)
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   712
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   713
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
   714
  by (simp add: diff_spmat_def sorted_spvec_minus_spmat sorted_spvec_add_spmat)
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   715
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   716
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
   717
  by (simp add: diff_spmat_def sparse_row_add_spmat sparse_row_matrix_minus)
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   718
38273
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   719
definition sorted_sparse_matrix :: "'a spmat \<Rightarrow> bool"
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   720
  where "sorted_sparse_matrix A \<longleftrightarrow> sorted_spvec A & sorted_spmat A"
15178
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   721
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   722
lemma sorted_sparse_matrix_imp_spvec: "sorted_sparse_matrix A \<Longrightarrow> sorted_spvec A"
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   723
  by (simp add: sorted_sparse_matrix_def)
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   724
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   725
lemma sorted_sparse_matrix_imp_spmat: "sorted_sparse_matrix A \<Longrightarrow> sorted_spmat A"
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   726
  by (simp add: sorted_sparse_matrix_def)
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   727
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   728
lemmas sorted_sp_simps = 
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   729
  sorted_spvec.simps
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   730
  sorted_spmat.simps
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   731
  sorted_sparse_matrix_def
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   732
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   733
lemma bool1: "(\<not> True) = False"  by blast
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   734
lemma bool2: "(\<not> False) = True"  by blast
61076
bdc1e2f0a86a eliminated \<Colon>;
wenzelm
parents: 54892
diff changeset
   735
lemma bool3: "((P::bool) \<and> True) = P" by blast
bdc1e2f0a86a eliminated \<Colon>;
wenzelm
parents: 54892
diff changeset
   736
lemma bool4: "(True \<and> (P::bool)) = P" by blast
bdc1e2f0a86a eliminated \<Colon>;
wenzelm
parents: 54892
diff changeset
   737
lemma bool5: "((P::bool) \<and> False) = False" by blast
bdc1e2f0a86a eliminated \<Colon>;
wenzelm
parents: 54892
diff changeset
   738
lemma bool6: "(False \<and> (P::bool)) = False" by blast
bdc1e2f0a86a eliminated \<Colon>;
wenzelm
parents: 54892
diff changeset
   739
lemma bool7: "((P::bool) \<or> True) = True" by blast
bdc1e2f0a86a eliminated \<Colon>;
wenzelm
parents: 54892
diff changeset
   740
lemma bool8: "(True \<or> (P::bool)) = True" by blast
bdc1e2f0a86a eliminated \<Colon>;
wenzelm
parents: 54892
diff changeset
   741
lemma bool9: "((P::bool) \<or> False) = P" by blast
bdc1e2f0a86a eliminated \<Colon>;
wenzelm
parents: 54892
diff changeset
   742
lemma bool10: "(False \<or> (P::bool)) = P" by blast
15178
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   743
lemmas boolarith = bool1 bool2 bool3 bool4 bool5 bool6 bool7 bool8 bool9 bool10
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   744
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   745
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
   746
38273
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   747
primrec pprt_spvec :: "('a::{lattice_ab_group_add}) spvec \<Rightarrow> 'a spvec"
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   748
where
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   749
  "pprt_spvec [] = []"
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   750
| "pprt_spvec (a#as) = (fst a, pprt (snd a)) # (pprt_spvec as)"
15580
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   751
38273
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   752
primrec nprt_spvec :: "('a::{lattice_ab_group_add}) spvec \<Rightarrow> 'a spvec"
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   753
where
15580
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   754
  "nprt_spvec [] = []"
38273
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   755
| "nprt_spvec (a#as) = (fst a, nprt (snd a)) # (nprt_spvec as)"
15580
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   756
38273
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   757
primrec pprt_spmat :: "('a::{lattice_ab_group_add}) spmat \<Rightarrow> 'a spmat"
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   758
where
15580
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   759
  "pprt_spmat [] = []"
38273
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   760
| "pprt_spmat (a#as) = (fst a, pprt_spvec (snd a))#(pprt_spmat as)"
15580
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   761
38273
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   762
primrec nprt_spmat :: "('a::{lattice_ab_group_add}) spmat \<Rightarrow> 'a spmat"
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   763
where
15580
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   764
  "nprt_spmat [] = []"
38273
d31a34569542 modernized some specifications;
wenzelm
parents: 35416
diff changeset
   765
| "nprt_spmat (a#as) = (fst a, nprt_spvec (snd a))#(nprt_spmat as)"
15580
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   766
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   767
35028
108662d50512 more consistent naming of type classes involving orderings (and lattices) -- c.f. NEWS
haftmann
parents: 32491
diff changeset
   768
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
   769
  apply (simp add: pprt_def sup_matrix_def)
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   770
  apply (intro matrix_eqI)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   771
  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
   772
35028
108662d50512 more consistent naming of type classes involving orderings (and lattices) -- c.f. NEWS
haftmann
parents: 32491
diff changeset
   773
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
   774
  unfolding nprt_def inf_matrix_def
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   775
  apply (intro matrix_eqI)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   776
  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
   777
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   778
lemma pprt_singleton[simp]: 
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   779
  fixes x:: "_::lattice_ring"
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   780
  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
   781
  unfolding pprt_def sup_matrix_def
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   782
  by (simp add: matrix_eqI)
15580
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   783
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   784
lemma nprt_singleton[simp]:
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   785
  fixes x:: "_::lattice_ring"
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   786
  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
   787
  by (metis add_left_imp_eq pprt_singleton prts singleton_matrix_add)
15580
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   788
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   789
lemma sparse_row_vector_pprt:
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   790
  fixes v:: "_::lattice_ring spvec"
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   791
  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
   792
proof (induct v rule: sorted_spvec.induct)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   793
  case (3 m x n y bs)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   794
  then show ?case
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   795
    apply (simp add: )
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   796
    apply (subst pprt_add)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   797
     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
   798
    by (metis pprt_singleton sorted_spvec_cons1)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   799
qed auto
15580
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   800
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   801
lemma sparse_row_vector_nprt:
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   802
  fixes v:: "_::lattice_ring spvec"
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   803
  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
   804
proof (induct v rule: sorted_spvec.induct)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   805
  case (3 m x n y bs)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   806
  then show ?case
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   807
    apply (simp add: )
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   808
    apply (subst nprt_add)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   809
    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
   810
    using sorted_spvec_cons1 by force
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   811
qed auto
15580
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   812
  
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   813
  
35028
108662d50512 more consistent naming of type classes involving orderings (and lattices) -- c.f. NEWS
haftmann
parents: 32491
diff changeset
   814
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
   815
  by (simp add: pprt_def sup_matrix_def matrix_eqI)
15580
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   816
35028
108662d50512 more consistent naming of type classes involving orderings (and lattices) -- c.f. NEWS
haftmann
parents: 32491
diff changeset
   817
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
   818
  by (simp add: nprt_def inf_matrix_def matrix_eqI)
15580
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   819
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   820
lemma sparse_row_matrix_pprt: 
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   821
  fixes m:: "'a::lattice_ring spmat"
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   822
  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
   823
proof (induct m rule: sorted_spvec.induct)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   824
  case (2 a)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   825
  then show ?case
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   826
    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
   827
next
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   828
  case (3 m x n y bs)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   829
  then show ?case 
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   830
    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
   831
    apply (subst pprt_add)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   832
     apply (subst disj_matrices_commute)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   833
     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
   834
    apply (simp add: sorted_spvec.simps pprt_move_matrix)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   835
    done
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   836
qed auto
15580
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   837
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   838
lemma sparse_row_matrix_nprt:
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   839
  fixes m:: "'a::lattice_ring spmat"
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   840
  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
   841
proof (induct m rule: sorted_spvec.induct)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   842
  case (2 a)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   843
  then show ?case
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   844
    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
   845
next
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   846
  case (3 m x n y bs)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   847
  then show ?case
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   848
    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
   849
    apply (subst nprt_add)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   850
     apply (subst disj_matrices_commute)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   851
     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
   852
    apply (simp add: sorted_spvec.simps nprt_move_matrix)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   853
    done
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   854
qed auto
15580
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   855
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   856
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
   857
proof (induct v rule: sorted_spvec.induct)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   858
  case 1
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   859
  then show ?case by auto
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   860
next
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   861
  case (2 a)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   862
  then show ?case 
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   863
    by (simp add: sorted_spvec_step1)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   864
next
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   865
  case (3 m x n y bs)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   866
  then show ?case
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   867
    by (simp add: sorted_spvec_step)
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   868
qed
15580
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   869
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   870
lemma sorted_nprt_spvec: "sorted_spvec v \<Longrightarrow> sorted_spvec (nprt_spvec v)"
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   871
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
   872
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   873
lemma sorted_spvec_pprt_spmat: "sorted_spvec m \<Longrightarrow> sorted_spvec (pprt_spmat m)"
80736
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   874
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
   875
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   876
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
   877
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
   878
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   879
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
   880
  by (induct m) (simp_all add: sorted_pprt_spvec)
15580
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   881
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   882
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
   883
  by (induct m) (simp_all add: sorted_nprt_spvec)
15580
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   884
35416
d8d7d1b785af replaced a couple of constsdefs by definitions (also some old primrecs by modern ones)
haftmann
parents: 35028
diff changeset
   885
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
   886
  "mult_est_spmat r1 r2 s1 s2 =
31816
ffaf6dd53045 replaced recdefs by funs
nipkow
parents: 29667
diff changeset
   887
  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
   888
  (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
   889
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   890
lemmas sparse_row_matrix_op_simps =
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   891
  sorted_sparse_matrix_imp_spmat sorted_sparse_matrix_imp_spvec
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   892
  sparse_row_add_spmat sorted_spvec_add_spmat sorted_spmat_add_spmat
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   893
  sparse_row_diff_spmat sorted_spvec_diff_spmat sorted_spmat_diff_spmat
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   894
  sparse_row_matrix_minus sorted_spvec_minus_spmat sorted_spmat_minus_spmat
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   895
  sparse_row_mult_spmat sorted_spvec_mult_spmat sorted_spmat_mult_spmat
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   896
  sparse_row_matrix_abs sorted_spvec_abs_spmat sorted_spmat_abs_spmat
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   897
  le_spmat_iff_sparse_row_le
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   898
  sparse_row_matrix_pprt sorted_spvec_pprt_spmat sorted_spmat_pprt_spmat
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   899
  sparse_row_matrix_nprt sorted_spvec_nprt_spmat sorted_spmat_nprt_spmat
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   900
47108
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents: 46988
diff changeset
   901
lemmas sparse_row_matrix_arith_simps = 
15580
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   902
  mult_spmat.simps mult_spvec_spmat.simps 
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   903
  addmult_spvec.simps 
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   904
  smult_spvec_empty smult_spvec_cons
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   905
  add_spmat.simps add_spvec.simps
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   906
  minus_spmat.simps minus_spvec.simps
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   907
  abs_spmat.simps abs_spvec.simps
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   908
  diff_spmat_def
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   909
  le_spmat.simps le_spvec.simps
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   910
  pprt_spmat.simps pprt_spvec.simps
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   911
  nprt_spmat.simps nprt_spvec.simps
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   912
  mult_est_spmat_def
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   913
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   914
900291ee0af8 Cleaning up HOL/Matrix
obua
parents: 15481
diff changeset
   915
(*lemma spm_linprog_dual_estimate_1:
15178
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   916
  assumes  
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   917
  "sorted_sparse_matrix A1"
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   918
  "sorted_sparse_matrix A2"
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   919
  "sorted_sparse_matrix c1"
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   920
  "sorted_sparse_matrix c2"
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   921
  "sorted_sparse_matrix y"
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   922
  "sorted_spvec b"
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   923
  "sorted_spvec r"
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   924
  "le_spmat ([], y)"
35028
108662d50512 more consistent naming of type classes involving orderings (and lattices) -- c.f. NEWS
haftmann
parents: 32491
diff changeset
   925
  "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
   926
  "sparse_row_matrix A1 \<le> A"
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   927
  "A \<le> sparse_row_matrix A2"
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   928
  "sparse_row_matrix c1 \<le> c"
c8bcb14fcfa8 Partial tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 67613
diff changeset
   929
  "c \<le> sparse_row_matrix c2"
61945
1135b8de26c3 more symbols;
wenzelm
parents: 61169
diff changeset
   930
  "\<bar>x\<bar> \<le> sparse_row_matrix r"
15178
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   931
  shows
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   932
  "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
   933
  abs_spmat (diff_spmat (mult_spmat y A1) c1)), diff_spmat c2 c1)) r))"
5f621aa35c25 Matrix theory, linear programming
obua
parents: 15009
diff changeset
   934
  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
   935
*)
15009
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   936
8c89f588c7aa support for sparse matrices
obua
parents:
diff changeset
   937
end