Mercurial > hg > Members > kono > Proof > category
comparison monoidal.agda @ 714:bc21e89cd273
...
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Thu, 23 Nov 2017 20:18:09 +0900 |
parents | 5e101ee6dab9 |
children | 1be42267eeee |
comparison
equal
deleted
inserted
replaced
713:5e101ee6dab9 | 714:bc21e89cd273 |
---|---|
367 → FMap F (map f g) (φ (x , y)) ≡ φ (FMap F f x , FMap F g y) | 367 → FMap F (map f g) (φ (x , y)) ≡ φ (FMap F f x , FMap F g y) |
368 law2 : { x y z : Obj Sets } { a : FObj F x } { b : FObj F y }{ c : FObj F z } | 368 law2 : { x y z : Obj Sets } { a : FObj F x } { b : FObj F y }{ c : FObj F z } |
369 → φ (a , φ (b , c)) ≡ FMap F (Iso.≅→ (mα-iso isM)) (φ (φ (a , b) , c)) | 369 → φ (a , φ (b , c)) ≡ FMap F (Iso.≅→ (mα-iso isM)) (φ (φ (a , b) , c)) |
370 law3 : {a : Obj Sets } { x : FObj F a } → FMap F (Iso.≅→ (mρ-iso isM)) (φ (x , unit)) ≡ x | 370 law3 : {a : Obj Sets } { x : FObj F a } → FMap F (Iso.≅→ (mρ-iso isM)) (φ (x , unit)) ≡ x |
371 law4 : {a : Obj Sets } { x : FObj F a } → FMap F (Iso.≅→ (mλ-iso isM)) (φ (unit , x)) ≡ x | 371 law4 : {a : Obj Sets } { x : FObj F a } → FMap F (Iso.≅→ (mλ-iso isM)) (φ (unit , x)) ≡ x |
372 | |
373 -- http://www.staff.city.ac.uk/~ross/papers/Applicative.pdf | |
374 -- naturality of φ fmap(f × g)(φ u v) = φ ( fmap f u) ( fmap g v ) | |
375 -- left identity fmap snd (φ unit v) = v | |
376 -- right identity fmap fst (φ u unit) = u | |
377 -- associativity fmap assoc (φ u (φ v w)) = φ (φ u v) w | |
378 | |
372 | 379 |
373 record HaskellMonoidalFunctor {c₁ : Level} ( f : Functor (Sets {c₁}) (Sets {c₁}) ) | 380 record HaskellMonoidalFunctor {c₁ : Level} ( f : Functor (Sets {c₁}) (Sets {c₁}) ) |
374 : Set (suc (suc c₁)) where | 381 : Set (suc (suc c₁)) where |
375 field | 382 field |
376 unit : FObj f One | 383 unit : FObj f One |
478 ( _<*>_ : {a b : Obj Sets} → FObj f ( a → b ) → FObj f a → FObj f b ) | 485 ( _<*>_ : {a b : Obj Sets} → FObj f ( a → b ) → FObj f a → FObj f b ) |
479 : Set (suc (suc c₁)) where | 486 : Set (suc (suc c₁)) where |
480 _・_ : { a b c : Obj (Sets {c₁} ) } → (b → c) → (a → b) → a → c | 487 _・_ : { a b c : Obj (Sets {c₁} ) } → (b → c) → (a → b) → a → c |
481 _・_ f g = λ x → f ( g x ) | 488 _・_ f g = λ x → f ( g x ) |
482 field | 489 field |
490 -- http://www.staff.city.ac.uk/~ross/papers/Applicative.pdf | |
483 identity : { a : Obj Sets } { u : FObj f a } → pure ( id1 Sets a ) <*> u ≡ u | 491 identity : { a : Obj Sets } { u : FObj f a } → pure ( id1 Sets a ) <*> u ≡ u |
484 composition : { a b c : Obj Sets } { u : FObj f ( b → c ) } { v : FObj f (a → b ) } { w : FObj f a } | 492 composition : { a b c : Obj Sets } { u : FObj f ( b → c ) } { v : FObj f (a → b ) } { w : FObj f a } |
485 → (( pure _・_ <*> u ) <*> v ) <*> w ≡ u <*> (v <*> w) | 493 → (( pure _・_ <*> u ) <*> v ) <*> w ≡ u <*> (v <*> w) |
486 homomorphism : { a b : Obj Sets } { f : Hom Sets a b } { x : a } → pure f <*> pure x ≡ pure (f x) | 494 homomorphism : { a b : Obj Sets } { f : Hom Sets a b } { x : a } → pure f <*> pure x ≡ pure (f x) |
487 interchange : { a b : Obj Sets } { u : FObj f ( a → b ) } { x : a } → u <*> pure x ≡ pure (λ f → f x) <*> u | 495 interchange : { a b : Obj Sets } { u : FObj f ( a → b ) } { x : a } → u <*> pure x ≡ pure (λ f → f x) <*> u |
523 ; composition = composition | 531 ; composition = composition |
524 ; homomorphism = homomorphism | 532 ; homomorphism = homomorphism |
525 ; interchange = interchange | 533 ; interchange = interchange |
526 } | 534 } |
527 where | 535 where |
536 id : { a : Obj Sets } → a → a | |
537 id x = x | |
528 isM : IsMonoidal (Sets {c₁}) One SetsTensorProduct | 538 isM : IsMonoidal (Sets {c₁}) One SetsTensorProduct |
529 isM = Monoidal.isMonoidal MonoidalSets | 539 isM = Monoidal.isMonoidal MonoidalSets |
530 open IsMonoidal | 540 open IsMonoidal |
531 pure : {a : Obj Sets} → Hom Sets a ( FObj F a ) | 541 pure : {a : Obj Sets} → Hom Sets a ( FObj F a ) |
532 pure {a} x = FMap F ( λ y → x ) (unit ) | 542 pure {a} x = FMap F ( λ y → x ) (unit ) |
534 _<*>_ {a} {b} x y = FMap F ( λ a→b*b → ( proj₁ a→b*b ) ( proj₂ a→b*b ) ) (φ ( x , y )) | 544 _<*>_ {a} {b} x y = FMap F ( λ a→b*b → ( proj₁ a→b*b ) ( proj₂ a→b*b ) ) (φ ( x , y )) |
535 _・_ : { a b c : Obj (Sets {c₁} ) } → (b → c) → (a → b) → a → c | 545 _・_ : { a b c : Obj (Sets {c₁} ) } → (b → c) → (a → b) → a → c |
536 _・_ f g = λ x → f ( g x ) | 546 _・_ f g = λ x → f ( g x ) |
537 identity : { a : Obj Sets } { u : FObj F a } → pure ( id1 Sets a ) <*> u ≡ u | 547 identity : { a : Obj Sets } { u : FObj F a } → pure ( id1 Sets a ) <*> u ≡ u |
538 identity {a} {u} = begin | 548 identity {a} {u} = begin |
539 pure ( id1 Sets a ) <*> u | 549 pure id <*> u |
540 ≡⟨⟩ | 550 ≡⟨⟩ |
541 ( FMap F ( λ a→b*b → ( proj₁ a→b*b ) ( proj₂ a→b*b )) ) ( φ ( FMap F ( λ y → id1 Sets a ) unit , u ) ) | 551 ( FMap F ( λ a→b*b → ( proj₁ a→b*b ) ( proj₂ a→b*b )) ) ( φ ( FMap F ( λ y → id ) unit , u ) ) |
542 ≡⟨ sym ( ≡-cong ( λ k → ( FMap F ( λ a→b*b → ( proj₁ a→b*b ) ( proj₂ a→b*b )) ) ( φ ( FMap F ( λ y → id1 Sets a ) unit , k u ))) | 552 ≡⟨ sym ( ≡-cong ( λ k → ( FMap F ( λ a→b*b → ( proj₁ a→b*b ) ( proj₂ a→b*b )) ) ( φ ( FMap F ( λ y → id ) unit , k u ))) |
543 ( IsFunctor.identity ( Functor.isFunctor F ) ) ) ⟩ | 553 ( IsFunctor.identity ( Functor.isFunctor F ) ) ) ⟩ |
544 ( FMap F ( λ a→b*b → ( proj₁ a→b*b ) ( proj₂ a→b*b )) ) ( φ ( FMap F ( λ y → id1 Sets a ) unit , FMap F (id1 Sets a) u ) ) | 554 ( FMap F ( λ a→b*b → ( proj₁ a→b*b ) ( proj₂ a→b*b )) ) ( φ ( FMap F ( λ y → id ) unit , FMap F id u ) ) |
545 ≡⟨ sym ( ≡-cong ( λ k → ( FMap F ( λ a→b*b → ( proj₁ a→b*b ) ( proj₂ a→b*b )) ) k ) ( IsHaskellMonoidalFunctor.law1 mono ) ) ⟩ | 555 ≡⟨ sym ( ≡-cong ( λ k → ( FMap F ( λ a→b*b → ( proj₁ a→b*b ) ( proj₂ a→b*b )) ) k ) ( IsHaskellMonoidalFunctor.law1 mono ) ) ⟩ |
546 FMap F (λ a→b*b → proj₁ a→b*b (proj₂ a→b*b)) (FMap F (map (λ y → id1 Sets a) (λ x → x )) (φ (unit , u ))) | 556 FMap F (λ a→b*b → proj₁ a→b*b (proj₂ a→b*b)) (FMap F (map (λ y → id) id) (φ (unit , u ))) |
547 ≡⟨ ≡-cong ( λ k → k (φ (unit , u ) )) ( sym ( IsFunctor.distr ( Functor.isFunctor F ) ) ) ⟩ | 557 ≡⟨ ≡-cong ( λ k → k (φ (unit , u ) )) ( sym ( IsFunctor.distr ( Functor.isFunctor F ) ) ) ⟩ |
548 FMap F (λ x → (λ a→b*b → proj₁ a→b*b (proj₂ a→b*b)) ((map (λ y → id1 Sets a) (λ x → x )) x )) (φ (unit , u ) ) | 558 FMap F (λ x → (λ a→b*b → proj₁ a→b*b (proj₂ a→b*b)) ((map (λ y → id) id) x )) (φ (unit , u ) ) |
549 ≡⟨⟩ | 559 ≡⟨⟩ |
550 FMap F (λ x → proj₂ x ) (φ (unit , u ) ) | 560 FMap F (λ x → proj₂ x ) (φ (unit , u ) ) |
551 ≡⟨⟩ | 561 ≡⟨⟩ |
552 FMap F (Iso.≅→ (mλ-iso isM)) (φ (unit , u )) | 562 FMap F (Iso.≅→ (mλ-iso isM)) (φ (unit , u )) |
553 ≡⟨ IsHaskellMonoidalFunctor.law4 mono ⟩ | 563 ≡⟨ IsHaskellMonoidalFunctor.law4 mono ⟩ |
556 where | 566 where |
557 open Relation.Binary.PropositionalEquality.≡-Reasoning | 567 open Relation.Binary.PropositionalEquality.≡-Reasoning |
558 composition : { a b c : Obj Sets } { u : FObj F ( b → c ) } { v : FObj F (a → b ) } { w : FObj F a } | 568 composition : { a b c : Obj Sets } { u : FObj F ( b → c ) } { v : FObj F (a → b ) } { w : FObj F a } |
559 → (( pure _・_ <*> u ) <*> v ) <*> w ≡ u <*> (v <*> w) | 569 → (( pure _・_ <*> u ) <*> v ) <*> w ≡ u <*> (v <*> w) |
560 composition {a} {b} {c} {u} {v} {w} = begin | 570 composition {a} {b} {c} {u} {v} {w} = begin |
561 ? | 571 FMap F (λ a→b*b → proj₁ a→b*b (proj₂ a→b*b)) (φ (FMap F (λ a→b*b → proj₁ a→b*b (proj₂ a→b*b)) (φ |
562 ≡⟨ ? ⟩ | 572 (FMap F (λ a→b*b → proj₁ a→b*b (proj₂ a→b*b)) (φ (FMap F (λ y f g x → f (g x)) unit , u)) , v)) , w)) |
563 ? | 573 ≡⟨ {!!} ⟩ |
574 FMap F (λ a→b*b → proj₁ a→b*b (proj₂ a→b*b)) (φ (FMap F (λ a→b*b → proj₁ a→b*b (proj₂ a→b*b)) (φ | |
575 (FMap F (λ a→b*b → proj₁ a→b*b (proj₂ a→b*b)) (φ (FMap F (λ y f g x → f (g x)) unit , FMap F id u)) , FMap F id v)) , FMap F id w)) | |
576 ≡⟨ {!!} ⟩ | |
577 FMap F (λ a→b*b → proj₁ a→b*b (proj₂ a→b*b)) (φ (FMap F (λ a→b*b → proj₁ a→b*b (proj₂ a→b*b)) (φ | |
578 (FMap F (λ a→b*b → proj₁ a→b*b (proj₂ a→b*b)) (FMap F (map (λ y f g x → f (g x)) id ) (φ ( unit , u))) , FMap F id v)) , FMap F id w)) | |
579 ≡⟨ {!!} ⟩ | |
580 FMap F (λ a→b*b → proj₁ a→b*b (proj₂ a→b*b)) (φ (FMap F (λ a→b*b → proj₁ a→b*b (proj₂ a→b*b)) (φ | |
581 (FMap F ( λ x → (λ a→b*b → proj₁ a→b*b (proj₂ a→b*b)) ((map (λ y f g x → f (g x)) id ) x)) (φ ( unit , u)) , FMap F id v)) , FMap F id w)) | |
582 ≡⟨⟩ | |
583 FMap F (λ a→b*b → proj₁ a→b*b (proj₂ a→b*b)) (φ (FMap F (λ a→b*b → proj₁ a→b*b (proj₂ a→b*b)) (φ | |
584 (FMap F ( λ y → (λ f g x → f (g x)) (proj₂ y ) ) (φ ( unit , u)) , FMap F id v)) , FMap F id w)) | |
585 ≡⟨ {!!} ⟩ | |
586 FMap F (λ a→b*b → proj₁ a→b*b (proj₂ a→b*b)) (φ (FMap F (λ a→b*b → proj₁ a→b*b (proj₂ a→b*b)) ( | |
587 FMap F ( map ( λ y → (λ f g x → f (g x)) (proj₂ y ) ) id ) ( φ ( φ ( unit , u) , v))) , FMap F id w)) | |
588 ≡⟨ {!!} ⟩ | |
589 FMap F (λ a→b*b → proj₁ a→b*b (proj₂ a→b*b)) (φ ( | |
590 FMap F ( λ x → (λ a→b*b → proj₁ a→b*b (proj₂ a→b*b)) (( map ( λ y → (λ f g x → f (g x)) (proj₂ y ) ) id ) x)) ( φ ( φ ( unit , u) , v)) | |
591 , FMap F id w)) | |
592 ≡⟨⟩ | |
593 FMap F (λ a→b*b → proj₁ a→b*b (proj₂ a→b*b)) (φ ( | |
594 FMap F ( λ z → ((( λ f g x → f (g x)) (proj₂ (proj₁ z))) ( proj₂ z ))) ( φ ( φ ( unit , u) , v)) | |
595 , FMap F id w)) | |
596 ≡⟨ {!!} ⟩ | |
597 FMap F (λ a→b*b → proj₁ a→b*b (proj₂ a→b*b)) (φ (u , FMap F (λ a→b*b → proj₁ a→b*b (proj₂ a→b*b)) (φ (v , w)))) | |
564 ∎ | 598 ∎ |
565 where | 599 where |
566 open Relation.Binary.PropositionalEquality.≡-Reasoning | 600 open Relation.Binary.PropositionalEquality.≡-Reasoning |
567 homomorphism : { a b : Obj Sets } { f : Hom Sets a b } { x : a } → pure f <*> pure x ≡ pure (f x) | 601 homomorphism : { a b : Obj Sets } { f : Hom Sets a b } { x : a } → pure f <*> pure x ≡ pure (f x) |
568 homomorphism = {!!} | 602 homomorphism = {!!} |