src/HOL/Matrix/LinProg.thy
author obua
Fri, 16 Apr 2004 18:30:51 +0200
changeset 14593 90c88e7ef62d
child 14662 d2c6a0f030ab
permissions -rw-r--r--
first version of matrices for HOL/Isabelle
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
14593
90c88e7ef62d first version of matrices for HOL/Isabelle
obua
parents:
diff changeset
     1
(*  Title:      HOL/Matrix/LinProg.thy
90c88e7ef62d first version of matrices for HOL/Isabelle
obua
parents:
diff changeset
     2
    ID:         $Id$
90c88e7ef62d first version of matrices for HOL/Isabelle
obua
parents:
diff changeset
     3
    Author:     Steven Obua
90c88e7ef62d first version of matrices for HOL/Isabelle
obua
parents:
diff changeset
     4
    License:    2004 Technische Universität München
90c88e7ef62d first version of matrices for HOL/Isabelle
obua
parents:
diff changeset
     5
*)
90c88e7ef62d first version of matrices for HOL/Isabelle
obua
parents:
diff changeset
     6
90c88e7ef62d first version of matrices for HOL/Isabelle
obua
parents:
diff changeset
     7
theory LinProg = Matrix:
90c88e7ef62d first version of matrices for HOL/Isabelle
obua
parents:
diff changeset
     8
90c88e7ef62d first version of matrices for HOL/Isabelle
obua
parents:
diff changeset
     9
lemma linprog_by_duality_approx_general:
90c88e7ef62d first version of matrices for HOL/Isabelle
obua
parents:
diff changeset
    10
  assumes
90c88e7ef62d first version of matrices for HOL/Isabelle
obua
parents:
diff changeset
    11
  fmuladdprops:
90c88e7ef62d first version of matrices for HOL/Isabelle
obua
parents:
diff changeset
    12
  "! a b c d. a <= b & c <= d \<longrightarrow> fadd a c <= fadd b d"
90c88e7ef62d first version of matrices for HOL/Isabelle
obua
parents:
diff changeset
    13
  "! c a b. 0 <= c & a <= b \<longrightarrow> fmul c a <= fmul c b"
90c88e7ef62d first version of matrices for HOL/Isabelle
obua
parents:
diff changeset
    14
  "! a. fmul 0 a = 0"  
90c88e7ef62d first version of matrices for HOL/Isabelle
obua
parents:
diff changeset
    15
  "! a. fmul a 0 = 0"
90c88e7ef62d first version of matrices for HOL/Isabelle
obua
parents:
diff changeset
    16
  "fadd 0 0 = 0" 
90c88e7ef62d first version of matrices for HOL/Isabelle
obua
parents:
diff changeset
    17
  "associative fadd"
90c88e7ef62d first version of matrices for HOL/Isabelle
obua
parents:
diff changeset
    18
  "commutative fadd"
90c88e7ef62d first version of matrices for HOL/Isabelle
obua
parents:
diff changeset
    19
  "associative fmul"
90c88e7ef62d first version of matrices for HOL/Isabelle
obua
parents:
diff changeset
    20
  "distributive fmul fadd"
90c88e7ef62d first version of matrices for HOL/Isabelle
obua
parents:
diff changeset
    21
  and specificprops:
90c88e7ef62d first version of matrices for HOL/Isabelle
obua
parents:
diff changeset
    22
  "mult_matrix fmul fadd (combine_matrix fadd A dA) x <= (b::('a::{order, zero}) matrix)"
90c88e7ef62d first version of matrices for HOL/Isabelle
obua
parents:
diff changeset
    23
  "mult_matrix fmul fadd y A = c"
90c88e7ef62d first version of matrices for HOL/Isabelle
obua
parents:
diff changeset
    24
  "0 <= y"
90c88e7ef62d first version of matrices for HOL/Isabelle
obua
parents:
diff changeset
    25
  shows
90c88e7ef62d first version of matrices for HOL/Isabelle
obua
parents:
diff changeset
    26
  "combine_matrix fadd (mult_matrix fmul fadd c x) (mult_matrix fmul fadd (mult_matrix fmul fadd y dA) x) 
90c88e7ef62d first version of matrices for HOL/Isabelle
obua
parents:
diff changeset
    27
  <= mult_matrix fmul fadd y b"
90c88e7ef62d first version of matrices for HOL/Isabelle
obua
parents:
diff changeset
    28
proof -
90c88e7ef62d first version of matrices for HOL/Isabelle
obua
parents:
diff changeset
    29
  let ?mul = "mult_matrix fmul fadd"
90c88e7ef62d first version of matrices for HOL/Isabelle
obua
parents:
diff changeset
    30
  let ?add = "combine_matrix fadd"
90c88e7ef62d first version of matrices for HOL/Isabelle
obua
parents:
diff changeset
    31
  let ?t1 = "?mul y (?mul (?add A dA) x)"
90c88e7ef62d first version of matrices for HOL/Isabelle
obua
parents:
diff changeset
    32
  have a: "?t1 <= ?mul y b" by (rule le_left_mult, simp_all!)
90c88e7ef62d first version of matrices for HOL/Isabelle
obua
parents:
diff changeset
    33
  have b: "?t1 = ?mul (?mul y (?add A dA)) x" by (simp! add: mult_matrix_assoc_simple[THEN sym])
90c88e7ef62d first version of matrices for HOL/Isabelle
obua
parents:
diff changeset
    34
  have assoc: "associative ?add" by (simp! add: combine_matrix_assoc)
90c88e7ef62d first version of matrices for HOL/Isabelle
obua
parents:
diff changeset
    35
  have r_distr: "r_distributive ?mul ?add" 
90c88e7ef62d first version of matrices for HOL/Isabelle
obua
parents:
diff changeset
    36
    apply (rule r_distributive_matrix)
90c88e7ef62d first version of matrices for HOL/Isabelle
obua
parents:
diff changeset
    37
    by (simp! add: distributive_def)+
90c88e7ef62d first version of matrices for HOL/Isabelle
obua
parents:
diff changeset
    38
  have l_distr: "l_distributive ?mul ?add"
90c88e7ef62d first version of matrices for HOL/Isabelle
obua
parents:
diff changeset
    39
    apply (rule l_distributive_matrix)
90c88e7ef62d first version of matrices for HOL/Isabelle
obua
parents:
diff changeset
    40
    by (simp! add: distributive_def)+
90c88e7ef62d first version of matrices for HOL/Isabelle
obua
parents:
diff changeset
    41
  have c:"?mul y (?add A dA) = ?add (?mul y A) (?mul y dA)"
90c88e7ef62d first version of matrices for HOL/Isabelle
obua
parents:
diff changeset
    42
    by (insert r_distr, simp add: r_distributive_def)
90c88e7ef62d first version of matrices for HOL/Isabelle
obua
parents:
diff changeset
    43
  have d:"?mul (?add (?mul y A) (?mul y dA)) x = ?add (?mul (?mul y A) x) (?mul (?mul y dA) x)"
90c88e7ef62d first version of matrices for HOL/Isabelle
obua
parents:
diff changeset
    44
    by (insert l_distr, simp add: l_distributive_def)
90c88e7ef62d first version of matrices for HOL/Isabelle
obua
parents:
diff changeset
    45
  have e:"\<dots> = ?add (?mul c x) (?mul (?mul y dA) x)" by (simp!)
90c88e7ef62d first version of matrices for HOL/Isabelle
obua
parents:
diff changeset
    46
  from a b c d e show "?add (?mul c x) (?mul (?mul y dA) x) <= ?mul y b" by simp
90c88e7ef62d first version of matrices for HOL/Isabelle
obua
parents:
diff changeset
    47
qed
90c88e7ef62d first version of matrices for HOL/Isabelle
obua
parents:
diff changeset
    48
90c88e7ef62d first version of matrices for HOL/Isabelle
obua
parents:
diff changeset
    49
lemma linprog_by_duality_approx:
90c88e7ef62d first version of matrices for HOL/Isabelle
obua
parents:
diff changeset
    50
  assumes
90c88e7ef62d first version of matrices for HOL/Isabelle
obua
parents:
diff changeset
    51
  "(A + dA) * x <= (b::('a::pordered_matrix_element) matrix)"
90c88e7ef62d first version of matrices for HOL/Isabelle
obua
parents:
diff changeset
    52
  "y * A = c"
90c88e7ef62d first version of matrices for HOL/Isabelle
obua
parents:
diff changeset
    53
  "0 <= y"
90c88e7ef62d first version of matrices for HOL/Isabelle
obua
parents:
diff changeset
    54
  shows
90c88e7ef62d first version of matrices for HOL/Isabelle
obua
parents:
diff changeset
    55
  "c * x  + (y * dA) * x <= y * b"
90c88e7ef62d first version of matrices for HOL/Isabelle
obua
parents:
diff changeset
    56
apply (simp add: times_matrix_def plus_matrix_def)
90c88e7ef62d first version of matrices for HOL/Isabelle
obua
parents:
diff changeset
    57
apply (rule linprog_by_duality_approx_general)
90c88e7ef62d first version of matrices for HOL/Isabelle
obua
parents:
diff changeset
    58
apply (simp_all)
90c88e7ef62d first version of matrices for HOL/Isabelle
obua
parents:
diff changeset
    59
apply (simp_all add: associative_def matrix_add_assoc matrix_mult_assoc)
90c88e7ef62d first version of matrices for HOL/Isabelle
obua
parents:
diff changeset
    60
apply (simp_all add: commutative_def matrix_add_commute)
90c88e7ef62d first version of matrices for HOL/Isabelle
obua
parents:
diff changeset
    61
apply (simp_all add: distributive_def l_distributive_def r_distributive_def matrix_left_distrib matrix_right_distrib)
90c88e7ef62d first version of matrices for HOL/Isabelle
obua
parents:
diff changeset
    62
apply (simp_all! add: plus_matrix_def times_matrix_def)
90c88e7ef62d first version of matrices for HOL/Isabelle
obua
parents:
diff changeset
    63
apply (simp add: pordered_add)
90c88e7ef62d first version of matrices for HOL/Isabelle
obua
parents:
diff changeset
    64
apply (simp add: pordered_mult_left)
90c88e7ef62d first version of matrices for HOL/Isabelle
obua
parents:
diff changeset
    65
done
90c88e7ef62d first version of matrices for HOL/Isabelle
obua
parents:
diff changeset
    66
90c88e7ef62d first version of matrices for HOL/Isabelle
obua
parents:
diff changeset
    67
lemma linprog_by_duality:
90c88e7ef62d first version of matrices for HOL/Isabelle
obua
parents:
diff changeset
    68
  assumes
90c88e7ef62d first version of matrices for HOL/Isabelle
obua
parents:
diff changeset
    69
  "A * x <= (b::('a::pordered_g_semiring) matrix)"
90c88e7ef62d first version of matrices for HOL/Isabelle
obua
parents:
diff changeset
    70
  "y * A = c"
90c88e7ef62d first version of matrices for HOL/Isabelle
obua
parents:
diff changeset
    71
  "0 <= y"
90c88e7ef62d first version of matrices for HOL/Isabelle
obua
parents:
diff changeset
    72
  shows
90c88e7ef62d first version of matrices for HOL/Isabelle
obua
parents:
diff changeset
    73
  "c * x  <= y * b"
90c88e7ef62d first version of matrices for HOL/Isabelle
obua
parents:
diff changeset
    74
proof -
90c88e7ef62d first version of matrices for HOL/Isabelle
obua
parents:
diff changeset
    75
  have a:"(A + 0) * x <= b" by (simp!)
90c88e7ef62d first version of matrices for HOL/Isabelle
obua
parents:
diff changeset
    76
  have b:"c * x + (y*0)*x <= y * b" by (rule linprog_by_duality_approx, simp_all!) 
90c88e7ef62d first version of matrices for HOL/Isabelle
obua
parents:
diff changeset
    77
  show "c * x <= y*b" by (insert b, simp)
90c88e7ef62d first version of matrices for HOL/Isabelle
obua
parents:
diff changeset
    78
qed
90c88e7ef62d first version of matrices for HOL/Isabelle
obua
parents:
diff changeset
    79
90c88e7ef62d first version of matrices for HOL/Isabelle
obua
parents:
diff changeset
    80
end
90c88e7ef62d first version of matrices for HOL/Isabelle
obua
parents:
diff changeset
    81
90c88e7ef62d first version of matrices for HOL/Isabelle
obua
parents:
diff changeset
    82
90c88e7ef62d first version of matrices for HOL/Isabelle
obua
parents:
diff changeset
    83
  
90c88e7ef62d first version of matrices for HOL/Isabelle
obua
parents:
diff changeset
    84