2 | import Data.Fin.Split
3 | import Data.List.Quantifiers
4 | import Language.Reflection
5 | import Derive.Prelude
8 | %language ElabReflection
19 | data LayoutOrder = RowMajor
22 | %runElab derive "LayoutOrder" [Eq, Show]
23 | %name LayoutOrder
lo
28 | DefaultLayoutOrder : LayoutOrder
29 | DefaultLayoutOrder = RowMajor
42 | splitFinProd : {m, n : Nat} ->
46 | splitFinProd RowMajor p = splitProd p
47 | splitFinProd ColumnMajor p = swap (splitProd {m=n} {n=m}
48 | (replace {p = Fin} (multCommutative m n) p))
60 | indexFinProd : {m, n : Nat} ->
65 | indexFinProd RowMajor row col = indexProd row col
66 | indexFinProd ColumnMajor row col =
67 | replace {p = Fin} (sym $
multCommutative m n) (indexProd {m=n} {n=m} col row)
71 | splitFinProdDep : {n : Nat} -> (content : Fin n -> Nat) ->
72 | Fin (sum content) -> (i : Fin n ** Fin (content i))
73 | splitFinProdDep {n = 0} content x = absurd x
74 | splitFinProdDep {n = (S k)} content x = case splitSum x of
76 | Right y => let (
i ** j)
= splitFinProdDep (content . FS) y in (
FS i ** j)