comparison agda/similar.agda @ 40:a7cd7740f33e

Add Haskell style Monad-laws and Proof Monad-laws-h-1
author Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
date Sun, 19 Oct 2014 16:17:46 +0900
parents b9b26b470cc2
children 23474bf242c6
comparison
equal deleted inserted replaced
39:b9b26b470cc2 40:a7cd7740f33e
14 -- Functor 14 -- Functor
15 fmap : {l ll : Level} {A : Set l} {B : Set ll} -> (A -> B) -> (Similar A) -> (Similar B) 15 fmap : {l ll : Level} {A : Set l} {B : Set ll} -> (A -> B) -> (Similar A) -> (Similar B)
16 fmap f (similar xs x ys y) = similar xs (f x) ys (f y) 16 fmap f (similar xs x ys y) = similar xs (f x) ys (f y)
17 17
18 18
19 -- Monad 19 -- Monad (Category)
20 mu : {l : Level} {A : Set l} -> Similar (Similar A) -> Similar A 20 mu : {l : Level} {A : Set l} -> Similar (Similar A) -> Similar A
21 mu (similar lx (similar llx x _ _) ly (similar _ _ lly y)) = similar (lx ++ llx) x (ly ++ lly) y 21 mu (similar lx (similar llx x _ _) ly (similar _ _ lly y)) = similar (lx ++ llx) x (ly ++ lly) y
22 22
23 return : {l : Level} {A : Set l} -> A -> Similar A 23 eta : {l : Level} {A : Set l} -> A -> Similar A
24 return x = similar [] x [] x 24 eta x = similar [] x [] x
25 25
26 returnS : {l : Level} {A : Set l} -> A -> Similar A 26 returnS : {l : Level} {A : Set l} -> A -> Similar A
27 returnS x = similar [[ (show x) ]] x [[ (show x) ]] x 27 returnS x = similar [[ (show x) ]] x [[ (show x) ]] x
28 28
29 returnSS : {l : Level} {A : Set l} -> A -> A -> Similar A 29 returnSS : {l : Level} {A : Set l} -> A -> A -> Similar A
30 returnSS x y = similar [[ (show x) ]] x [[ (show y) ]] y 30 returnSS x y = similar [[ (show x) ]] x [[ (show y) ]] y
31
32
33 -- Monad (Haskell)
34 return : {l : Level} {A : Set l} -> A -> Similar A
35 return = eta
36
37 _>>=_ : {l ll : Level} {A : Set l} {B : Set ll} ->
38 (x : Similar A) -> (f : A -> (Similar B)) -> (Similar B)
39 x >>= f = mu (fmap f x)
31 40
32 41
33 42
34 -- proofs 43 -- proofs
35 44
63 72
64 73
65 -- monad-law-2 : join . fmap return = join . return = id 74 -- monad-law-2 : join . fmap return = join . return = id
66 -- monad-law-2-1 join . fmap return = join . return 75 -- monad-law-2-1 join . fmap return = join . return
67 monad-law-2-1 : {l : Level} {A : Set l} -> (s : Similar A) -> 76 monad-law-2-1 : {l : Level} {A : Set l} -> (s : Similar A) ->
68 (mu ∙ fmap return) s ≡ (mu ∙ return) s 77 (mu ∙ fmap eta) s ≡ (mu ∙ eta) s
69 monad-law-2-1 (similar lx x ly y) = begin 78 monad-law-2-1 (similar lx x ly y) = begin
70 similar (lx ++ []) x (ly ++ []) y 79 similar (lx ++ []) x (ly ++ []) y
71 ≡⟨ cong (\left-list -> similar left-list x (ly ++ []) y) (empty-append lx)⟩ 80 ≡⟨ cong (\left-list -> similar left-list x (ly ++ []) y) (empty-append lx)⟩
72 similar lx x (ly ++ []) y 81 similar lx x (ly ++ []) y
73 ≡⟨ cong (\right-list -> similar lx x right-list y) (empty-append ly) ⟩ 82 ≡⟨ cong (\right-list -> similar lx x right-list y) (empty-append ly) ⟩
74 similar lx x ly y 83 similar lx x ly y
75 84
76 85
77 -- monad-law-2-2 : join . return = id 86 -- monad-law-2-2 : join . return = id
78 monad-law-2-2 : {l : Level} {A : Set l } -> (s : Similar A) -> (mu ∙ return) s ≡ id s 87 monad-law-2-2 : {l : Level} {A : Set l } -> (s : Similar A) -> (mu ∙ eta) s ≡ id s
79 monad-law-2-2 (similar lx x ly y) = refl 88 monad-law-2-2 (similar lx x ly y) = refl
80 89
81 -- monad-law-3 : return . f = fmap f . return 90 -- monad-law-3 : return . f = fmap f . return
82 monad-law-3 : {l : Level} {A B : Set l} (f : A -> B) (x : A) -> (return ∙ f) x ≡ (fmap f ∙ return) x 91 monad-law-3 : {l : Level} {A B : Set l} (f : A -> B) (x : A) -> (eta ∙ f) x ≡ (fmap f ∙ eta) x
83 monad-law-3 f x = refl 92 monad-law-3 f x = refl
84 93
85 -- monad-law-4 : join . fmap (fmap f) = fmap f . join 94 -- monad-law-4 : join . fmap (fmap f) = fmap f . join
86 monad-law-4 : {l : Level} {A B : Set l} (f : A -> B) (s : Similar (Similar A)) -> 95 monad-law-4 : {l : Level} {A B : Set l} (f : A -> B) (s : Similar (Similar A)) ->
87 (mu ∙ fmap (fmap f)) s ≡ (fmap f ∙ mu) s 96 (mu ∙ fmap (fmap f)) s ≡ (fmap f ∙ mu) s
88 monad-law-4 f (similar lx (similar llx x _ _) ly (similar _ _ lly y)) = refl 97 monad-law-4 f (similar lx (similar llx x _ _) ly (similar _ _ lly y)) = refl
98
99
100 -- Monad-laws (Haskell)
101 -- monad-law-h-1 : return a >>= k = k a
102 monad-law-h-1 : {l ll : Level} {A : Set l} {B : Set ll} ->
103 (a : A) -> (k : A -> (Similar B)) ->
104 (return a >>= k) ≡ (k a)
105 monad-law-h-1 a k = begin
106 return a >>= k
107 ≡⟨ refl ⟩
108 mu (fmap k (return a))
109 ≡⟨ refl ⟩
110 mu (return (k a))
111 ≡⟨ refl ⟩
112 (mu ∙ return) (k a)
113 ≡⟨ refl ⟩
114 (mu ∙ eta) (k a)
115 ≡⟨ (monad-law-2-2 (k a)) ⟩
116 id (k a)
117 ≡⟨ refl ⟩
118 k a
119
120
121 -- monad-law-h-2 : m >>= return = m
122 -- monad-law-h-3 : m >>= (× -> k x >>= h) = (m >>= k) >>= h