4 | module Data.Linear.Diff
7 | import Data.Linear.Inverse
8 | import Data.Linear.LEither
13 | Quadruple : Type -> Type
14 | Quadruple a = LPair a (LPair a (LPair a a))
17 | data QuadContexts : Type -> Type where
18 | Mk1 : (1 y, z, w : a) -> QuadContexts a
19 | Mk2 : (1 x, z, w : a) -> QuadContexts a
20 | Mk3 : (1 x, y, w : a) -> QuadContexts a
21 | Mk4 : (1 x, y, z : a) -> QuadContexts a
24 | data QuadTwoContexts : Type -> Type where
25 | Mk : QuadContexts a -@ Inverse (LEither a a) -@ QuadTwoContexts a
29 | fromContext : LPair a a -@ QuadTwoContexts a -@ Quadruple a
30 | fromContext (h1 # h2) (Mk (Mk1 y z w) inv)
31 | = (Right y `divide` inv) `seq` (h1 # h2 # z # w)
32 | fromContext (h1 # h2) (Mk (Mk2 x z w) inv)
33 | = (Left x `divide` inv) `seq` (h1 # h2 # z # w)
34 | fromContext (h1 # h2) (Mk (Mk3 x y w) inv)
35 | = (Right w `divide` inv) `seq` (x # y # h1 # h2)
36 | fromContext (h1 # h2) (Mk (Mk4 x y z) inv)
37 | = (Left z `divide` inv) `seq` (x # y # h1 # h2)
43 | fromContext' : LPair a a -@ QuadTwoContexts a -@ Quadruple a
44 | fromContext' (h1 # h2) (Mk (Mk1 y z w) inv)
46 | = (Left h1 `divide` inv) `seq` (h2 # y # z # w)
47 | fromContext' (h1 # h2) (Mk (Mk2 x z w) inv)
49 | = (Left x `divide` inv) `seq` (h1 # h2 # z # w)
50 | fromContext' (h1 # h2) (Mk (Mk3 x y w) inv)
52 | = (Left y `divide` inv) `seq` (x # h1 # h2 # w)
53 | fromContext' (h1 # h2) (Mk (Mk4 x y z) inv)
55 | = (Left z `divide` inv) `seq` (x # y # h1 # h2)