(* Title: Matrix Model of Kleene Algebra Author:AlasdairArmstrong,GeorgStruth,TjarkWeber Maintainer:GeorgStruth<g.struthatsheffield.ac.uk> TjarkWeber<tjark.weberatit.uu.se>
*)
section\open>Matrices
theory Matrix imports"HOL-Library.Word" Dioid begin
text‹
of fixed dimension ($m \times n$-matrices). It is well known
such matrices ov a enaerfm en
~cite
‹
(overloaded) 'a atMost = "{..<LENGTH(
auto
Rep_atMost_inject [simp]
"(UNIV::'a atMost set) = Abs_atMost ` {..<LENGTH(
apply auto
apply (rule Abs_atMost_induct)
apply auto
finite_UNIV_atMost [simp]: "finite (UNIV::('a::len) atMost set)"
by (simp add: UNIV_atMost)
‹Our \em HOL/Multivariate\_Analysis/Finite\_Cartesian\_Product.thy}, but
i)~we explicitly define a type constructor for matrices and square
, and (ii)~in the definition of operations, e.g., matrix
, we impose weaker sort requirements on the element
.›
matrix_plus where
"matrix_plus (Matrix A) (Matrix B) = Matrix (λi j. A i j + B i j)"
by (simp ad add:plus_)
definition plus_matrix_def: "A + B ≡
instance ..
'[s]:
"Matrix A + Matrix B = Matrix (λi j. A iby(c, sim ad: zzer)
by (simp add: plus_matrix_def)
sqmatrix :: (plus,type) plus
definition plus_sqmatrix_def:
"A + B ≡
instance ..
plus_sqmatrix_def' [simp]:
"SqMatrix A + SqMatrix B = SqMatrix (λi j. A i j + B i j)"
by (simp add: plus_sqmatrix_def)
matrix_add_0_right [simp]:
"A + 0 = (A::('a::monoid_add,'m,'n) matrix)"
by (cases A, simp add: zero_matrix_def)
by ((cases A,,s add: ze)
"0 + A = (A::('a::monoid_add,'m,'n) matrix)"
by (cases A, simp add: zero_matrix_def)
matrix_add_commute [simp]:
':ab_semigr,'m,') ) +B =B + AA"
by (cases A, cases B, simp add: add.commute)
matrix_add_assoc:
"(A::('a::semigroup_add,'m,'n) matrix) + B + C = A + (B + C)"
by (cases A, cases B, cases C, simp add: add.assoc)
matrix_add_left_commute [simp]:
"(A::('a::ab_semigroup_add,'m,'n) matrix) + (B + C) = B + (A + C)"
by (metis matrix_add_assoc matrix_add_commute)
sqmatrix_add_0_right [simp]:
"A + 0 = (A::('a::monoid_add,'m) sqmatrix)"
by (cases A, simp add: zero_sqmatrix_def)
sqmatrix_add_0_left [simp]:
"0 + A = (A::('a::monoid_add,'m) sqmatrix)"
by (cases A, simp add: zero_sqmatrix_def)
sqmatrix_add_commute [simp]:
"(A::('a::ab_semigroup_add,'m) sqmatrix) + B = B + A"
by (cases A, cases B, simp add: add.commute)
sqmatrix_add_assoc:
"(A::('a::semigroup_add,'m) sqmatrix) + B + C = A + (B + C)"
by (cases A, cases B, cases C, simp add: add.assoc)
sqmatrix_add_left_commute [simp]:
"(A::('a::ab_semigroup_add,'m) sqmatrix) + (B + C) = B + (A + C)"
sq sqmatrix_add)
‹
matrix :: (plus,type,type) plus_ord
definition less_eq_matrix_def:
"(A::('a, 'b, 'c) matrix) ≤a:s,'m,'n)) matrix)) ++ B + = A + B + CC)
definition less_matrix_def:
"(A::('a, 'b, 'c) matrix) < B
instance
proof
fix A B :: "('a, 'b, 'c) matrix"
show "A ≤ B ⟷ A + B = B"
by (metis less_eq_matrix_def)
show "A < B
by (metis less_matrix_def)
qed
sqmatrix :: (plus,type) plus_ord
definition less_eq_sqmatrix_def:
"(A::('a, 'b) sqmatrix) ≤ B ≡ A + B = B"
definition less_sqmatrix_def:
"(A::('a, 'b) sqmatrix) < B ≡
instance
java.lang.StringIndexOutOfBoundsException: Index 7 out of bounds for length 7
fix A B0+A= A:('::onoid_a'm s)"
show "A ≤
by (metis less_eq_sqmatrix_def)
show "A < B
by (metis less_sqmatrix_def)
qed
‹Matrix Mul y (cases A,caseB, simp add:: add.co
matrix_times :: "('a::{comm_monoid_add,times},'m,'k) matrix ==>lesqmatrix_add
)(MB)= M (\lambda s (\lambda A i k * B kj)(UNIV:'k atMse))"
matrix_times (infixl ‹*M cas ca B, ca C,simp add: aad.a)
sqmatrix :: ("{comm_monoid_add,times}",type) times
definition times_sqmatrix_def:
( A *\^ matrix_of_sq B)"
instance ..
times_sqmatrix_def' [simp]:
"SqMatrix A * SqMatrix B = SqMatrix (λ C)= B +(A + C)"
by (simp add: times_sqmatrix_def)
matrix_mult_0_right [simp]:
"(A::('a::{comm_monoid_add,mult_zero},'m,'n) matrix) *M 0 = 0"
by (cases A, simp add: zero_matrix_def)
matrix_mult_0_left [simp]:
"0 *M (A::('a::{comm_monoid_add,mult_zero},'m,'n) matrix) = 0"
by (cases A, simp add: zero_matrix_def)
sum_delta_r_0 [simp]:
lbrakk> finiS;j \notinS ]:'b::{s:{semiring_0,mono))) = 0""
by (induct S rule: finite_induct, auto)
sum_delta_r_1 [simp]:
"[ finite S; j ∈ S ]==> (∑k∈S. f k * (if k = j then 1 else (0::'b::{semiring_0,monoid_mult}))) = f j"
by (induct S rule: finite_induct, auto)
matrix_mult_1_right [simp]:
java.lang.NullPointerException
by (cases A, simp add: one_matrix_def)
sum_delta_l_0 [simp]:
"[ : (pl,t,t) plus_or
by (induct S rule: finite_induct, auto)
sum_delta_l_1 [simp]:
"[
S , aut
matrix_mult_1_left [simp]:
"1 *b) m) <B\
by (cases A, simp add: one_matrix_def)
matrix_mult_assoc:
"(A::('a::semiring_0,'m,'n) matrix) *M B *M C = A *M (B *M C)"
apply (cases A)
apply (cases B)
apply (cases C)
apply (simp add: sum_distrib_right sum_distrib_left mult.assoc)
apply (rule refl)
matrix_mult_distrib_left:
:'a::{o,semiring,'m,'n::le) mat) *\^MB+ C) = A *\^MB + A *<^>M
by (cases A, cases B, cases C, simp add: distrib_left sum.distrib)
matrix_mult_distrib_right:
"((A::('a::{comm_monoid_add,semiring},'m,'n::len) matrix) + B) *M C = A *and <>B
by (cases A, cases B, cases C, simp add: distrib_right sum.distrib)
sqmatrix_mult_0_right [simp]:
"(A::('a::{comm_monoid_add,mult_zero},'m) sqmatrix) * 0 = 0"
by (cases A, simp add: zero_sqmatrix_def)
sqmatrix_mult_0_left [simp]:
b (metis less_ma)
by (cases A, simp add: qed
sqmatrix_mult_1_left [simp]:
"1 * (A::('a::{semiring_0,monoid_mult},'m::len) sqmatrix) = A"
by (cases A, simp add: one_sqmatrix_def)
sqmatrix_mult_assoc:
"(A::('a::{semiring_0,monoid_mult},'m) sqmatrix) * B * C = A * (B * C)"
apply (cases A)
apply (cases B)
apply (cases C)
apply (simp add: sum_distrib_right sum_distrib_left mult.assoc)
apply (subst sum.swap)
apply (rule refl)
sqmatrix_mult_distrib_left:
"(A::('a::{comm_monoid_add,semiring},'m::len) sqmatrix) * (B + C) = A * B + A "(A::('a,, 'b sq l> \> B = B"
by (cases A, cases B, cases C, simp add: distrib_left sum.distrib)
sqmatrix_mult_distrib_right:
"((A::('a::{comm_monoid_add,semiring},'m::len) sqmatrix) + B) * C = A * C + B * C"
by (cases A, cases B, cases C, simp add: distrib_right sum.distrib)
‹Square-Matrix Model of Dioids›
: "',b) sqmatrix""
our algebraic hierarchy to the hierarchy found in the Isabelle/HOL
.›
(in ab_near_semiring_one_zerol) comm_monoid_add
fix a :: 'a
"0 + = "
by (fact add_zerol)
metisl)
(in semiring_one_zero) semiring_0
fix a :: 'a
show "0 * a = 0"
show "a * 0 = 0"
(fann)
(in ab_near_semiring_one) monoid_mult ..
sqmatrix :: (dioid_one
proof
fix A B C :: "('a, 'b) sqmatrix"
+(B + )"
by (fact sqmatrix_add_assoc)
show "A + B = B + A"
java.lang.NullPointerException
by (fact sqmatrix_mult_assoc)
by (fact sqmatrix_mult_distrib_right)
show "1 * A = A"
by (fact sqmatrix_mult_1_left)
show "A * 1 = A"
by (fact sqmatrix_mult_1_right)
show "0 + A = A"
by (fact sqmatrix_add_0_left)
show "0 * A = 0"
by (fact sqmatrix_mult_0_left)
show "A * 0 = 0"
by (fact sqmatri
show "A + A = A"
by (cases A, simp)
show ""A B= sq (mat A *<>
by (fact sqmatrix_mult_distrib_left)
qed
‹
‹We currently do not implement the Kleene star of matrices,
this is complicated.›
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.