TPP 2012 at Chiba, Nov 21, 2012       Coq に於けるMonads with Predicate Liftings       の実装と考察      千葉大学大学院 理学研究科 須田 啓司
正確にはKleisli Triples with Predicate Liftings                の実装です
各々の道具の中身よりもそれらの関係性に重点を置きます
op                     :C        ! Cat                  hT, ⌘, µ, ⌧, ✓, ⌫i        hT , ⌘, µi       各々の道具の中身よりも     それらの関係性...
各々の道具の中身よりもそれらの関係性に重点を置きます
はじめに
モナド on Coq‣ 関数型プログラミングの文脈に於けるモナド- 手続き的にプログラムを記述するための枠組み- 計算効果を統一的に扱うことを可能にする‣ 型クラスとしてのモナド- 型変換子Tでパラメタライズされた型クラス- モナド則をメンバと...
Record TypeModifier: Type := {   tm_modify :> Set -> Set;   tm_equivalence {A: Set}: Equivalence (tm_modify A) }.Notation "...
Record TypeModifier: Type := {   tm_modify :> Set -> Set;   tm_equivalence {A: Set}: Equivalence (tm_modify A) }.Notation "...
Record TypeModifier: Type := {   tm_modify :> Set -> Set;   tm_equivalence {A: Set}: Equivalence (tm_modify A) }.Notation "...
Record TypeModifier: Type := {   tm_modify :> Set -> Set;   tm_equivalence {A: Set}: Equivalence (tm_modify A) }.Notation "...
Record TypeModifier: Type := {   tm_modify :> Set -> Set;   tm_equivalence {A: Set}: Equivalence (tm_modify A) }.Notation "...
モナドと推論‣ 等式推論では- プログラムmと,性質Pを満たすことが 容易にわかる プ ログラムnとの間の等価性を示す.- 間接的な方法‣ 述語を使いたい- プログラムmが性質Pを満たす という形の直接的記述 • 特に,bind記法に倣って次の...
モナドと述語論理‣ (圏論的な)モナドと述語論理に関する研究- Evaluation Logic. A.M.Pitts. 1990. • 計算型付ラムダ計算を,その上の述語論理へ拡張- A Semantics for Evaluation Lo...
モナドと述語論理‣ (圏論的な)モナドと述語論理に関する研究- Evaluation Logic. A.M.Pitts. 1990. • 計算型付ラムダ計算を,その上の述語論理へ拡張- A Semantics for Evaluation Lo...
モナドと述語論理‣ (圏論的な)モナドと述語論理に関する研究- Evaluation Logic. A.M.Pitts. 1990. • 計算型付ラムダ計算を,その上の述語論理へ拡張Kleisli Tripleの言葉に言い換え,- A Sema...
流れ圏論的準備- モナドやKleisli圏,添字付圏などPredicate Liftingの定義- 函手,モナドとPredicate LiftingGrothendieck構成とPredicate Lifting- 述語の圏 の構成Kleisl...
圏論的準備
Kleisli Triple‣ 圏C上のKleisli Triple - 次のものからなる三つ組 hT, ⌘, ( )# i  • 対象の割り当て  • 射の族  • 射の族 - これらは以下の等式を満たす‣ HaskellやCoqのモナドクラ...
モナド‣ 圏C上のモナド - 自己函手と2つの自然変換からなる三つ組 - 次の図式を可換にする(モナド則)‣ Kleisli Tripleと同値 -                    として互いを構成可能
Kleisli圏‣ モナドTのKleisli圏Kl(T) - 圏C上のモナド    から以下のように構成する  • 対象は圏Cの対象と同じ  • 射      はCの射  •            の合成射はCの射  • 恒等射は  • 圏の公...
添字付圏‣ 添字付圏         : C op ! Cat - 例えば‣ 圏IndCat - 添字付圏全体からなる2-圏 - 射(1-cell)  •  - 射の変換(2-cell)  • 
添字付圏‣ 添字付圏         : C op ! Cat - 例えば‣ 圏IndCat - 添字付圏全体からなる2-圏 - 射(1-cell)  •  - 射の変換(2-cell)  • 
添字付圏‣ 添字付圏         : C op ! Cat - 例えば‣ 圏IndCat - 添字付圏全体からなる2-圏 - 射(1-cell)  •  - 射の変換(2-cell)  • 
ここまでに出てきたもの                     op                :C        ! Cat   Kl(T )            # hT, ⌘, ( ) i
Predicate Liftingの定義
函手とP.L.‣ Functors with Predicate Liftings - IndCatに於ける自己射       のこと -       をpredicate liftingと呼ぶ   • X上の述語     をFX上の述語   ...
函手とP.L.‣ Functors with Predicate Liftings - IndCatに於ける自己射       のこと -       をpredicate liftingと呼ぶ   • X上の述語     をFX上の述語   ...
函手とP.L.‣ Functors with Predicate Liftings - IndCatに於ける自己射       のこと -       をpredicate liftingと呼ぶ   • X上の述語     をFX上の述語   ...
モナドとP.L.‣ Monads with Predicate Liftings - IndCatの自己射(1-cell)と2つの2-cellからなる三つ組   •  - Predicate Liftingのsplitness   •    が...
モナドとP.L.‣ Monads with Predicate Liftings - IndCatの自己射(1-cell)と2つの2-cellからなる三つ組   •         T : C ! C, ⌧ : ) T        ⌘ : I...
モナド with P.L. のモナド則
モナド with P.L. のモナド則
モナド with P.L. のモナド則               µX     ⌘T X = idT X
モナド with P.L. のモナド則               µX     ⌘T X = idT X               µX     T ⌘X = idT X
モナド with P.L. のモナド則               µX     ⌘T X = idT X               µX     T ⌘X = idT X              µX   µT X = µX    T µX
モナド with P.L. のモナド則               µX     ⌘T X = idT X               µX     T ⌘X = idT X              µX   µT X = µX    T µX
モナド with P.L. のモナド則               µX     ⌘T X = idT X               µX     T ⌘X = idT X              µX   µT X = µX    T µX
モナド with P.L. のモナド則                µX    ⌘T X = idT X                µX    T ⌘X = idT X              µX   µT X = µX    T µ...
モナド with P.L. のモナド則                µX    ⌘T X = idT X                µX    T ⌘X = idT X              µX   µT X = µX     T ...
モナド with P.L. のモナド則                      µX    ⌘T X = idT X                      µX   T ⌘X = idT X                    µX  ...
モナド with P.L. のモナド則                      µX    ⌘T X = idT X                      µX   T ⌘X = idT X                    µX  ...
ここまでに出てきたもの                     op                :C        ! Cat   Kl(T )            # hT, ⌘, ( ) i
Grothendieck構成と Predicate Lifting
Grothendieck構成‣ 添字付圏     から新たな圏  を作る- 対象は        の組- 射は              の組- 合成は
Grothendieck構成
Grothendieck構成
Grothendieck構成
Grothendieck構成
Grothendieck構成
Grothendieck構成                      op                 :C        ! Cat
Grothendieck構成                      op                 :C        ! Cat
Grothendieck構成                      op                 :C        ! Cat
Grothendieck構成                      op                 :C        ! Cat
Grothendieck構成                      op                 :C        ! Cat
Grothendieck構成                      op                 :C        ! Cat
Grothendieck構成                      op                 :C        ! Cat
Grothendieck構成                      op                 :C        ! Cat
Grothendieck構成                      op                 :C        ! Cat
Grothendieck構成                      op                 :C        ! Cat
Grothendieck構成                      op                 :C        ! Cat
Grothendieck構成                      op                 :C        ! Cat
Grothendieck構成                      op                 :C        ! Cat
Grothendieck構成                      op                 :C        ! Cat
Grothendieck構成                      op                 :C        ! Cat
Grothendieck構成                      op                 :C        ! Cat
Grothendieck構成                      op                 :C        ! Cat
Grothendieck構成                      op                 :C        ! Cat
Grothendieck構成                      op                 :C        ! Cat
Grothendieck構成                      op                 :C        ! Cat
Grothendieck構成に於ける射の合成
Grothendieck構成に於ける射の合成
Grothendieck構成に於ける射の合成
Grothendieck構成に於ける射の合成
Grothendieck構成に於ける射の合成
Grothendieck構成に於ける射の合成
Grothendieck構成に於ける射の合成
Grothendieck構成に於ける射の合成
Grothendieck構成に於ける射の合成
Grothendieck構成に於ける射の合成
Grothendieck構成に於ける射の合成
X with P.L. = X‣ 函手 with P.L. は   上の函手                           R     R -            から函手 F :         !     が定まる         ...
“モナド”達の関連                            op                       :C        ! Cat       モノイダル圏                      モノイド対象    ...
Kleisli添字付圏‣ 反変函手    - splitなモナド with P.L.          の下で     •      •    - 函手性の証明にsplitnessが要る‣    - Kleisli圏 Kl(T ) についての ...
ここまでに出てきたもの                     op                :C        ! Cat                                  hT , ⌘, µi   Kl(T )    ...
op               :C        ! Cat                                 hT , ⌘, µi  Kl(T )                          Kl(T )       ...
op               :C        ! Cat                                 hT , ⌘, µi  Kl(T )                          Kl(T )       ...
モナド on Coq                    op               :C        ! Cat                                 hT , ⌘, µi  Kl(T )         ...
モナド on Coq                    op               :C        ! Cat                                 hT , ⌘, µi  Kl(T )         ...
モナド on Coq     モナド with P.L.                    op               :C        ! Cat                                 hT , ⌘, µ...
モナド on Coq     モナド with P.L.                    op               :C        ! Cat                                  hT , ⌘, ...
モナド on Coq     モナド with P.L.                    op               :C        ! Cat                                 =    hT ,...
モナド on Coq     モナド with P.L.                    op               :C        ! Cat                                 =   hT , ...
モナド on Coq              モナド with P.L.                             op                        :C        ! Cat               ...
モナド on Coq              モナド with P.L.                             op                        :C        ! Cat               ...
モナド on Coq           モナド with P.L.                          op                     :C        ! Cat                  hT, ⌘,...
モナド on Coq           モナド with P.L.                          op                     :C        ! Cat                  hT, ⌘,...
モナド with P.L. on Coqモナド on Coq            モナド with P.L.                           op                      :C        ! Cat ...
モナド with P.L. on Coqモナド on Coq            モナド with P.L.                           op                      :C        ! Cat ...
Kleisli Triples withPredicate Liftings
Kleisli TripleとP.L.‣        上のKleisli Triple hT , ⌘, ( )# i    - T , ⌘ はモナドのそれと同じ                     #                   ...
Kleisli TripleとP.L.‣        上のKleisli Triple hT , ⌘, ( )# i    - T , ⌘ はモナドのそれと同じ                    #   ⇧    -   (f, p)# ...
Kleisli TripleとP.L.‣       上のKleisli Triple hT , ⌘, ( )# i       (f, p) : (X, P ) ! (T Y, ⌧Y (Q))    - T , ⌘ はモナドのそれと同じ   ...
Kleisli TripleとP.L.‣       上のKleisli Triple hT , ⌘, ( )# i       (f, p) : (X, P ) ! (T Y, ⌧Y (Q))    - T , ⌘ はモナドのそれと同じ   ...
Kleisli TripleとP.L.‣        上のKleisli Triple hT , ⌘, ( )# i    - T , ⌘ はモナドのそれと同じ                    #   ⇧    -   (f, p)# ...
Kleisli TripleとP.L.‣        上のKleisli Triple hT , ⌘, ( )# i    - T , ⌘ はモナドのそれと同じ                    #   ⇧    -   (f, p)# ...
Kleisli TripleとP.L.‣        上のKleisli Triple hT , ⌘, ( )# i    - T , ⌘ はモナドのそれと同じ                              ?          ...
Kleisli Triple with P.L. が満たす等式
Kleisli Triple with P.L. が満たす等式      hT, ⌘, ( )# i
Kleisli Triple with P.L. が満たす等式      hT, ⌘, ( )# i         #     f       ⌘X = f
Kleisli Triple with P.L. が満たす等式      hT, ⌘, ( )# i         #     f       ⌘X = f       #      ⌘X     = idT X
Kleisli Triple with P.L. が満たす等式          hT, ⌘, ( )# i              #          f       ⌘X = f           #          ⌘X     ...
Kleisli Triple with P.L. が満たす等式          hT, ⌘, ( )# i              #          f       ⌘X = f           #          ⌘X     ...
Kleisli Triple with P.L. が満たす等式                              hT, ⌘, ( )# , ⌧, ✓, ( )⇧ i              #          f       ⌘X...
Kleisli Triple with P.L. が満たす等式                              hT, ⌘, ( )# , ⌧, ✓, ( )⇧ i          f   #                  ⌘X...
Kleisli Triple with P.L. が満たす等式                              hT, ⌘, ( )# , ⌧, ✓, ( )⇧ i          f   #                  ⌘X...
Kleisli Triple with P.L. が満たす等式                              hT, ⌘, ( )# , ⌧, ✓, ( )⇧ i          f   #                  ⌘X...
Kleisli Triple with P.L. が満たす等式                              hT, ⌘, ( )# , ⌧, ✓, ( )⇧ i          f   #                  ⌘X...
splitness       #            f       = µT   Tf
splitness                 #                      f       = µT   Tf              #   ⇧            (f , p ) = (µT , ⌫Y,Q ) (...
splitness                       #                            f       = µT    Tf                    #   ⇧                  ...
splitness                         #                              f       = µT    Tf                    #   ⇧              ...
splitness                         #                              f       = µT    Tf                    #   ⇧              ...
splitness                         #                              f       = µT    Tf                    #   ⇧              ...
splitness                         #                              f       = µT    Tf                    #   ⇧              ...
splitness                       #                            f       = µT    Tf                    #   ⇧                  ...
splitness                              #                              µX =   idT X                    #   ⇧               ...
splitness                             #                             µX =   idT X                  (µX , ⌫X,P ) = (idT X , ...
splitness                        #                       µX =    idT X            (µX , ⌫X,P ) = (idT X , id⌧X (P ) )#    ...
splitness                        #                       µX =    idT X            (µX , ⌫X,P ) = (idT X , id⌧X (P ) )#    ...
splitness                        #                       µX =    idT X            (µX , ⌫X,P ) = (idT X , id⌧X (P ) )#    ...
splitness                        #                       µX =    idT X            (µX , ⌫X,P ) = (idT X , id⌧X (P ) )#    ...
splitness                        #                       µX =    idT X            (µX , ⌫X,P ) = (idT X , id⌧X (P ) )#    ...
splitness                        #                       µX =    idT X            (µX , ⌫X,P ) = (idT X , id⌧X (P ) )#    ...
splitness                            #                          µX =     idT X             (µX , ⌫X,P ) = (idT X , id⌧X (P...
P.L. on Coq‣ 添字付圏 について - 今回は,Kleisli Triples with Predicate Liftingsの一般的   な定義・実装を目指したので,反変函手とだけ仮定 - Moggiの論文に拠れば,述語として用いる...
P.L. on Coq‣ 添字付圏 について - 今回は,Kleisli Triples with Predicate Liftingsの一般的   な定義・実装を目指したので,反変函手とだけ仮定 - Moggiの論文に拠れば,述語として用いる...
P.L. on Coq                                  #                ⇧                                   hT, ⌘, ( ) , ⌧, ✓, ( ) i...
P.L. on Coq                                  #                ⇧                                   hT, ⌘, ( ) , ⌧, ✓, ( ) i...
P.L. on Coq                                  #                ⇧                                   hT, ⌘, ( ) , ⌧, ✓, ( ) i...
P.L. on Coq                                  #                ⇧                                   hT, ⌘, ( ) , ⌧, ✓, ( ) i...
P.L. on Coq                                  #                ⇧                                   hT, ⌘, ( ) , ⌧, ✓, ( ) i...
P.L. on Coq                                  #                ⇧                                   hT, ⌘, ( ) , ⌧, ✓, ( ) i...
P.L. on Coq                                  #                ⇧                                   hT, ⌘, ( ) , ⌧, ✓, ( ) i...
P.L. on Coq                                  #                ⇧                                   hT, ⌘, ( ) , ⌧, ✓, ( ) i...
P.L. on Coq                                  #                ⇧                                   hT, ⌘, ( ) , ⌧, ✓, ( ) i...
splitness on Coq Context `(plm: PLMonad). (* splitness of monad *) Definition ret_pl_splitness :=   forall (A: Set)(P: gpre...
splitness on Coq Context `(plm: PLMonad). (* splitness of monad *) Definition ret_pl_splitness :=   forall (A: Set)(P: gpre...
splitness on Coq Context `(plm: PLMonad). (* splitness of monad *) Definition ret_pl_splitness :=   forall (A: Set)(P: gpre...
splitness on Coq Context `(plm: PLMonad). (* splitness of monad *) Definition ret_pl_splitness :=   forall (A: Set)(P: gpre...
splitness on Coq Context `(plm: PLMonad). (* splitness of monad *) Definition ret_pl_splitness :=   forall (A: Set)(P: gpre...
実装例‣ 直接ソースコードをお見せします
まとめ
できたこと‣ Coq上でPredicate Liftingを定義 - Kleisli Triples with Predicate Liftings - Kleisli Tripleのsplitnessの導出と実装 - 具体例の実装  • Ma...
課題と考察‣ モナド則やsplitnessのCoqに於ける記述方法 - 記述する必要が可能性も - Proof IrrelevanceとPredicate Lifting‣ 強モナド,Predicate Lifting,Kleisli Trip...
補足など
モノイダル圏‣ モノイダル圏- 圏 ,双函手       ,対象   からなる組- 結合律- 単位元律‣ 対象モノイダル圏- 積が可換 なモノイダル圏‣ モノイド対象- モノイダル圏の対象で, 演算 と 単位元 を与える自然変  換を伴い,それ...
モノイダル圏‣ モノイダル圏- 圏 ,双函手       ,対象   からなる組- 結合律- 単位元律     圏Cの自己函手からなる圏はモノイダル圏‣ 対象モノイダル圏     C上のモナドとは,この圏のモノイド対象- 積が可換 なモノイダル...
Upcoming SlideShare
Loading in …5
×

Tpp2012 mwpl on_coq

581 views
504 views

Published on

本来のページ数は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
581
On SlideShare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
2
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Tpp2012 mwpl on_coq

  1. 1. TPP 2012 at Chiba, Nov 21, 2012 Coq に於けるMonads with Predicate Liftings の実装と考察 千葉大学大学院 理学研究科 須田 啓司
  2. 2. 正確にはKleisli Triples with Predicate Liftings の実装です
  3. 3. 各々の道具の中身よりもそれらの関係性に重点を置きます
  4. 4. op :C ! Cat hT, ⌘, µ, ⌧, ✓, ⌫i hT , ⌘, µi 各々の道具の中身よりも それらの関係性に重点を置きます Kl(T ) Kl(T ) # # ⇧hT, ⌘, ( ) i hT, ⌘, ( ) , ⌧, ✓, ( ) i hT , ⌘, ( )# i
  5. 5. 各々の道具の中身よりもそれらの関係性に重点を置きます
  6. 6. はじめに
  7. 7. モナド on Coq‣ 関数型プログラミングの文脈に於けるモナド- 手続き的にプログラムを記述するための枠組み- 計算効果を統一的に扱うことを可能にする‣ 型クラスとしてのモナド- 型変換子Tでパラメタライズされた型クラス- モナド則をメンバとして持つ • モナドそのものを推論の対象と出来る- 個々の計算効果はモナドのサブクラスとして記述される • 失敗,状態,非決定性など
  8. 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. 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. 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. 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. 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. 13. モナドと推論‣ 等式推論では- プログラムmと,性質Pを満たすことが 容易にわかる プ ログラムnとの間の等価性を示す.- 間接的な方法‣ 述語を使いたい- プログラムmが性質Pを満たす という形の直接的記述 • 特に,bind記法に倣って次のように書きたい. x m; (P x)
  14. 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. 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. 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. 17. 流れ圏論的準備- モナドやKleisli圏,添字付圏などPredicate Liftingの定義- 函手,モナドとPredicate LiftingGrothendieck構成とPredicate Lifting- 述語の圏 の構成Kleisli Triples with Predicate Liftings- Coqで実装するための議論と結果
  18. 18. 圏論的準備
  19. 19. Kleisli Triple‣ 圏C上のKleisli Triple - 次のものからなる三つ組 hT, ⌘, ( )# i • 対象の割り当て • 射の族 • 射の族 - これらは以下の等式を満たす‣ HaskellやCoqのモナドクラスの実体はこれ
  20. 20. モナド‣ 圏C上のモナド - 自己函手と2つの自然変換からなる三つ組 - 次の図式を可換にする(モナド則)‣ Kleisli Tripleと同値 - として互いを構成可能
  21. 21. Kleisli圏‣ モナドTのKleisli圏Kl(T) - 圏C上のモナド    から以下のように構成する • 対象は圏Cの対象と同じ • 射      はCの射 •            の合成射はCの射 • 恒等射は • 圏の公理はモナド則によって与えられる - プログラムはKleisli圏の射として解釈される
  22. 22. 添字付圏‣ 添字付圏 : C op ! Cat - 例えば‣ 圏IndCat - 添字付圏全体からなる2-圏 - 射(1-cell) •  - 射の変換(2-cell) • 
  23. 23. 添字付圏‣ 添字付圏 : C op ! Cat - 例えば‣ 圏IndCat - 添字付圏全体からなる2-圏 - 射(1-cell) •  - 射の変換(2-cell) • 
  24. 24. 添字付圏‣ 添字付圏 : C op ! Cat - 例えば‣ 圏IndCat - 添字付圏全体からなる2-圏 - 射(1-cell) •  - 射の変換(2-cell) • 
  25. 25. ここまでに出てきたもの op :C ! Cat Kl(T ) # hT, ⌘, ( ) i
  26. 26. Predicate Liftingの定義
  27. 27. 函手とP.L.‣ Functors with Predicate Liftings - IndCatに於ける自己射       のこと -       をpredicate liftingと呼ぶ • X上の述語     をFX上の述語         に
  28. 28. 函手とP.L.‣ Functors with Predicate Liftings - IndCatに於ける自己射       のこと -       をpredicate liftingと呼ぶ • X上の述語     をFX上の述語         に ( : C op ! Cat) (F, ) /( : C op ! Cat)
  29. 29. 函手とP.L.‣ Functors with Predicate Liftings - IndCatに於ける自己射       のこと -       をpredicate liftingと呼ぶ • X上の述語     をFX上の述語         に op op C C F ✏ +3 C op ✏ ✏ Cat Cat
  30. 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. 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. 32. モナド with P.L. のモナド則
  33. 33. モナド with P.L. のモナド則
  34. 34. モナド with P.L. のモナド則 µX ⌘T X = idT X
  35. 35. モナド with P.L. のモナド則 µX ⌘T X = idT X µX T ⌘X = idT X
  36. 36. モナド with P.L. のモナド則 µX ⌘T X = idT X µX T ⌘X = idT X µX µT X = µX T µX
  37. 37. モナド with P.L. のモナド則 µX ⌘T X = idT X µX T ⌘X = idT X µX µT X = µX T µX
  38. 38. モナド with P.L. のモナド則 µX ⌘T X = idT X µX T ⌘X = idT X µX µT X = µX T µX
  39. 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. 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. 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. 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. 43. ここまでに出てきたもの op :C ! Cat Kl(T ) # hT, ⌘, ( ) i
  44. 44. Grothendieck構成と Predicate Lifting
  45. 45. Grothendieck構成‣ 添字付圏 から新たな圏  を作る- 対象は の組- 射は              の組- 合成は
  46. 46. Grothendieck構成
  47. 47. Grothendieck構成
  48. 48. Grothendieck構成
  49. 49. Grothendieck構成
  50. 50. Grothendieck構成
  51. 51. Grothendieck構成 op :C ! Cat
  52. 52. Grothendieck構成 op :C ! Cat
  53. 53. Grothendieck構成 op :C ! Cat
  54. 54. Grothendieck構成 op :C ! Cat
  55. 55. Grothendieck構成 op :C ! Cat
  56. 56. Grothendieck構成 op :C ! Cat
  57. 57. Grothendieck構成 op :C ! Cat
  58. 58. Grothendieck構成 op :C ! Cat
  59. 59. Grothendieck構成 op :C ! Cat
  60. 60. Grothendieck構成 op :C ! Cat
  61. 61. Grothendieck構成 op :C ! Cat
  62. 62. Grothendieck構成 op :C ! Cat
  63. 63. Grothendieck構成 op :C ! Cat
  64. 64. Grothendieck構成 op :C ! Cat
  65. 65. Grothendieck構成 op :C ! Cat
  66. 66. Grothendieck構成 op :C ! Cat
  67. 67. Grothendieck構成 op :C ! Cat
  68. 68. Grothendieck構成 op :C ! Cat
  69. 69. Grothendieck構成 op :C ! Cat
  70. 70. Grothendieck構成 op :C ! Cat
  71. 71. Grothendieck構成に於ける射の合成
  72. 72. Grothendieck構成に於ける射の合成
  73. 73. Grothendieck構成に於ける射の合成
  74. 74. Grothendieck構成に於ける射の合成
  75. 75. Grothendieck構成に於ける射の合成
  76. 76. Grothendieck構成に於ける射の合成
  77. 77. Grothendieck構成に於ける射の合成
  78. 78. Grothendieck構成に於ける射の合成
  79. 79. Grothendieck構成に於ける射の合成
  80. 80. Grothendieck構成に於ける射の合成
  81. 81. Grothendieck構成に於ける射の合成
  82. 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. 83. “モナド”達の関連 op :C ! Cat モノイダル圏 モノイド対象 End(C) End( ) R End( ) hT , ⌘, µi
  84. 84. Kleisli添字付圏‣ 反変函手 - splitなモナド with P.L. の下で •  • - 函手性の証明にsplitnessが要る‣ - Kleisli圏 Kl(T ) についての 述語の圏
  85. 85. ここまでに出てきたもの op :C ! Cat hT , ⌘, µi Kl(T ) Kl(T ) # hT, ⌘, ( ) i
  86. 86. op :C ! Cat hT , ⌘, µi Kl(T ) Kl(T ) #hT, ⌘, ( ) i
  87. 87. op :C ! Cat hT , ⌘, µi Kl(T ) Kl(T ) #hT, ⌘, ( ) i
  88. 88. モナド on Coq op :C ! Cat hT , ⌘, µi Kl(T ) Kl(T ) #hT, ⌘, ( ) i
  89. 89. モナド on Coq op :C ! Cat hT , ⌘, µi Kl(T ) Kl(T ) #hT, ⌘, ( ) i
  90. 90. モナド on Coq モナド with P.L. op :C ! Cat hT , ⌘, µi Kl(T ) Kl(T ) #hT, ⌘, ( ) i
  91. 91. モナド on Coq モナド with P.L. op :C ! Cat hT , ⌘, µi Kl(T ) Kl(T ) #hT, ⌘, ( ) i hT , ⌘, ( )# i
  92. 92. モナド on Coq モナド with P.L. op :C ! Cat = hT , ⌘, µi Kl(T ) Kl(T ) #hT, ⌘, ( ) i hT , ⌘, ( )# i
  93. 93. モナド on Coq モナド with P.L. op :C ! Cat = hT , ⌘, µi Kl(T ) Kl(T ) #hT, ⌘, ( ) i = hT , ⌘, ( )# i
  94. 94. モナド on Coq モナド with P.L. op :C ! Cat = hT , ⌘, µi Kl(T ) Kl(T ) # #hT, ⌘, ( ) i h(T, ⌧ ), (⌘, ✓), (( ) , [ ? ])i = hT , ⌘, ( )# i
  95. 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. 96. モナド on Coq モナド with P.L. op :C ! Cat hT, ⌘, µ, ⌧, ✓, ⌫i = hT , ⌘, µi Kl(T ) Kl(T ) # #hT, ⌘, ( ) i hT, ⌘, ( ) , ⌧, ✓, [ ? ]i = hT , ⌘, ( )# i
  97. 97. モナド on Coq モナド with P.L. op :C ! Cat hT, ⌘, µ, ⌧, ✓, ⌫i = hT , ⌘, µi Kl(T ) Kl(T ) # #hT, ⌘, ( ) i hT, ⌘, ( ) , ⌧, ✓, [ ? ]i = hT , ⌘, ( )# i
  98. 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. 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. 100. Kleisli Triples withPredicate Liftings
  101. 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. 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. 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. 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. 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. 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. 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. 108. Kleisli Triple with P.L. が満たす等式
  109. 109. Kleisli Triple with P.L. が満たす等式 hT, ⌘, ( )# i
  110. 110. Kleisli Triple with P.L. が満たす等式 hT, ⌘, ( )# i # f ⌘X = f
  111. 111. Kleisli Triple with P.L. が満たす等式 hT, ⌘, ( )# i # f ⌘X = f # ⌘X = idT X
  112. 112. Kleisli Triple with P.L. が満たす等式 hT, ⌘, ( )# i # f ⌘X = f # ⌘X = idT X # # # # g f = (g f)
  113. 113. Kleisli Triple with P.L. が満たす等式 hT, ⌘, ( )# i # f ⌘X = f # ⌘X = idT X # # # # g f = (g f)
  114. 114. Kleisli Triple with P.L. が満たす等式 hT, ⌘, ( )# , ⌧, ✓, ( )⇧ i # f ⌘X = f # ⌘X = idT X # # # # g f = (g f)
  115. 115. Kleisli Triple with P.L. が満たす等式 hT, ⌘, ( )# , ⌧, ✓, ( )⇧ i f # ⌘X = f (⌘X )(p⇧ ) ✓X,P = p # ⌘X = idT X # # # # g f = (g f)
  116. 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. 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. 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. 119. splitness # f = µT Tf
  120. 120. splitness # f = µT Tf # ⇧ (f , p ) = (µT , ⌫Y,Q ) (T f, ⌧X (p))
  121. 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. 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. 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. 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. 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. 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. 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. 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. 129. splitness # µX = idT X (µX , ⌫X,P ) = (idT X , id⌧X (P ) )# # ⇧ (µX , ⌫X,P ) = (idT X , id⌧X (P ) )
  130. 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. 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. 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. 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. 134. splitness # µX = idT X (µX , ⌫X,P ) = (idT X , id⌧X (P ) )# # ⇧ (µX , ⌫X,P ) = (idT X , id⌧X (P ) )
  135. 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. 136. P.L. on Coq‣ 添字付圏 について - 今回は,Kleisli Triples with Predicate Liftingsの一般的 な定義・実装を目指したので,反変函手とだけ仮定 - Moggiの論文に拠れば,述語として用いるなら添字付交 わり半束+αの性質を持つものとすべき • 今後の課題‣ PredLiftクラス - モナドにPredicate Liftingを追加したサブクラス ⇧ • ✓, ( ) はクラスの持つべき性質として現れる
  137. 137. P.L. on Coq‣ 添字付圏 について - 今回は,Kleisli Triples with Predicate Liftingsの一般的 な定義・実装を目指したので,反変函手とだけ仮定 - Moggiの論文に拠れば,述語として用いるなら添字付交 わり半束+αの性質を持つものとすべき • 今後の課題 ?‣ PredLiftクラス - モナドにPredicate Liftingを追加したサブクラス ⇧ • ✓, ( ) はクラスの持つべき性質として現れる
  138. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 152. 実装例‣ 直接ソースコードをお見せします
  153. 153. まとめ
  154. 154. できたこと‣ Coq上でPredicate Liftingを定義 - Kleisli Triples with Predicate Liftings - Kleisli Tripleのsplitnessの導出と実装 - 具体例の実装 • Maybeモナド with P.L. や Stateモナド with P.L. • MonadStateに関するホーアトリプル
  155. 155. 課題と考察‣ モナド則やsplitnessのCoqに於ける記述方法 - 記述する必要が可能性も - Proof IrrelevanceとPredicate Lifting‣ 強モナド,Predicate Lifting,Kleisli Triple - これらの間の関連の議論がまだまだ出来ていない‣ 述語 の取扱について - 添字付交わり半束+αに制限するべきか‣ 実装に至るまでに用いた性質の証明をCoqで - 余裕があれば
  156. 156. 補足など
  157. 157. モノイダル圏‣ モノイダル圏- 圏 ,双函手       ,対象   からなる組- 結合律- 単位元律‣ 対象モノイダル圏- 積が可換 なモノイダル圏‣ モノイド対象- モノイダル圏の対象で, 演算 と 単位元 を与える自然変 換を伴い,それらが モノイドの公理 を満たすもの
  158. 158. モノイダル圏‣ モノイダル圏- 圏 ,双函手       ,対象   からなる組- 結合律- 単位元律 圏Cの自己函手からなる圏はモノイダル圏‣ 対象モノイダル圏 C上のモナドとは,この圏のモノイド対象- 積が可換 なモノイダル圏‣ モノイド対象- モノイダル圏の対象で, 演算 と 単位元 を与える自然変 換を伴い,それらが モノイドの公理 を満たすもの

×