<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="../../../xsl/unit.xsl"?>
<KIVSPEC name="matrixops"><SPECBODY>specification
   using natset, 
         actualize
            <a href="../../../specs/matrix+array/export/unit.xml">matrix+array</a>
         with
            <a href="../../../specs/ring/export/unit.xml">ring</a>
            
         by morphism
            :array → vector; 
            mkarray → mkvector; 
            &#35; → &#35;; 
            [ ] → [ ]; 
            [ ] → [ ]; 
            [ ]r → [ ]r; 
            [ ]c → [ ]c; 
         end actualize
   functions 
       O- . : matrix → matrix;
       O- . : vector → vector;
       Σ : natset × (nat → elem) → elem;
   
   variables 
       mx : matrix;
       vec : vector;
       a : elem;
       r : nat;
       c : nat;
       m : nat;
       n : nat;
       f : nat → elem;
       ns : natset;
       g : nat × nat → elem;
   
   partial functions 
       . + . : matrix × matrix → matrix with λ mx1, mx2. &#35;r mx1 = &#35;r mx2 ∧ &#35;c mx2 = &#35;c mx2;
       . + . : vector × vector → vector with λ vec1, vec2. &#35; vec1 = &#35; vec2;
       . * . : matrix × matrix → matrix prio 10 right with λ mx1, mx2. &#35;c mx1 = &#35;r mx2;
       . * . : matrix × vector → vector prio 10 right with λ mx, vec. &#35;r mx = &#35; vec;
       . * . : vector × matrix → vector prio 10 right with λ vec, mx. &#35;c mx = &#35; vec;
       . * . : vector × vector → elem prio 10 right with λ vec1, vec2. &#35; vec1 = &#35; vec2;
   
   
   axioms 
      addinvvec-size: &#35; O- vec = &#35; vec;
      used for: s, ls;
      
      addinvvec-get: n &lt; &#35; vec → (O- vec)[n] = O- vec[n];
      used for: s, ls;
      
      addinvmx-rowno: &#35;r O- mx = &#35;r mx;
      used for: s, ls;
      
      addinvmx-colno: &#35;c O- mx = &#35;c mx;
      used for: s, ls;
      
      addinvmx-get: c &lt; &#35;c mx ∧ c &lt; &#35;c mx → (O- mx)[r, c] = O- mx[r, c];
      used for: s, ls;
      
      addvec-size: &#35;(vec1 + vec2) = &#35; vec1;
      used for: s, ls;
      
      addmvec-get: n &lt; &#35; vec1 → (vec1 + vec2)[n] = vec1[n] + vec2[n];
      used for: s, ls;
      
      addmx-rowno: &#35;r(mx1 + mx2) = &#35;r mx1;
      used for: s, ls;
      
      addmx-colno: &#35;c(mx1 + mx2) = &#35;c mx1;
      used for: s, ls;
      
      addmx-get: r &lt; &#35;r mx1 ∧ c &lt; &#35;c mx1 → (mx1 + mx2)[r, c] = mx1[r, c] + mx2[r, c];
      used for: s, ls;
      
      sum-base: Σ(∅, f) = O;
      used for: s, ls;
      
      sum-rec: ¬ n ∈ ns → Σ(ns ++ n, f) = f(n) + Σ(ns, f);
      used for: s, ls;
      
      multmx-rowno: &#35;c mx1 = &#35;r mx2 → &#35;r(mx1 * mx2) = &#35;r mx1;
      used for: s, ls;
      
      multmx-colno: &#35;c mx1 = &#35;r mx2 → &#35;c(mx1 * mx2) = &#35;c mx2;
      used for: s, ls;
      
      multmx-get: &#35;c mx1 = &#35;r mx2 ∧ r &lt; &#35;r mx1 ∧ c &lt; &#35;c mx2 → (mx1 * mx2)[r, c] = Σ(0 to &#35;c mx1, λ n. mx1[r, n] * mx2[n, c]);
      used for: s, ls;
      
      multmxvec-size: &#35;c mx = &#35; vec → &#35;(mx * vec) = &#35;r mx;
      used for: s, ls;
      
      multmxvec-get: &#35;c mx = &#35; vec ∧ r &lt; &#35;r mx → (mx * vec)[r] = Σ(0 to &#35; vec, λ n. mx[r, n] * vec[n]);
      used for: s, ls;
      
      multvecmx-size: &#35;r mx = &#35; vec → &#35;(vec * mx) = &#35;c mx;
      used for: s, ls;
      
      multvecmx-get: &#35;r mx = &#35; vec ∧ c &lt; &#35;c mx → (vec * mx)[c] = Σ(0 to &#35; vec, λ n. vec[n] * mx[n, c]);
      used for: s, ls;
   
   
end specification</SPECBODY></KIVSPEC>