comparison monoidal.agda @ 715:1be42267eeee

add some tools
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Fri, 24 Nov 2017 11:32:41 +0900
parents bc21e89cd273
children 35457f9568f3
comparison
equal deleted inserted replaced
714:bc21e89cd273 715:1be42267eeee
361 : Set (suc (suc c₁)) where 361 : Set (suc (suc c₁)) where
362 isM : IsMonoidal (Sets {c₁}) One SetsTensorProduct 362 isM : IsMonoidal (Sets {c₁}) One SetsTensorProduct
363 isM = Monoidal.isMonoidal MonoidalSets 363 isM = Monoidal.isMonoidal MonoidalSets
364 open IsMonoidal 364 open IsMonoidal
365 field 365 field
366 law1 : { a b c d : Obj Sets } { x : FObj F a} { y : FObj F b} { f : a → c } { g : b → d } 366 natφ : { a b c d : Obj Sets } { x : FObj F a} { y : FObj F b} { f : a → c } { g : b → d }
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 assocφ : { 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 idrφ : {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 idlφ : {a : Obj Sets } { x : FObj F a } → FMap F (Iso.≅→ (mλ-iso isM)) (φ (unit , x)) ≡ x
372 372
373 -- http://www.staff.city.ac.uk/~ross/papers/Applicative.pdf 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 ) 374 -- naturality of φ fmap(f × g)(φ u v) = φ ( fmap f u) ( fmap g v )
375 -- left identity fmap snd (φ unit v) = v 375 -- left identity fmap snd (φ unit v) = v
376 -- right identity fmap fst (φ u unit) = u 376 -- right identity fmap fst (φ u unit) = u
415 (FMap (Functor⊗ Sets Sets MonoidalSets F) (f , g) ) (φ (x , y)) 415 (FMap (Functor⊗ Sets Sets MonoidalSets F) (f , g) ) (φ (x , y))
416 ≡⟨⟩ 416 ≡⟨⟩
417 (FMap F ( f □ g ) ) (φ (x , y)) 417 (FMap F ( f □ g ) ) (φ (x , y))
418 ≡⟨⟩ 418 ≡⟨⟩
419 FMap F ( map f g ) (φ (x , y)) 419 FMap F ( map f g ) (φ (x , y))
420 ≡⟨ IsHaskellMonoidalFunctor.law1 ismf ⟩ 420 ≡⟨ IsHaskellMonoidalFunctor.natφ ismf ⟩
421 φ ( FMap F f x , FMap F g y ) 421 φ ( FMap F f x , FMap F g y )
422 ≡⟨⟩ 422 ≡⟨⟩
423 φ ( ( FMap F f □ FMap F g ) (x , y) ) 423 φ ( ( FMap F f □ FMap F g ) (x , y) )
424 ≡⟨⟩ 424 ≡⟨⟩
425 φ ((FMap (Functor● Sets Sets MonoidalSets F) (f , g) ) (x , y) ) 425 φ ((FMap (Functor● Sets Sets MonoidalSets F) (f , g) ) (x , y) )
433 (Sets [ FMap F (Iso.≅→ (mα-iso isM)) o Sets [ φ o φ □ id1 Sets (FObj F c) ] ]) x 433 (Sets [ FMap F (Iso.≅→ (mα-iso isM)) o Sets [ φ o φ □ id1 Sets (FObj F c) ] ]) x
434 comm10 {x} {y} {f} ((a , b) , c ) = begin 434 comm10 {x} {y} {f} ((a , b) , c ) = begin
435 φ (( id1 Sets (FObj F x) □ φ ) ( ( Iso.≅→ (mα-iso isM) ) ((a , b) , c))) 435 φ (( id1 Sets (FObj F x) □ φ ) ( ( Iso.≅→ (mα-iso isM) ) ((a , b) , c)))
436 ≡⟨⟩ 436 ≡⟨⟩
437 φ ( a , φ (b , c)) 437 φ ( a , φ (b , c))
438 ≡⟨ IsHaskellMonoidalFunctor.law2 ismf ⟩ 438 ≡⟨ IsHaskellMonoidalFunctor.assocφ ismf ⟩
439 ( FMap F (Iso.≅→ (mα-iso isM))) (φ (( φ (a , b)) , c )) 439 ( FMap F (Iso.≅→ (mα-iso isM))) (φ (( φ (a , b)) , c ))
440 ≡⟨⟩ 440 ≡⟨⟩
441 ( FMap F (Iso.≅→ (mα-iso isM))) (φ (( φ □ id1 Sets (FObj F f) ) ((a , b) , c))) 441 ( FMap F (Iso.≅→ (mα-iso isM))) (φ (( φ □ id1 Sets (FObj F f) ) ((a , b) , c)))
442 442
443 where 443 where
449 comm20 : {a b : Obj Sets} ( x : FObj F a * One ) → ( Sets [ 449 comm20 : {a b : Obj Sets} ( x : FObj F a * One ) → ( Sets [
450 FMap F (Iso.≅→ (mρ-iso isM)) o Sets [ φ o 450 FMap F (Iso.≅→ (mρ-iso isM)) o Sets [ φ o
451 FMap (m-bi MonoidalSets) (id1 Sets (FObj F a) , (λ _ → unit )) ] ] ) x ≡ Iso.≅→ (mρ-iso isM) x 451 FMap (m-bi MonoidalSets) (id1 Sets (FObj F a) , (λ _ → unit )) ] ] ) x ≡ Iso.≅→ (mρ-iso isM) x
452 comm20 {a} {b} (x , OneObj ) = begin 452 comm20 {a} {b} (x , OneObj ) = begin
453 (FMap F (Iso.≅→ (mρ-iso isM))) ( φ ( x , unit ) ) 453 (FMap F (Iso.≅→ (mρ-iso isM))) ( φ ( x , unit ) )
454 ≡⟨ IsHaskellMonoidalFunctor.law3 ismf ⟩ 454 ≡⟨ IsHaskellMonoidalFunctor.idrφ ismf ⟩
455 x 455 x
456 ≡⟨⟩ 456 ≡⟨⟩
457 Iso.≅→ (mρ-iso isM) ( x , OneObj ) 457 Iso.≅→ (mρ-iso isM) ( x , OneObj )
458 458
459 where 459 where
465 comm30 : {a b : Obj Sets} ( x : One * FObj F b ) → ( Sets [ 465 comm30 : {a b : Obj Sets} ( x : One * FObj F b ) → ( Sets [
466 FMap F (Iso.≅→ (mλ-iso isM)) o Sets [ φ o 466 FMap F (Iso.≅→ (mλ-iso isM)) o Sets [ φ o
467 FMap (m-bi MonoidalSets) ((λ _ → unit ) , id1 Sets (FObj F b) ) ] ] ) x ≡ Iso.≅→ (mλ-iso isM) x 467 FMap (m-bi MonoidalSets) ((λ _ → unit ) , id1 Sets (FObj F b) ) ] ] ) x ≡ Iso.≅→ (mλ-iso isM) x
468 comm30 {a} {b} ( OneObj , x) = begin 468 comm30 {a} {b} ( OneObj , x) = begin
469 (FMap F (Iso.≅→ (mλ-iso isM))) ( φ ( unit , x ) ) 469 (FMap F (Iso.≅→ (mλ-iso isM))) ( φ ( unit , x ) )
470 ≡⟨ IsHaskellMonoidalFunctor.law4 ismf ⟩ 470 ≡⟨ IsHaskellMonoidalFunctor.idlφ ismf ⟩
471 x 471 x
472 ≡⟨⟩ 472 ≡⟨⟩
473 Iso.≅→ (mλ-iso isM) ( OneObj , x ) 473 Iso.≅→ (mλ-iso isM) ( OneObj , x )
474 474
475 where 475 where
515 where 515 where
516 open HaskellMonoidalFunctor 516 open HaskellMonoidalFunctor
517 pure : {a : Obj Sets} → Hom Sets a ( FObj F a ) 517 pure : {a : Obj Sets} → Hom Sets a ( FObj F a )
518 pure {a} x = FMap F ( λ y → x ) (unit mono) 518 pure {a} x = FMap F ( λ y → x ) (unit mono)
519 <*> : {a b : Obj Sets} → FObj F ( a → b ) → FObj F a → FObj F b -- ** mono x y 519 <*> : {a b : Obj Sets} → FObj F ( a → b ) → FObj F a → FObj F b -- ** mono x y
520 <*> {a} {b} x y = FMap F ( λ a→b*b → ( proj₁ a→b*b ) ( proj₂ a→b*b ) ) (φ mono ( x , y )) 520 <*> {a} {b} x y = FMap F ( λ r → ( proj₁ r ) ( proj₂ r ) ) (φ mono ( x , y ))
521 521
522 open Relation.Binary.PropositionalEquality
523 522
524 HaskellMonoidal→Applicative : {c₁ : Level} ( F : Functor (Sets {c₁}) (Sets {c₁}) ) 523 HaskellMonoidal→Applicative : {c₁ : Level} ( F : Functor (Sets {c₁}) (Sets {c₁}) )
525 ( unit : FObj F One ) 524 ( unit : FObj F One )
526 ( φ : {a b : Obj Sets} → Hom Sets ((FObj F a) * (FObj F b )) ( FObj F ( a * b ) ) ) 525 ( φ : {a b : Obj Sets} → Hom Sets ((FObj F a) * (FObj F b )) ( FObj F ( a * b ) ) )
527 ( mono : IsHaskellMonoidalFunctor F unit φ ) 526 ( mono : IsHaskellMonoidalFunctor F unit φ )
528 → IsApplicative F (λ x → FMap F ( λ y → x ) unit) (λ x y → FMap F ( λ a→b*b → ( proj₁ a→b*b ) ( proj₂ a→b*b ) ) (φ ( x , y ))) 527 → IsApplicative F (λ x → FMap F ( λ y → x ) unit) (λ x y → FMap F ( λ r → ( proj₁ r ) ( proj₂ r ) ) (φ ( x , y )))
529 HaskellMonoidal→Applicative {c₁} F unit φ mono = record { 528 HaskellMonoidal→Applicative {c₁} F unit φ mono = record {
530 identity = identity 529 identity = identity
531 ; composition = composition 530 ; composition = composition
532 ; homomorphism = homomorphism 531 ; homomorphism = homomorphism
533 ; interchange = interchange 532 ; interchange = interchange
535 where 534 where
536 id : { a : Obj Sets } → a → a 535 id : { a : Obj Sets } → a → a
537 id x = x 536 id x = x
538 isM : IsMonoidal (Sets {c₁}) One SetsTensorProduct 537 isM : IsMonoidal (Sets {c₁}) One SetsTensorProduct
539 isM = Monoidal.isMonoidal MonoidalSets 538 isM = Monoidal.isMonoidal MonoidalSets
540 open IsMonoidal
541 pure : {a : Obj Sets} → Hom Sets a ( FObj F a ) 539 pure : {a : Obj Sets} → Hom Sets a ( FObj F a )
542 pure {a} x = FMap F ( λ y → x ) (unit ) 540 pure {a} x = FMap F ( λ y → x ) (unit )
543 _<*>_ : {a b : Obj Sets} → FObj F ( a → b ) → FObj F a → FObj F b 541 _<*>_ : {a b : Obj Sets} → FObj F ( a → b ) → FObj F a → FObj F b
544 _<*>_ {a} {b} x y = FMap F ( λ a→b*b → ( proj₁ a→b*b ) ( proj₂ a→b*b ) ) (φ ( x , y )) 542 _<*>_ {a} {b} x y = FMap F ( λ r → ( proj₁ r ) ( proj₂ r ) ) (φ ( x , y ))
545 _・_ : { a b c : Obj (Sets {c₁} ) } → (b → c) → (a → b) → a → c 543 _・_ : { a b c : Obj (Sets {c₁} ) } → (b → c) → (a → b) → a → c
546 _・_ f g = λ x → f ( g x ) 544 _・_ f g = λ x → f ( g x )
545 left : {n : Level} { a b : Set n} → { x y : a } { h : a → b } → ( x ≡ y ) → h x ≡ h y
546 left {_} {_} {_} {_} {_} {h} eq = ≡-cong ( λ k → h k ) eq
547 right : {n : Level} { a b : Set n} → { x y : a → b } { h : a } → ( x ≡ y ) → x h ≡ y h
548 right {_} {_} {_} {_} {_} {h} eq = ≡-cong ( λ k → k h ) eq
549 open Relation.Binary.PropositionalEquality
550 φ→F : { a b c d e : Obj Sets } { g : Hom Sets a c } { h : Hom Sets b d }
551 { f : Hom Sets (c * d) e }
552 { x : FObj F a } { y : FObj F b }
553 → FMap F f ( φ ( FMap F g x , FMap F h y ) ) ≡ FMap F ( f o map g h ) ( φ ( x , y ) )
554 φ→F {a} {b} {c} {d} {e} {g} {h} {f} {x} {y} = sym ( begin
555 FMap F ( f o map g h ) ( φ ( x , y ) )
556 ≡⟨ ≡-cong ( λ k → k ( φ ( x , y ))) ( IsFunctor.distr (isFunctor F) ) ⟩
557 FMap F f (( FMap F ( map g h ) ) ( φ ( x , y )))
558 ≡⟨ ≡-cong ( λ k → FMap F f k ) ( IsHaskellMonoidalFunctor.natφ mono ) ⟩
559 FMap F f ( φ ( FMap F g x , FMap F h y ) )
560 ∎ )
561 where
562 open Relation.Binary.PropositionalEquality.≡-Reasoning
563 unit→F : {a : Obj Sets } {u : FObj F a} → u ≡ FMap F id u
564 unit→F {a} {u} = sym ( ≡-cong ( λ k → k u ) ( IsFunctor.identity ( isFunctor F ) ) )
565 open IsMonoidal
547 identity : { a : Obj Sets } { u : FObj F a } → pure ( id1 Sets a ) <*> u ≡ u 566 identity : { a : Obj Sets } { u : FObj F a } → pure ( id1 Sets a ) <*> u ≡ u
548 identity {a} {u} = begin 567 identity {a} {u} = begin
549 pure id <*> u 568 pure id <*> u
550 ≡⟨⟩ 569 ≡⟨⟩
551 ( FMap F ( λ a→b*b → ( proj₁ a→b*b ) ( proj₂ a→b*b )) ) ( φ ( FMap F ( λ y → id ) unit , u ) ) 570 ( FMap F ( λ r → ( proj₁ r ) ( proj₂ r )) ) ( φ ( FMap F ( λ y → id ) unit , 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 ))) 571 ≡⟨ ≡-cong ( λ k → ( FMap F ( λ r → ( proj₁ r ) ( proj₂ r )) ) ( φ ( FMap F ( λ y → id ) unit , k ))) unit→F ⟩
553 ( IsFunctor.identity ( Functor.isFunctor F ) ) ) ⟩ 572 ( FMap F ( λ r → ( proj₁ r ) ( proj₂ r )) ) ( φ ( FMap F ( λ y → id ) unit , FMap F id u ) )
554 ( FMap F ( λ a→b*b → ( proj₁ a→b*b ) ( proj₂ a→b*b )) ) ( φ ( FMap F ( λ y → id ) unit , FMap F id u ) ) 573 ≡⟨ φ→F ⟩
555 ≡⟨ sym ( ≡-cong ( λ k → ( FMap F ( λ a→b*b → ( proj₁ a→b*b ) ( proj₂ a→b*b )) ) k ) ( IsHaskellMonoidalFunctor.law1 mono ) ) ⟩
556 FMap F (λ a→b*b → proj₁ a→b*b (proj₂ a→b*b)) (FMap F (map (λ y → id) id) (φ (unit , u )))
557 ≡⟨ ≡-cong ( λ k → k (φ (unit , u ) )) ( sym ( IsFunctor.distr ( Functor.isFunctor F ) ) ) ⟩
558 FMap F (λ x → (λ a→b*b → proj₁ a→b*b (proj₂ a→b*b)) ((map (λ y → id) id) x )) (φ (unit , u ) )
559 ≡⟨⟩
560 FMap F (λ x → proj₂ x ) (φ (unit , u ) ) 574 FMap F (λ x → proj₂ x ) (φ (unit , u ) )
561 ≡⟨⟩ 575 ≡⟨⟩
562 FMap F (Iso.≅→ (mλ-iso isM)) (φ (unit , u )) 576 FMap F (Iso.≅→ (mλ-iso isM)) (φ (unit , u ))
563 ≡⟨ IsHaskellMonoidalFunctor.law4 mono ⟩ 577 ≡⟨ IsHaskellMonoidalFunctor.idlφ mono ⟩
564 u 578 u
565 579
566 where 580 where
567 open Relation.Binary.PropositionalEquality.≡-Reasoning 581 open Relation.Binary.PropositionalEquality.≡-Reasoning
568 composition : { a b c : Obj Sets } { u : FObj F ( b → c ) } { v : FObj F (a → b ) } { w : FObj F a } 582 composition : { a b c : Obj Sets } { u : FObj F ( b → c ) } { v : FObj F (a → b ) } { w : FObj F a }
569 → (( pure _・_ <*> u ) <*> v ) <*> w ≡ u <*> (v <*> w) 583 → (( pure _・_ <*> u ) <*> v ) <*> w ≡ u <*> (v <*> w)
570 composition {a} {b} {c} {u} {v} {w} = begin 584 composition {a} {b} {c} {u} {v} {w} = begin
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)) (φ 585 FMap F (λ r → proj₁ r (proj₂ r)) (φ (FMap F (λ r → proj₁ r (proj₂ r)) (φ
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)) 586 (FMap F (λ r → proj₁ r (proj₂ r)) (φ (FMap F (λ y f g x → f (g x)) unit , u)) , v)) , w))
573 ≡⟨ {!!} ⟩ 587 ≡⟨ {!!} ⟩
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)) (φ 588 FMap F (λ r → proj₁ r (proj₂ r)) (φ (FMap F (λ r → proj₁ r (proj₂ r)) (φ
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)) 589 (FMap F (λ r → proj₁ r (proj₂ r)) (φ (FMap F (λ y f g x → f (g x)) unit , FMap F id u)) , FMap F id v)) , FMap F id w))
576 ≡⟨ {!!} ⟩ 590 ≡⟨ {!!} ⟩
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)) (φ 591 FMap F (λ r → proj₁ r (proj₂ r)) (φ (FMap F (λ r → proj₁ r (proj₂ r)) (φ
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)) 592 (FMap F (λ r → proj₁ r (proj₂ r)) (FMap F (map (λ y f g x → f (g x)) id ) (φ ( unit , u))) , FMap F id v)) , FMap F id w))
579 ≡⟨ {!!} ⟩ 593 ≡⟨ {!!} ⟩
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)) (φ 594 FMap F (λ r → proj₁ r (proj₂ r)) (φ (FMap F (λ r → proj₁ r (proj₂ r)) (φ
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)) 595 (FMap F ( λ x → (λ r → proj₁ r (proj₂ r)) ((map (λ y f g x → f (g x)) id ) x)) (φ ( unit , u)) , FMap F id v)) , FMap F id w))
582 ≡⟨⟩ 596 ≡⟨⟩
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)) (φ 597 FMap F (λ r → proj₁ r (proj₂ r)) (φ (FMap F (λ r → proj₁ r (proj₂ r)) (φ
584 (FMap F ( λ y → (λ f g x → f (g x)) (proj₂ y ) ) (φ ( unit , u)) , FMap F id v)) , FMap F id w)) 598 (FMap F ( λ y → (λ f g x → f (g x)) (proj₂ y ) ) (φ ( unit , u)) , FMap F id v)) , FMap F id w))
585 ≡⟨ {!!} ⟩ 599 ≡⟨ {!!} ⟩
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)) ( 600 FMap F (λ r → proj₁ r (proj₂ r)) (φ (FMap F (λ r → proj₁ r (proj₂ r)) (
587 FMap F ( map ( λ y → (λ f g x → f (g x)) (proj₂ y ) ) id ) ( φ ( φ ( unit , u) , v))) , FMap F id w)) 601 FMap F ( map ( λ y → (λ f g x → f (g x)) (proj₂ y ) ) id ) ( φ ( φ ( unit , u) , v))) , FMap F id w))
588 ≡⟨ {!!} ⟩ 602 ≡⟨ {!!} ⟩
589 FMap F (λ a→b*b → proj₁ a→b*b (proj₂ a→b*b)) (φ ( 603 FMap F (λ r → proj₁ r (proj₂ r)) (φ (
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)) 604 FMap F ( λ x → (λ r → proj₁ r (proj₂ r)) (( map ( λ y → (λ f g x → f (g x)) (proj₂ y ) ) id ) x)) ( φ ( φ ( unit , u) , v))
591 , FMap F id w)) 605 , FMap F id w))
592 ≡⟨⟩ 606 ≡⟨⟩
593 FMap F (λ a→b*b → proj₁ a→b*b (proj₂ a→b*b)) (φ ( 607 FMap F (λ r → proj₁ r (proj₂ r)) (φ (
594 FMap F ( λ z → ((( λ f g x → f (g x)) (proj₂ (proj₁ z))) ( proj₂ z ))) ( φ ( φ ( unit , u) , v)) 608 FMap F ( λ z → ((( λ f g x → f (g x)) (proj₂ (proj₁ z))) ( proj₂ z ))) ( φ ( φ ( unit , u) , v))
595 , FMap F id w)) 609 , FMap F id w))
596 ≡⟨ {!!} ⟩ 610 ≡⟨⟩
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)))) 611 FMap F (λ r → proj₁ r (proj₂ r)) (φ (
612 FMap F ( λ z → ( λ x → (proj₂ (proj₁ z)) (( proj₂ z ) x ))) ( φ ( φ ( unit , u) , v))
613 , FMap F id w))
614 ≡⟨ {!!} ⟩
615 FMap F (λ r → proj₁ r (proj₂ r)) (
616 FMap F ( map ( λ z → ( λ x → (proj₂ (proj₁ z)) (( proj₂ z ) x ))) id ) ( φ ( φ ( φ ( unit , u) , v) , w )))
617 ≡⟨ {!!} ⟩
618 FMap F ( λ y → (λ r → proj₁ r (proj₂ r)) (
619 ( map ( λ z → ( λ x → (proj₂ (proj₁ z)) (( proj₂ z ) x ))) id ) y)) ( φ ( φ ( φ ( unit , u) , v) , w ))
620 ≡⟨⟩
621 FMap F ( λ y → (( λ z → ( λ x → (proj₂ (proj₁ z)) (( proj₂ z ) x ))) (proj₁ y)) (proj₂ y) )
622 ( φ ( φ ( φ ( unit , u) , v) , w ))
623 ≡⟨⟩
624 FMap F ( λ x → (proj₂ (proj₁ (proj₁ x))) (( proj₂ (proj₁ x) ) (proj₂ x))) ( φ ( φ ( φ ( unit , u) , v) , w ))
625 ≡⟨ {!!} ⟩
626 FMap F ( λ x → (proj₁ (proj₁ x)) (( proj₂ (proj₁ x) ) (proj₂ x))) ( φ ( φ ( u , v) , w ))
627 ≡⟨ {!!} ⟩
628 {!!}
629 ≡⟨ ≡-cong ( λ k → (FMap F ( λ x → (proj₁ x) ((proj₁ (proj₂ x) )(proj₂ (proj₂ x)))) ) k ) ( sym ( IsHaskellMonoidalFunctor.assocφ mono ) ) ⟩
630 FMap F ( λ x → (proj₁ x) ((proj₁ (proj₂ x) )(proj₂ (proj₂ x)))) ( φ ( u , (φ (v , w))))
631 ≡⟨⟩
632 FMap F ( λ x → (proj₁ x) ((λ r → proj₁ r (proj₂ r)) ( proj₂ x))) ( φ ( u , (φ (v , w))))
633 ≡⟨ {!!} ⟩
634 FMap F (λ r → proj₁ r (proj₂ r)) (FMap F (map id (λ r → proj₁ r (proj₂ r))) ( φ ( u , (φ (v , w)))))
635 ≡⟨ {!!} ⟩
636 FMap F (λ r → proj₁ r (proj₂ r)) (φ (FMap F id u , FMap F (λ r → proj₁ r (proj₂ r)) (φ (v , w))))
637 ≡⟨ {!!} ⟩
638 FMap F (λ r → proj₁ r (proj₂ r)) (φ (u , FMap F (λ r → proj₁ r (proj₂ r)) (φ (v , w))))
598 639
599 where 640 where
600 open Relation.Binary.PropositionalEquality.≡-Reasoning 641 open Relation.Binary.PropositionalEquality.≡-Reasoning
601 homomorphism : { a b : Obj Sets } { f : Hom Sets a b } { x : a } → pure f <*> pure x ≡ pure (f x) 642 homomorphism : { a b : Obj Sets } { f : Hom Sets a b } { x : a } → pure f <*> pure x ≡ pure (f x)
602 homomorphism = {!!} 643 homomorphism = {!!}