Your SlideShare is downloading. ×
0
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Tpp2012 mwpl on_coq

398

Published on

本来のページ数は41です.つまり7割ほどはアニメーションのせいで膨れ上がったものです.Grothendieck構成の仕業です. …

本来のページ数は41です.つまり7割ほどはアニメーションのせいで膨れ上がったものです.Grothendieck構成の仕業です.

ソースコードはまだ公開していません.ご了承ください.

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
398
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
1
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. TPP 2012 at Chiba, Nov 21, 2012 Coq に於けるMonads with Predicate Liftings の実装と考察 千葉大学大学院 理学研究科 須田 啓司
  • 2. 正確にはKleisli Triples with Predicate Liftings の実装です
  • 3. 各々の道具の中身よりもそれらの関係性に重点を置きます
  • 4. op :C ! Cat hT, ⌘, µ, ⌧, ✓, ⌫i hT , ⌘, µi 各々の道具の中身よりも それらの関係性に重点を置きます Kl(T ) Kl(T ) # # ⇧hT, ⌘, ( ) i hT, ⌘, ( ) , ⌧, ✓, ( ) i hT , ⌘, ( )# i
  • 5. 各々の道具の中身よりもそれらの関係性に重点を置きます
  • 6. はじめに
  • 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 }.
  • 13. モナドと推論‣ 等式推論では- プログラムmと,性質Pを満たすことが 容易にわかる プ ログラムnとの間の等価性を示す.- 間接的な方法‣ 述語を使いたい- プログラムmが性質Pを満たす という形の直接的記述 • 特に,bind記法に倣って次のように書きたい. x m; (P x)
  • 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圏(や代数)の述語の圏を構成
  • 17. 流れ圏論的準備- モナドやKleisli圏,添字付圏などPredicate Liftingの定義- 函手,モナドとPredicate LiftingGrothendieck構成とPredicate Lifting- 述語の圏 の構成Kleisli Triples with Predicate Liftings- Coqで実装するための議論と結果
  • 18. 圏論的準備
  • 19. Kleisli Triple‣ 圏C上のKleisli Triple - 次のものからなる三つ組 hT, ⌘, ( )# i • 対象の割り当て • 射の族 • 射の族 - これらは以下の等式を満たす‣ HaskellやCoqのモナドクラスの実体はこれ
  • 20. モナド‣ 圏C上のモナド - 自己函手と2つの自然変換からなる三つ組 - 次の図式を可換にする(モナド則)‣ Kleisli Tripleと同値 - として互いを構成可能
  • 21. Kleisli圏‣ モナドTのKleisli圏Kl(T) - 圏C上のモナド    から以下のように構成する • 対象は圏Cの対象と同じ • 射      はCの射 •            の合成射はCの射 • 恒等射は • 圏の公理はモナド則によって与えられる - プログラムはKleisli圏の射として解釈される
  • 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) • 
  • 25. ここまでに出てきたもの op :C ! Cat Kl(T ) # hT, ⌘, ( ) i
  • 26. Predicate Liftingの定義
  • 27. 函手とP.L.‣ Functors with Predicate Liftings - IndCatに於ける自己射       のこと -       をpredicate liftingと呼ぶ • X上の述語     をFX上の述語         に
  • 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 )) =
  • 32. モナド with P.L. のモナド則
  • 33. モナド with P.L. のモナド則
  • 34. モナド with P.L. のモナド則 µX ⌘T X = idT X
  • 35. モナド with P.L. のモナド則 µX ⌘T X = idT X µX T ⌘X = idT X
  • 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
  • 43. ここまでに出てきたもの op :C ! Cat Kl(T ) # hT, ⌘, ( ) i
  • 44. Grothendieck構成と Predicate Lifting
  • 45. Grothendieck構成‣ 添字付圏 から新たな圏  を作る- 対象は の組- 射は              の組- 合成は
  • 46. Grothendieck構成
  • 47. Grothendieck構成
  • 48. Grothendieck構成
  • 49. Grothendieck構成
  • 50. Grothendieck構成
  • 51. Grothendieck構成 op :C ! Cat
  • 52. Grothendieck構成 op :C ! Cat
  • 53. Grothendieck構成 op :C ! Cat
  • 54. Grothendieck構成 op :C ! Cat
  • 55. Grothendieck構成 op :C ! Cat
  • 56. Grothendieck構成 op :C ! Cat
  • 57. Grothendieck構成 op :C ! Cat
  • 58. Grothendieck構成 op :C ! Cat
  • 59. Grothendieck構成 op :C ! Cat
  • 60. Grothendieck構成 op :C ! Cat
  • 61. Grothendieck構成 op :C ! Cat
  • 62. Grothendieck構成 op :C ! Cat
  • 63. Grothendieck構成 op :C ! Cat
  • 64. Grothendieck構成 op :C ! Cat
  • 65. Grothendieck構成 op :C ! Cat
  • 66. Grothendieck構成 op :C ! Cat
  • 67. Grothendieck構成 op :C ! Cat
  • 68. Grothendieck構成 op :C ! Cat
  • 69. Grothendieck構成 op :C ! Cat
  • 70. Grothendieck構成 op :C ! Cat
  • 71. Grothendieck構成に於ける射の合成
  • 72. Grothendieck構成に於ける射の合成
  • 73. Grothendieck構成に於ける射の合成
  • 74. Grothendieck構成に於ける射の合成
  • 75. Grothendieck構成に於ける射の合成
  • 76. Grothendieck構成に於ける射の合成
  • 77. Grothendieck構成に於ける射の合成
  • 78. Grothendieck構成に於ける射の合成
  • 79. Grothendieck構成に於ける射の合成
  • 80. Grothendieck構成に於ける射の合成
  • 81. Grothendieck構成に於ける射の合成
  • 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
  • 100. Kleisli Triples withPredicate Liftings
  • 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)
  • 108. Kleisli Triple with P.L. が満たす等式
  • 109. Kleisli Triple with P.L. が満たす等式 hT, ⌘, ( )# i
  • 110. Kleisli Triple with P.L. が満たす等式 hT, ⌘, ( )# i # f ⌘X = f
  • 111. Kleisli Triple with P.L. が満たす等式 hT, ⌘, ( )# i # f ⌘X = f # ⌘X = idT X
  • 112. Kleisli Triple with P.L. が満たす等式 hT, ⌘, ( )# i # f ⌘X = f # ⌘X = idT X # # # # g f = (g f)
  • 113. Kleisli Triple with P.L. が満たす等式 hT, ⌘, ( )# i # f ⌘X = f # ⌘X = idT X # # # # g f = (g f)
  • 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)
  • 119. splitness # f = µT Tf
  • 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.
  • 152. 実装例‣ 直接ソースコードをお見せします
  • 153. まとめ
  • 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で - 余裕があれば
  • 156. 補足など
  • 157. モノイダル圏‣ モノイダル圏- 圏 ,双函手       ,対象   からなる組- 結合律- 単位元律‣ 対象モノイダル圏- 積が可換 なモノイダル圏‣ モノイド対象- モノイダル圏の対象で, 演算 と 単位元 を与える自然変 換を伴い,それらが モノイドの公理 を満たすもの
  • 158. モノイダル圏‣ モノイダル圏- 圏 ,双函手       ,対象   からなる組- 結合律- 単位元律 圏Cの自己函手からなる圏はモノイダル圏‣ 対象モノイダル圏 C上のモナドとは,この圏のモノイド対象- 積が可換 なモノイダル圏‣ モノイド対象- モノイダル圏の対象で, 演算 と 単位元 を与える自然変 換を伴い,それらが モノイドの公理 を満たすもの

×