More Related Content Similar to Tpp2012 mwpl on_coq (20) Tpp2012 mwpl on_coq1. TPP 2012 at Chiba, Nov 21, 2012
Coq に於ける
Monads with Predicate Liftings
の実装と考察
千葉大学大学院 理学研究科 須田 啓司
4. op
:C ! Cat
hT, ⌘, µ, ⌧, ✓, ⌫i hT , ⌘, µi
各々の道具の中身よりも
それらの関係性に重点を置きます
Kl(T ) Kl(T )
# # ⇧
hT, ⌘, ( ) i hT, ⌘, ( ) , ⌧, ✓, ( ) i hT , ⌘, ( )# i
7. モナド on Coq
‣ 関数型プログラミングの文脈に於けるモナド
- 手続き的にプログラムを記述するための枠組み
- 計算効果を統一的に扱うことを可能にする
‣ 型クラスとしてのモナド
- 型変換子Tでパラメタライズされた型クラス
- モナド則をメンバとして持つ
• モナドそのものを推論の対象と出来る
- 個々の計算効果はモナドのサブクラスとして記述される
• 失敗,状態,非決定性など
8. Record TypeModifier: Type :=
{
tm_modify :> Set -> Set;
tm_equivalence {A: Set}: Equivalence (tm_modify A)
}.
Notation "A =t= B" := (equiv_eq (Equivalence:=tm_equivalence _) A B)
(at level 70, no associativity).
Reserved Notation "x >>= y" (at level 60, left associativity).
Class Monad (T: TypeModifier):=
{
ret {A: Set}: A -> T A;
bind {A B: Set}: (A -> T B) -> T A -> T B
where "x >>= y" := (bind y x);
unit_left:
forall (A B: Set)(f: A -> T B)(a: A),
(ret a) >>= f =t= f a;
unit_right:
forall (A: Set)(m: T A),
m >>= ret =t= m;
assoc:
forall (A B C: Set)(f: A -> T B)(g: B -> T C)(m: T A),
(m >>= f >>= g) =t= m >>= (fun x => (f x) >>= g);
bind_subst:
forall (A B: Set)(m m': T A)(f f': A -> T B),
m =t= m' ->
(forall a: A, f a =t= f' a) ->
m >>= f =t= m' >>= f'
}.
9. Record TypeModifier: Type :=
{
tm_modify :> Set -> Set;
tm_equivalence {A: Set}: Equivalence (tm_modify A)
}.
Notation "A =t= B" := (equiv_eq (Equivalence:=tm_equivalence _) A B)
(at level 70, no associativity).
Reserved Notation "x >>= y" (at level 60, left associativity).
Class Monad (T: TypeModifier):=
{
ret {A: Set}: A -> T A;
bind {A B: Set}: (A -> T B) -> T A -> T B
where "x >>= y" := (bind y x);
unit_left:
forall (A B: Set)(f: A -> T B)(a: A),
(ret a) >>= f =t= f a;
unit_right:
forall (A: Set)(m: T A),
m >>= ret =t= m;
assoc:
forall (A B C: Set)(f: A -> T B)(g: B -> T C)(m: T A),
(m >>= f >>= g) =t= m >>= (fun x => (f x) >>= g);
bind_subst:
forall (A B: Set)(m m': T A)(f f': A -> T B),
m =t= m' ->
(forall a: A, f a =t= f' a) ->
m >>= f =t= m' >>= f'
}.
10. Record TypeModifier: Type :=
{
tm_modify :> Set -> Set;
tm_equivalence {A: Set}: Equivalence (tm_modify A)
}.
Notation "A =t= B" := (equiv_eq (Equivalence:=tm_equivalence _) A B)
(at level 70, no associativity).
Reserved Notation "x >>= y" (at level 60, left associativity).
Class Monad (T: TypeModifier):=
{
ret {A: Set}: A -> T A;
bind {A B: Set}: (A -> T B) -> T A -> T B
where "x >>= y" := (bind y x);
unit_left:
forall (A B: Set)(f: A -> T B)(a: A),
(ret a) >>= f =t= f a; モナド則
unit_right:
forall (A: Set)(m: T A), (Kleisli Tripleの3等式)
m >>= ret =t= m;
assoc:
forall (A B C: Set)(f: A -> T B)(g: B -> T C)(m: T A),
(m >>= f >>= g) =t= m >>= (fun x => (f x) >>= g);
bind_subst:
forall (A B: Set)(m m': T A)(f f': A -> T B),
m =t= m' ->
(forall a: A, f a =t= f' a) ->
m >>= f =t= m' >>= f'
}.
11. Record TypeModifier: Type :=
{
tm_modify :> Set -> Set;
tm_equivalence {A: Set}: Equivalence (tm_modify A)
}.
Notation "A =t= B" := (equiv_eq (Equivalence:=tm_equivalence _) A B)
(at level 70, no associativity).
Reserved Notation "x >>= y" (at level 60, left associativity).
Class Monad (T: TypeModifier):=
{
ret {A: Set}: A -> T A;
bind {A B: Set}: (A -> T B) -> T A -> T B
where "x >>= y" := (bind y x);
unit_left:
forall (A B: Set)(f: A -> T B)(a: A),
(ret a) >>= f =t= f a; モナド則
unit_right:
forall (A: Set)(m: T A), (Kleisli Tripleの3等式)
m >>= ret =t= m;
assoc:
forall (A B C: Set)(f: A -> T B)(g: B -> T C)(m: T A),
(m >>= f >>= g) =t= m >>= (fun x => (f x) >>= g);
bind_subst:
forall (A B: Set)(m m': T A)(f f': A -> T B),
m =t= m' -> モナド自体も推論の対象
(forall a: A, f a =t= f' a) ->
m >>= f =t= m' >>= f'
}.
12. Record TypeModifier: Type :=
{
tm_modify :> Set -> Set;
tm_equivalence {A: Set}: Equivalence (tm_modify A)
}.
Notation "A =t= B" := (equiv_eq (Equivalence:=tm_equivalence _) A B)
(at level 70, no associativity).
Reserved Notation "x >>= y" (at level 60, left associativity).
Class Monad (T: TypeModifier):=
{
ret {A: Set}: A -> T A;
bind {A B: Set}: (A -> T B) -> T A -> T B
where "x >>= y" := (bind y x);
unit_left:
forall (A B: Set)(f: A -> T B)(a: A),
(ret a) >>= f =t= f a; モナド則
unit_right:
forall (A: Set)(m: T A), (Kleisli Tripleの3等式)
m >>= ret =t= m;
assoc:
forall (A B C: Set)(f: A -> T B)(g: B -> T C)(m: T A),
(m >>= f >>= g) =t= m >>= (fun x => (f x) >>= g);
bind_subst:
等式推論のみ
forall (A B: Set)(m m': T A)(f f': A -> T B),
m =t= m' -> モナド自体も推論の対象
(forall a: A, f a =t= f' a) ->
m >>= f =t= m' >>= f'
}.
14. モナドと述語論理
‣ (圏論的な)モナドと述語論理に関する研究
- Evaluation Logic. A.M.Pitts. 1990.
• 計算型付ラムダ計算を,その上の述語論理へ拡張
- A Semantics for Evaluation Logic. E.Moggi. 1993.
• モナドによる計算型付ラムダ計算の意味論を,交わり半束
などを用いて,Evaluation Logicの意味論へと拡張
- Predicate Logic for Functors and Monads. B.Jacobs. 2010
• 述語の一般化とも言える添字付圏と,Predicate Liftingを用
いて,モナドのKleisli圏(や代数)の述語の圏を構成
15. モナドと述語論理
‣ (圏論的な)モナドと述語論理に関する研究
- Evaluation Logic. A.M.Pitts. 1990.
• 計算型付ラムダ計算を,その上の述語論理へ拡張
- A Semantics for Evaluation Logic. E.Moggi. 1993.
• モナドによる計算型付ラムダ計算の意味論を,交わり半束
などを用いて,Evaluation Logicの意味論へと拡張
- Predicate Logic for Functors and Monads. B.Jacobs. 2010
• 述語の一般化とも言える添字付圏と,Predicate Liftingを用
いて,モナドのKleisli圏(や代数)の述語の圏を構成
16. モナドと述語論理
‣ (圏論的な)モナドと述語論理に関する研究
- Evaluation Logic. A.M.Pitts. 1990.
• 計算型付ラムダ計算を,その上の述語論理へ拡張
Kleisli Tripleの言葉に言い換え,
- A Semantics for Evaluation Logic. E.Moggi. 1993.
Coqで実装するのが本発表の目的
• モナドによる計算型付ラムダ計算の意味論を,交わり半束
などを用いて,Evaluation Logicの意味論へと拡張
- Predicate Logic for Functors and Monads. B.Jacobs. 2010
• 述語の一般化とも言える添字付圏と,Predicate Liftingを用
いて,モナドのKleisli圏(や代数)の述語の圏を構成
20. モナド
‣ 圏C上のモナド
- 自己函手と2つの自然変換からなる三つ組
- 次の図式を可換にする(モナド則)
‣ Kleisli Tripleと同値
- として互いを構成可能
22. 添字付圏
‣ 添字付圏 : C op ! Cat
- 例えば
‣ 圏IndCat
- 添字付圏全体からなる2-圏
- 射(1-cell)
•
- 射の変換(2-cell)
•
23. 添字付圏
‣ 添字付圏 : C op ! Cat
- 例えば
‣ 圏IndCat
- 添字付圏全体からなる2-圏
- 射(1-cell)
•
- 射の変換(2-cell)
•
24. 添字付圏
‣ 添字付圏 : C op ! Cat
- 例えば
‣ 圏IndCat
- 添字付圏全体からなる2-圏
- 射(1-cell)
•
- 射の変換(2-cell)
•
28. 函手とP.L.
‣ Functors with Predicate Liftings
- IndCatに於ける自己射 のこと
- をpredicate liftingと呼ぶ
• X上の述語 をFX上の述語 に
( : C op ! Cat) (F, ) /( : C op ! Cat)
29. 函手とP.L.
‣ Functors with Predicate Liftings
- IndCatに於ける自己射 のこと
- をpredicate liftingと呼ぶ
• X上の述語 をFX上の述語 に
op op
C C
F
✏
+3 C op
✏ ✏
Cat Cat
30. モナドとP.L.
‣ Monads with Predicate Liftings
- IndCatの自己射(1-cell)と2つの2-cellからなる三つ組
•
- Predicate Liftingのsplitness
• が全て恒等射であるときsplitであるという
✓X,P : P ⇠
= (⌘X )(⌧X (P ))
⌫X,P : ⌧T X (⌧X (P )) ⇠ (µX )(⌧X (P ))
=
31. モナドとP.L.
‣ Monads with Predicate Liftings
- IndCatの自己射(1-cell)と2つの2-cellからなる三つ組
•
T : C ! C, ⌧ : ) T
⌘ : Id ) T, ✓ = {✓X : Id (X) ) (⌘X )⌧X }
µ : T 2 ) T, ⌫ = {⌫X : ⌧T X ⌧X ) (µX )⌧X }
- Predicate Liftingのsplitness
• が全て恒等射であるときsplitであるという
✓X,P : P ⇠
= (⌘X )(⌧X (P ))
⌫X,P : ⌧T X (⌧X (P )) ⇠ (µX )(⌧X (P ))
=
36. モナド with P.L. のモナド則
µX ⌘T X = idT X
µX T ⌘X = idT X
µX µT X = µX T µX
37. モナド with P.L. のモナド則
µX ⌘T X = idT X
µX T ⌘X = idT X
µX µT X = µX T µX
38. モナド with P.L. のモナド則
µX ⌘T X = idT X
µX T ⌘X = idT X
µX µT X = µX T µX
39. モナド with P.L. のモナド則
µX ⌘T X = idT X
µX T ⌘X = idT X
µX µT X = µX T µX
(⌘T X )⌫X ✓T X ⌧X = id⌧X
40. モナド with P.L. のモナド則
µX ⌘T X = idT X
µX T ⌘X = idT X
µX µT X = µX T µX
(⌘T X )⌫X ✓T X ⌧X = id⌧X
(T ⌘X )⌫X ⌧X ✓X = id⌧X
41. モナド with P.L. のモナド則
µX ⌘T X = idT X
µX T ⌘X = idT X
µX µT X = µX T µX
(⌘T X )⌫X ✓T X ⌧X = id⌧X
(T ⌘X )⌫X ⌧X ✓X = id⌧X
(µT X )⌫X ⌫ T X ⌧X = (T µX )⌫X ⌧T 2 X ⌫ X
42. モナド with P.L. のモナド則
µX ⌘T X = idT X
µX T ⌘X = idT X
µX µT X = µX T µX
(⌘T X )⌫X ✓T X ⌧X = id⌧X
(T ⌘X )⌫X ⌧X ✓X = id⌧X
(µT X )⌫X ⌫ T X ⌧X = (T µX )⌫X ⌧T 2 X ⌫ X
82. X with P.L. = X
‣ 函手 with P.L. は 上の函手
R R
- から函手 F : ! が定まる
F (X, P ) := (F (X), X (P ))
F (f, p) := (F (f ), X (p))
‣ モナド with P.L. は 上のモナド
- からモナド が定まる
hT , ⌘, µi
⌘ (X,P ) := (⌘X , ✓X,P )
µ(X,P ) := (µX , ⌫X,P )
83. “モナド”達の関連
op
:C ! Cat
モノイダル圏 モノイド対象
End(C)
End( )
R
End( ) hT , ⌘, µi
84. Kleisli添字付圏
‣ 反変函手
- splitなモナド with P.L. の下で
•
•
- 函手性の証明にsplitnessが要る
‣
- Kleisli圏 Kl(T ) についての 述語の圏
85. ここまでに出てきたもの
op
:C ! Cat
hT , ⌘, µi
Kl(T ) Kl(T )
#
hT, ⌘, ( ) i
86. op
:C ! Cat
hT , ⌘, µi
Kl(T ) Kl(T )
#
hT, ⌘, ( ) i
87. op
:C ! Cat
hT , ⌘, µi
Kl(T ) Kl(T )
#
hT, ⌘, ( ) i
88. モナド on Coq
op
:C ! Cat
hT , ⌘, µi
Kl(T ) Kl(T )
#
hT, ⌘, ( ) i
89. モナド on Coq
op
:C ! Cat
hT , ⌘, µi
Kl(T ) Kl(T )
#
hT, ⌘, ( ) i
90. モナド on Coq モナド with P.L.
op
:C ! Cat
hT , ⌘, µi
Kl(T ) Kl(T )
#
hT, ⌘, ( ) i
91. モナド on Coq モナド with P.L.
op
:C ! Cat
hT , ⌘, µi
Kl(T ) Kl(T )
#
hT, ⌘, ( ) i hT , ⌘, ( )# i
92. モナド on Coq モナド with P.L.
op
:C ! Cat
= hT , ⌘, µi
Kl(T ) Kl(T )
#
hT, ⌘, ( ) i hT , ⌘, ( )# i
93. モナド on Coq モナド with P.L.
op
:C ! Cat
= hT , ⌘, µi
Kl(T ) Kl(T )
#
hT, ⌘, ( ) i = hT , ⌘, ( )# i
94. モナド on Coq モナド with P.L.
op
:C ! Cat
= hT , ⌘, µi
Kl(T ) Kl(T )
# #
hT, ⌘, ( ) i h(T, ⌧ ), (⌘, ✓), (( ) , [ ? ])i = hT , ⌘, ( )# i
95. モナド on Coq モナド with P.L.
op
:C ! Cat
hT, ⌘, µ, ⌧, ✓, ⌫i = hT , ⌘, µi
Kl(T ) Kl(T )
# #
hT, ⌘, ( ) i h(T, ⌧ ), (⌘, ✓), (( ) , [ ? ])i = hT , ⌘, ( )# i
96. モナド on Coq モナド with P.L.
op
:C ! Cat
hT, ⌘, µ, ⌧, ✓, ⌫i = hT , ⌘, µi
Kl(T ) Kl(T )
# #
hT, ⌘, ( ) i hT, ⌘, ( ) , ⌧, ✓, [ ? ]i = hT , ⌘, ( )# i
97. モナド on Coq モナド with P.L.
op
:C ! Cat
hT, ⌘, µ, ⌧, ✓, ⌫i = hT , ⌘, µi
Kl(T ) Kl(T )
# #
hT, ⌘, ( ) i hT, ⌘, ( ) , ⌧, ✓, [ ? ]i = hT , ⌘, ( )# i
98. モナド with P.L. on Coq
モナド on Coq モナド with P.L.
op
:C ! Cat
hT, ⌘, µ, ⌧, ✓, ⌫i = hT , ⌘, µi
Kl(T ) Kl(T )
# #
hT, ⌘, ( ) i hT, ⌘, ( ) , ⌧, ✓, [ ? ]i = hT , ⌘, ( )# i
99. モナド with P.L. on Coq
モナド on Coq モナド with P.L.
op
:C ! Cat
hT, ⌘, µ, ⌧, ✓, ⌫i = hT , ⌘, µi
Kl(T ) Kl(T )
# #
hT, ⌘, ( ) i hT, ⌘, ( ) , ⌧, ✓, [ ? ]i = hT , ⌘, ( )# i
101. Kleisli TripleとP.L.
‣ 上のKleisli Triple hT , ⌘, ( )# i
- T , ⌘ はモナドのそれと同じ
#
R R
-( )#
:= {( ) : ((X, P ), T (Y, Q)) ! (T (X, P ), T (Y, Q
‣ Kleisli Triples with Predicate Liftings
- hT, ⌘, ( )# , ⌧, ✓, ( )⇧ i
• ( )⇧ := {( )⇧ : (X)(P, f ⇤ (⌧Y (Q))) ! (T X)(⌧X (P ), (f #
‣ splitness
- モナドとKleisli Tripleの対応から,次のようになる
p⇧ = ⌧x (p)
102. Kleisli TripleとP.L.
‣ 上のKleisli Triple hT , ⌘, ( )# i
- T , ⌘ はモナドのそれと同じ
# ⇧
- (f, p)#
:= (f , p )
‣ Kleisli Triples with Predicate Liftings
- hT, ⌘, ( )# , ⌧, ✓, ( )⇧ i
• ( )⇧ := {( )⇧ : (X)(P, f ⇤ (⌧Y (Q))) ! (T X)(⌧X (P ), (f #
‣ splitness
- モナドとKleisli Tripleの対応から,次のようになる
p⇧ = ⌧x (p)
103. Kleisli TripleとP.L.
‣ 上のKleisli Triple hT , ⌘, ( )# i
(f, p) : (X, P ) ! (T Y, ⌧Y (Q))
- T , ⌘ はモナドのそれと同じ
# ⇧
- (f, p)#
:= (f , p )
‣ Kleisli Triples with Predicate Liftings
- hT, ⌘, ( )# , ⌧, ✓, ( )⇧ i
• ( )⇧ := {( )⇧ : (X)(P, f ⇤ (⌧Y (Q))) ! (T X)(⌧X (P ), (f #
‣ splitness
- モナドとKleisli Tripleの対応から,次のようになる
p⇧ = ⌧x (p)
104. Kleisli TripleとP.L.
‣ 上のKleisli Triple hT , ⌘, ( )# i
(f, p) : (X, P ) ! (T Y, ⌧Y (Q))
- T , ⌘ はモナドのそれと同じ
# ⇧
- (f, p)#
:= (f , p )
‣ Kleisli Triples with Predicate Liftings
#(f # , p⇧ ) :⇧(T X, ⌧ (P )) ! (T Y, ⌧ (Q))
- hT, ⌘, ( ) , ⌧, ✓, ( ) i X Y
• ( )⇧ := {( )⇧ : (X)(P, f ⇤ (⌧Y (Q))) ! (T X)(⌧X (P ), (f #
‣ splitness
- モナドとKleisli Tripleの対応から,次のようになる
p⇧ = ⌧x (p)
105. Kleisli TripleとP.L.
‣ 上のKleisli Triple hT , ⌘, ( )# i
- T , ⌘ はモナドのそれと同じ
# ⇧
- (f, p)#
:= (f , p )
‣ Kleisli Triples with Predicate Liftings
- hT, ⌘, ( )# , ⌧, ✓, ( )⇧ i
• ( )⇧ := {( )⇧ : (X)(P, f ⇤ (⌧Y (Q))) ! (T X)(⌧X (P ), (f #
‣ splitness
- モナドとKleisli Tripleの対応から,次のようになる
p⇧ = ⌧x (p)
106. Kleisli TripleとP.L.
‣ 上のKleisli Triple hT , ⌘, ( )# i
- T , ⌘ はモナドのそれと同じ
# ⇧
- (f, p)#
:= (f , p )
‣ Kleisli Triples with Predicate Liftings
- hT, ⌘, ( )# , ⌧, ✓, ( )⇧ i
• p : P ! f ⇤ (⌧Y (Q)) 7! p⇧ : ⌧X (P ) ! (f # )⇤ (⌧Y (Q))
‣ splitness
- モナドとKleisli Tripleの対応から,次のようになる
p⇧ = ⌧x (p)
107. Kleisli TripleとP.L.
‣ 上のKleisli Triple hT , ⌘, ( )# i
- T , ⌘ はモナドのそれと同じ
?
# ⇧
- (f, p)#
:= (f , p )
‣ Kleisli Triples with Predicate Liftings
- hT, ⌘, ( )# , ⌧, ✓, ( )⇧ i
• p : P ! f ⇤ (⌧Y (Q)) 7! p⇧ : ⌧X (P ) ! (f # )⇤ (⌧Y (Q))
‣ splitness
- モナドとKleisli Tripleの対応から,次のようになる
p⇧ = ⌧x (p)
114. Kleisli Triple with P.L. が満たす等式
hT, ⌘, ( )# , ⌧, ✓, ( )⇧ i
#
f ⌘X = f
#
⌘X = idT X
# # # #
g f = (g f)
115. Kleisli Triple with P.L. が満たす等式
hT, ⌘, ( )# , ⌧, ✓, ( )⇧ i
f #
⌘X = f (⌘X )(p⇧ ) ✓X,P = p
#
⌘X = idT X
# # # #
g f = (g f)
116. Kleisli Triple with P.L. が満たす等式
hT, ⌘, ( )# , ⌧, ✓, ( )⇧ i
f #
⌘X = f (⌘X )(p⇧ ) ✓X,P = p
# ⇧
⌘X = idT X ✓X,P = id⌧X (P )
# # # #
g f = (g f)
117. Kleisli Triple with P.L. が満たす等式
hT, ⌘, ( )# , ⌧, ✓, ( )⇧ i
f #
⌘X = f (⌘X )(p⇧ ) ✓X,P = p
# ⇧
⌘X = idT X ✓X,P = id⌧X (P )
# # # # # ⇧ ⇧ ⇧ ⇧
g f = (g f) (f )(q ) p = ( (f )(q ) p)
118. Kleisli Triple with P.L. が満たす等式
hT, ⌘, ( )# , ⌧, ✓, ( )⇧ i
f #
⌘X = f (⌘X )(p⇧ ) ✓X,P = p
# ⇧
⌘X = idT X ✓X,P = id⌧X (P )
# # # # # ⇧ ⇧ ⇧ ⇧
g f = (g f) (f )(q ) p = ( (f )(q ) p)
120. splitness #
f = µT Tf
# ⇧
(f , p ) = (µT , ⌫Y,Q ) (T f, ⌧X (p))
121. splitness #
f = µT Tf
# ⇧
(f , p ) = (µT , ⌫Y,Q ) (T f, ⌧X (p))
# ⇧
(f , p ) = (µT T f, (T f )(⌫Y,Q ) ⌧X (p))
122. splitness #
f = µT Tf
# ⇧
(f , p ) = (µT , ⌫Y,Q ) (T f, ⌧X (p))
# ⇧
(f , p ) = (µT T f, (T f )(⌫Y,Q ) ⌧X (p))
⇧
p = (T f )(⌫Y,Q ) ⌧X (p)
123. splitness #
f = µT Tf
# ⇧
(f , p ) = (µT , ⌫Y,Q ) (T f, ⌧X (p))
# ⇧
(f , p ) = (µT T f, (T f )(⌫Y,Q ) ⌧X (p))
⇧
p = (T f )(⌫Y,Q ) ⌧X (p)
⌫Y,Q = id⌧T Y (⌧Y (Q))
124. splitness #
f = µT Tf
# ⇧
(f , p ) = (µT , ⌫Y,Q ) (T f, ⌧X (p))
# ⇧
(f , p ) = (µT T f, (T f )(⌫Y,Q ) ⌧X (p))
⌫Y,Q = id⌧T Y (⌧Y (Q))
⇧
p = (T f )(⌫Y,Q ) ⌧X (p)
125. splitness #
f = µT Tf
# ⇧
(f , p ) = (µT , ⌫Y,Q ) (T f, ⌧X (p))
# ⇧
(f , p ) = (µT T f, (T f )(⌫Y,Q ) ⌧X (p))
⌫Y,Q = id⌧T Y (⌧Y (Q))
p⇧ = ⌧X (p)
126. splitness #
f = µT Tf
# ⇧
(f , p ) = (µT , ⌫Y,Q ) (T f, ⌧X (p))
# ⇧
(f , p ) = (µT T f, (T f )(⌫Y,Q ) ⌧X (p))
127. splitness #
µX = idT X
# ⇧
(f , p ) = (µT , ⌫Y,Q ) (T f, ⌧X (p))
# ⇧
(f , p ) = (µT T f, (T f )(⌫Y,Q ) ⌧X (p))
128. splitness #
µX = idT X
(µX , ⌫X,P ) = (idT X , id⌧X (P ) )#
# ⇧
(f , p ) = (µT T f, (T f )(⌫Y,Q ) ⌧X (p))
129. splitness #
µX = idT X
(µX , ⌫X,P ) = (idT X , id⌧X (P ) )#
# ⇧
(µX , ⌫X,P ) = (idT X , id⌧X (P ) )
130. splitness #
µX = idT X
(µX , ⌫X,P ) = (idT X , id⌧X (P ) )#
# ⇧
(µX , ⌫X,P ) = (idT X , id⌧X (P ) )
⇧
⌫X,P = id⌧X (P )
131. splitness #
µX = idT X
(µX , ⌫X,P ) = (idT X , id⌧X (P ) )#
# ⇧
(µX , ⌫X,P ) = (idT X , id⌧X (P ) )
⇧
⌫X,P = id⌧X (P )
⇧
p = ⌧X (p)
132. splitness #
µX = idT X
(µX , ⌫X,P ) = (idT X , id⌧X (P ) )#
# ⇧
(µX , ⌫X,P ) = (idT X , id⌧X (P ) )
⇧
p = ⌧X (p)
⌫X,P = id⇧X (P )
⌧
133. splitness #
µX = idT X
(µX , ⌫X,P ) = (idT X , id⌧X (P ) )#
# ⇧
(µX , ⌫X,P ) = (idT X , id⌧X (P ) )
⇧
p = ⌧X (p)
⌫X,P = id⌧T X (⌧X (P ))
134. splitness #
µX = idT X
(µX , ⌫X,P ) = (idT X , id⌧X (P ) )#
# ⇧
(µX , ⌫X,P ) = (idT X , id⌧X (P ) )
135. splitness #
µX = idT X
(µX , ⌫X,P ) = (idT X , id⌧X (P ) )#
# ⇧
(µX , ⌫X,P ) = (idT X , id⌧X (P ) )
⇧
p = ⌧X (p) , ⌫X,P = id⌧T X (⌧X (P ))
136. P.L. on Coq
‣ 添字付圏 について
- 今回は,Kleisli Triples with Predicate Liftingsの一般的
な定義・実装を目指したので,反変函手とだけ仮定
- Moggiの論文に拠れば,述語として用いるなら添字付交
わり半束+αの性質を持つものとすべき
• 今後の課題
‣ PredLiftクラス
- モナドにPredicate Liftingを追加したサブクラス
⇧
• ✓, ( ) はクラスの持つべき性質として現れる
137. P.L. on Coq
‣ 添字付圏 について
- 今回は,Kleisli Triples with Predicate Liftingsの一般的
な定義・実装を目指したので,反変函手とだけ仮定
- Moggiの論文に拠れば,述語として用いるなら添字付交
わり半束+αの性質を持つものとすべき
• 今後の課題 ?
‣ PredLiftクラス
- モナドにPredicate Liftingを追加したサブクラス
⇧
• ✓, ( ) はクラスの持つべき性質として現れる
138. P.L. on Coq # ⇧
hT, ⌘, ( ) , ⌧, ✓, ( ) i
Class PLMonad `(monad: Monad)(gp: GPred): Type :=
{
(* predicate liftings *)
predlift {A: Set}: gpred A -> gpred (T A);
(* naturality of predlift *)
...
(* kleisli triple with predlift *)
ret_pl:
forall (A: Set)(P: gpred A),
P --> ret*[(predlift P)];
bind_pl:
forall (A B: Set)(f: A -> T B)(P: gpred A)(Q: gpred B),
(P --> f*[predlift Q]) ->
((predlift P) --> (bind f)*[(predlift Q)]);
(* monad law’s of pl *)
...
}.
139. P.L. on Coq # ⇧
hT, ⌘, ( ) , ⌧, ✓, ( ) i
Class PLMonad `(monad: Monad)(gp: GPred): Type :=
{
(* predicate liftings *)
predlift {A: Set}: gpred A -> gpred (T A);
(* naturality of predlift *)
...
(* kleisli triple with predlift *)
ret_pl:
forall (A: Set)(P: gpred A),
P --> ret*[(predlift P)];
bind_pl:
forall (A B: Set)(f: A -> T B)(P: gpred A)(Q: gpred B),
(P --> f*[predlift Q]) ->
((predlift P) --> (bind f)*[(predlift Q)]);
(* monad law’s of pl *)
...
}.
140. P.L. on Coq # ⇧
hT, ⌘, ( ) , ⌧, ✓, ( ) i
Class PLMonad `(monad: Monad)(gp: GPred): Type :=
{
(* predicate liftings *)
predlift {A: Set}: gpred A -> gpred (T A);
(* naturality of predlift *)
...
(* kleisli triple with predlift *)
ret_pl:
forall (A: Set)(P: gpred A),
P --> ret*[(predlift P)];
bind_pl:
forall (A B: Set)(f: A -> T B)(P: gpred A)(Q: gpred B),
(P --> f*[predlift Q]) ->
((predlift P) --> (bind f)*[(predlift Q)]);
(* monad law’s of pl *)
...
}.
141. P.L. on Coq # ⇧
hT, ⌘, ( ) , ⌧, ✓, ( ) i
Class PLMonad `(monad: Monad)(gp: GPred): Type :=
{
(* predicate liftings *)
predlift {A: Set}: gpred A -> gpred (T A);
(* naturality of predlift *)
...
(* kleisli triple with predlift *)
ret_pl:
forall (A: Set)(P: gpred A),
P --> ret*[(predlift P)];
bind_pl:
forall (A B: Set)(f: A -> T B)(P: gpred A)(Q: gpred B),
(P --> f*[predlift Q]) ->
((predlift P) --> (bind f)*[(predlift Q)]);
(* monad law’s of pl *)
...
}.
142. P.L. on Coq # ⇧
hT, ⌘, ( ) , ⌧, ✓, ( ) i
Class PLMonad `(monad: Monad)(gp: GPred): Type :=
{
(* predicate liftings *)
predlift {A: Set}: gpred A -> gpred (T A);
(* naturality of predlift *)
...
(* kleisli triple with predlift *)
ret_pl:
forall (A: Set)(P: gpred A),
P --> ret*[(predlift P)];
bind_pl:
forall (A B: Set)(f: A -> T B)(P: gpred A)(Q: gpred B),
(P --> f*[predlift Q]) ->
((predlift P) --> (bind f)*[(predlift Q)]);
(* monad law’s of pl *)
...
}.
143. P.L. on Coq # ⇧
hT, ⌘, ( ) , ⌧, ✓, ( ) i
Class PLMonad `(monad: Monad)(gp: GPred): Type :=
{
(* predicate liftings *)
predlift {A: Set}: gpred A -> gpred (T A);
(* naturality of predlift *)
...
(* kleisli triple with predlift *)
ret_pl:
forall (A: Set)(P: gpred A),
P --> ret*[(predlift P)];
bind_pl:
forall (A B: Set)(f: A -> T B)(P: gpred A)(Q: gpred B),
(P --> f*[predlift Q]) ->
((predlift P) --> (bind f)*[(predlift Q)]);
(* monad law’s of pl *)
...
}.
144. P.L. on Coq # ⇧
hT, ⌘, ( ) , ⌧, ✓, ( ) i
Class PLMonad `(monad: Monad)(gp: GPred): Type :=
{
(* predicate liftings *)
predlift {A: Set}: gpred A -> gpred (T A);
(* naturality of predlift *)
...
(* kleisli triple with predlift *)
ret_pl:
forall (A: Set)(P: gpred A),
P --> ret*[(predlift P)];
bind_pl:
forall (A B: Set)(f: A -> T B)(P: gpred A)(Q: gpred B),
(P --> f*[predlift Q]) ->
((predlift P) --> (bind f)*[(predlift Q)]);
(* monad law’s of pl *)
...
}.
145. P.L. on Coq # ⇧
hT, ⌘, ( ) , ⌧, ✓, ( ) i
Class PLMonad `(monad: Monad)(gp: GPred): Type :=
{
(* predicate liftings *)
predlift {A: Set}: gpred A -> gpred (T A);
(* naturality of predlift *)
...
(* kleisli triple with predlift *)
ret_pl:
forall (A: Set)(P: gpred A),
P --> ret*[(predlift P)];
bind_pl:
forall (A B: Set)(f: A -> T B)(P: gpred A)(Q: gpred B),
(P --> f*[predlift Q]) ->
((predlift P) --> (bind f)*[(predlift Q)]);
(* monad law’s of pl *)
...
}.
146. P.L. on Coq # ⇧
hT, ⌘, ( ) , ⌧, ✓, ( ) i
Class PLMonad `(monad: Monad)(gp: GPred): Type :=
{
(* predicate liftings *)
predlift {A: Set}: gpred A -> gpred (T A);
(* naturality of predlift *)
...
(* kleisli triple with predlift *)
ret_pl:
forall (A: Set)(P: gpred A),
P --> ret*[(predlift P)];
bind_pl:
forall (A B: Set)(f: A -> T B)(P: gpred A)(Q: gpred B),
(P --> f*[predlift Q]) ->
((predlift P) --> (bind f)*[(predlift Q)]);
(* monad law’s of pl *)
...
}.
147. splitness on Coq
Context `(plm: PLMonad).
(* splitness of monad *)
Definition ret_pl_splitness :=
forall (A: Set)(P: gpred A),
ret*[(predlift P)] --> P.
Definition bind_pl_splitness :=
forall (A B: Set)(f: A -> T B)(P: gpred A)(Q: gpred B),
predlift P --> (bind f)*[(predlift Q)] <->
predlift P --> predlift (f*[(predlift Q)]).
Definition is_split := ret_pl_splitness/bind_pl_splitness.
148. splitness on Coq
Context `(plm: PLMonad).
(* splitness of monad *)
Definition ret_pl_splitness :=
forall (A: Set)(P: gpred A),
ret*[(predlift P)] --> P.
Definition bind_pl_splitness :=
forall (A B: Set)(f: A -> T B)(P: gpred A)(Q: gpred B),
predlift P --> (bind f)*[(predlift Q)] <->
predlift P --> predlift (f*[(predlift Q)]).
Definition is_split := ret_pl_splitness/bind_pl_splitness.
149. splitness on Coq
Context `(plm: PLMonad).
(* splitness of monad *)
Definition ret_pl_splitness :=
forall (A: Set)(P: gpred A),
ret*[(predlift P)] --> P.
Definition bind_pl_splitness :=
forall (A B: Set)(f: A -> T B)(P: gpred A)(Q: gpred B),
predlift P --> (bind f)*[(predlift Q)] <->
predlift P --> predlift (f*[(predlift Q)]).
Definition is_split := ret_pl_splitness/bind_pl_splitness.
150. splitness on Coq
Context `(plm: PLMonad).
(* splitness of monad *)
Definition ret_pl_splitness :=
forall (A: Set)(P: gpred A),
ret*[(predlift P)] --> P.
Definition bind_pl_splitness :=
forall (A B: Set)(f: A -> T B)(P: gpred A)(Q: gpred B),
predlift P --> (bind f)*[(predlift Q)] <->
predlift P --> predlift (f*[(predlift Q)]).
Definition is_split := ret_pl_splitness/bind_pl_splitness.
151. splitness on Coq
Context `(plm: PLMonad).
(* splitness of monad *)
Definition ret_pl_splitness :=
forall (A: Set)(P: gpred A),
ret*[(predlift P)] --> P.
Definition bind_pl_splitness :=
forall (A B: Set)(f: A -> T B)(P: gpred A)(Q: gpred B),
predlift P --> (bind f)*[(predlift Q)] <->
predlift P --> predlift (f*[(predlift Q)]).
Definition is_split := ret_pl_splitness/bind_pl_splitness.
154. できたこと
‣ Coq上でPredicate Liftingを定義
- Kleisli Triples with Predicate Liftings
- Kleisli Tripleのsplitnessの導出と実装
- 具体例の実装
• Maybeモナド with P.L. や Stateモナド with P.L.
• MonadStateに関するホーアトリプル
155. 課題と考察
‣ モナド則やsplitnessのCoqに於ける記述方法
- 記述する必要が可能性も
- Proof IrrelevanceとPredicate Lifting
‣ 強モナド,Predicate Lifting,Kleisli Triple
- これらの間の関連の議論がまだまだ出来ていない
‣ 述語 の取扱について
- 添字付交わり半束+αに制限するべきか
‣ 実装に至るまでに用いた性質の証明をCoqで
- 余裕があれば
158. モノイダル圏
‣ モノイダル圏
- 圏 ,双函手 ,対象 からなる組
- 結合律
- 単位元律
圏Cの自己函手からなる圏はモノイダル圏
‣ 対象モノイダル圏
C上のモナドとは,この圏のモノイド対象
- 積が可換 なモノイダル圏
‣ モノイド対象
- モノイダル圏の対象で, 演算 と 単位元 を与える自然変
換を伴い,それらが モノイドの公理 を満たすもの