comparison monoidal.agda @ 713:5e101ee6dab9

identity done
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Thu, 23 Nov 2017 18:24:44 +0900
parents 9092874a0633
children bc21e89cd273
comparison
equal deleted inserted replaced
712:9092874a0633 713:5e101ee6dab9
352 mρiso : {a : Obj Sets} (x : a ⊗ One ) → (Sets [ mρ← o mρ→ ]) x ≡ id1 Sets (a ⊗ One) x 352 mρiso : {a : Obj Sets} (x : a ⊗ One ) → (Sets [ mρ← o mρ→ ]) x ≡ id1 Sets (a ⊗ One) x
353 mρiso (_ , OneObj ) = refl 353 mρiso (_ , OneObj ) = refl
354 354
355 ≡-cong = Relation.Binary.PropositionalEquality.cong 355 ≡-cong = Relation.Binary.PropositionalEquality.cong
356 356
357
358 record IsHaskellMonoidalFunctor {c₁ : Level} ( F : Functor (Sets {c₁}) (Sets {c₁}) )
359 ( unit : FObj F One )
360 ( φ : {a b : Obj Sets} → Hom Sets ((FObj F a) * (FObj F b )) ( FObj F ( a * b ) ) )
361 : Set (suc (suc c₁)) where
362 isM : IsMonoidal (Sets {c₁}) One SetsTensorProduct
363 isM = Monoidal.isMonoidal MonoidalSets
364 open IsMonoidal
365 field
366 law1 : { 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)
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))
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
372
357 record HaskellMonoidalFunctor {c₁ : Level} ( f : Functor (Sets {c₁}) (Sets {c₁}) ) 373 record HaskellMonoidalFunctor {c₁ : Level} ( f : Functor (Sets {c₁}) (Sets {c₁}) )
358 : Set (suc (suc c₁)) where 374 : Set (suc (suc c₁)) where
359 field 375 field
360 unit : FObj f One 376 unit : FObj f One
361 φ : {a b : Obj Sets} → Hom Sets ((FObj f a) * (FObj f b )) ( FObj f ( a * b ) ) 377 φ : {a b : Obj Sets} → Hom Sets ((FObj f a) * (FObj f b )) ( FObj f ( a * b ) )
362 ** : {a b : Obj Sets} → FObj f a → FObj f b → FObj f ( a * b ) 378 ** : {a b : Obj Sets} → FObj f a → FObj f b → FObj f ( a * b )
363 ** x y = φ ( x , y ) 379 ** x y = φ ( x , y )
364 380
365 lemma0 : {c : Level} ( F : Functor (Sets {c}) (Sets {c}) ) → HaskellMonoidalFunctor F → MonoidalFunctor {_} {c} {_} {Sets} {Sets} MonoidalSets MonoidalSets 381 lemma0 : {c : Level} ( F : Functor (Sets {c}) (Sets {c}) ) → (mf : HaskellMonoidalFunctor F )
366 lemma0 F mf = record { 382 → IsHaskellMonoidalFunctor F ( HaskellMonoidalFunctor.unit mf ) ( HaskellMonoidalFunctor.φ mf )
383 → MonoidalFunctor {_} {c} {_} {Sets} {Sets} MonoidalSets MonoidalSets
384 lemma0 F mf ismf = record {
367 MF = F 385 MF = F
368 ; ψ = λ _ → HaskellMonoidalFunctor.unit mf 386 ; ψ = λ _ → HaskellMonoidalFunctor.unit mf
369 ; isMonodailFunctor = record { 387 ; isMonodailFunctor = record {
370 φab = record { TMap = λ x → φ ; isNTrans = record { commute = comm0 } } 388 φab = record { TMap = λ x → φ ; isNTrans = record { commute = comm0 } }
371 ; associativity = λ {a b c} → comm1 {a} {b} {c} 389 ; associativity = λ {a b c} → comm1 {a} {b} {c}
390 (FMap (Functor⊗ Sets Sets MonoidalSets F) (f , g) ) (φ (x , y)) 408 (FMap (Functor⊗ Sets Sets MonoidalSets F) (f , g) ) (φ (x , y))
391 ≡⟨⟩ 409 ≡⟨⟩
392 (FMap F ( f □ g ) ) (φ (x , y)) 410 (FMap F ( f □ g ) ) (φ (x , y))
393 ≡⟨⟩ 411 ≡⟨⟩
394 FMap F ( map f g ) (φ (x , y)) 412 FMap F ( map f g ) (φ (x , y))
395 ≡⟨ {!!} ⟩ 413 ≡⟨ IsHaskellMonoidalFunctor.law1 ismf ⟩
396 φ ( FMap F f x , FMap F g y ) 414 φ ( FMap F f x , FMap F g y )
397 ≡⟨⟩ 415 ≡⟨⟩
398 φ ( ( FMap F f □ FMap F g ) (x , y) ) 416 φ ( ( FMap F f □ FMap F g ) (x , y) )
399 ≡⟨⟩ 417 ≡⟨⟩
400 φ ((FMap (Functor● Sets Sets MonoidalSets F) (f , g) ) (x , y) ) 418 φ ((FMap (Functor● Sets Sets MonoidalSets F) (f , g) ) (x , y) )
401 419
402 where 420 where
403 open import Relation.Binary.PropositionalEquality 421 open Relation.Binary.PropositionalEquality.≡-Reasoning
404 open ≡-Reasoning
405 comm0 : {a b : Obj (Sets × Sets)} { f : Hom (Sets × Sets) a b} → Sets [ Sets [ FMap (Functor⊗ Sets Sets MonoidalSets F) f o φ ] 422 comm0 : {a b : Obj (Sets × Sets)} { f : Hom (Sets × Sets) a b} → Sets [ Sets [ FMap (Functor⊗ Sets Sets MonoidalSets F) f o φ ]
406 ≈ Sets [ φ o FMap (Functor● Sets Sets MonoidalSets F) f ] ] 423 ≈ Sets [ φ o FMap (Functor● Sets Sets MonoidalSets F) f ] ]
407 comm0 {a} {b} {f} = extensionality Sets ( λ (x : ( FObj F (proj₁ a) * FObj F (proj₂ a)) ) → comm00 x ) 424 comm0 {a} {b} {f} = extensionality Sets ( λ (x : ( FObj F (proj₁ a) * FObj F (proj₂ a)) ) → comm00 x )
408 comm10 : {a b c : Obj Sets} → (x : ((FObj F a ⊗ FObj F b) ⊗ FObj F c) ) → (Sets [ φ o Sets [ id1 Sets (FObj F a) □ φ o Iso.≅→ (mα-iso isM) ] ]) x ≡ 425 comm10 : {a b c : Obj Sets} → (x : ((FObj F a ⊗ FObj F b) ⊗ FObj F c) ) → (Sets [ φ o Sets [ id1 Sets (FObj F a) □ φ o Iso.≅→ (mα-iso isM) ] ]) x ≡
409 (Sets [ FMap F (Iso.≅→ (mα-iso isM)) o Sets [ φ o φ □ id1 Sets (FObj F c) ] ]) x 426 (Sets [ FMap F (Iso.≅→ (mα-iso isM)) o Sets [ φ o φ □ id1 Sets (FObj F c) ] ]) x
410 comm10 {x} {y} {f} ((a , b) , c ) = begin 427 comm10 {x} {y} {f} ((a , b) , c ) = begin
411 φ (( id1 Sets (FObj F x) □ φ ) ( ( Iso.≅→ (mα-iso isM) ) ((a , b) , c))) 428 φ (( id1 Sets (FObj F x) □ φ ) ( ( Iso.≅→ (mα-iso isM) ) ((a , b) , c)))
412 ≡⟨⟩ 429 ≡⟨⟩
413 φ ( a , φ (b , c)) 430 φ ( a , φ (b , c))
414 ≡⟨ {!!} ⟩ 431 ≡⟨ IsHaskellMonoidalFunctor.law2 ismf ⟩
415 ( FMap F (Iso.≅→ (mα-iso isM))) (φ (( φ (a , b)) , c )) 432 ( FMap F (Iso.≅→ (mα-iso isM))) (φ (( φ (a , b)) , c ))
416 ≡⟨⟩ 433 ≡⟨⟩
417 ( FMap F (Iso.≅→ (mα-iso isM))) (φ (( φ □ id1 Sets (FObj F f) ) ((a , b) , c))) 434 ( FMap F (Iso.≅→ (mα-iso isM))) (φ (( φ □ id1 Sets (FObj F f) ) ((a , b) , c)))
418 435
419 where 436 where
420 open import Relation.Binary.PropositionalEquality 437 open Relation.Binary.PropositionalEquality.≡-Reasoning
421 open ≡-Reasoning
422 comm1 : {a b c : Obj Sets} → Sets [ Sets [ φ 438 comm1 : {a b c : Obj Sets} → Sets [ Sets [ φ
423 o Sets [ (id1 Sets (FObj F a) □ φ ) o Iso.≅→ (mα-iso isM) ] ] 439 o Sets [ (id1 Sets (FObj F a) □ φ ) o Iso.≅→ (mα-iso isM) ] ]
424 ≈ Sets [ FMap F (Iso.≅→ (mα-iso isM)) o Sets [ φ o (φ □ id1 Sets (FObj F c)) ] ] ] 440 ≈ Sets [ FMap F (Iso.≅→ (mα-iso isM)) o Sets [ φ o (φ □ id1 Sets (FObj F c)) ] ] ]
425 comm1 {a} {b} {c} = extensionality Sets ( λ x → comm10 x ) 441 comm1 {a} {b} {c} = extensionality Sets ( λ x → comm10 x )
426 comm20 : {a b : Obj Sets} ( x : FObj F a * One ) → ( Sets [ 442 comm20 : {a b : Obj Sets} ( x : FObj F a * One ) → ( Sets [
427 FMap F (Iso.≅→ (mρ-iso isM)) o Sets [ φ o 443 FMap F (Iso.≅→ (mρ-iso isM)) o Sets [ φ o
428 FMap (m-bi MonoidalSets) (id1 Sets (FObj F a) , (λ _ → unit )) ] ] ) x ≡ Iso.≅→ (mρ-iso isM) x 444 FMap (m-bi MonoidalSets) (id1 Sets (FObj F a) , (λ _ → unit )) ] ] ) x ≡ Iso.≅→ (mρ-iso isM) x
429 comm20 {a} {b} (x , OneObj ) = begin 445 comm20 {a} {b} (x , OneObj ) = begin
430 (FMap F (Iso.≅→ (mρ-iso isM))) ( φ ( x , unit ) ) 446 (FMap F (Iso.≅→ (mρ-iso isM))) ( φ ( x , unit ) )
431 ≡⟨ {!!} ⟩ 447 ≡⟨ IsHaskellMonoidalFunctor.law3 ismf ⟩
432 x 448 x
433 ≡⟨⟩ 449 ≡⟨⟩
434 Iso.≅→ (mρ-iso isM) ( x , OneObj ) 450 Iso.≅→ (mρ-iso isM) ( x , OneObj )
435 451
436 where 452 where
437 open import Relation.Binary.PropositionalEquality 453 open Relation.Binary.PropositionalEquality.≡-Reasoning
438 open ≡-Reasoning
439 comm2 : {a b : Obj Sets} → Sets [ Sets [ 454 comm2 : {a b : Obj Sets} → Sets [ Sets [
440 FMap F (Iso.≅→ (mρ-iso isM)) o Sets [ φ o 455 FMap F (Iso.≅→ (mρ-iso isM)) o Sets [ φ o
441 FMap (m-bi MonoidalSets) (id1 Sets (FObj F a) , (λ _ → unit )) ] ] ≈ Iso.≅→ (mρ-iso isM) ] 456 FMap (m-bi MonoidalSets) (id1 Sets (FObj F a) , (λ _ → unit )) ] ] ≈ Iso.≅→ (mρ-iso isM) ]
442 comm2 {a} {b} = extensionality Sets ( λ x → comm20 {a} {b} x ) 457 comm2 {a} {b} = extensionality Sets ( λ x → comm20 {a} {b} x )
443 comm30 : {a b : Obj Sets} ( x : One * FObj F b ) → ( Sets [ 458 comm30 : {a b : Obj Sets} ( x : One * FObj F b ) → ( Sets [
444 FMap F (Iso.≅→ (mλ-iso isM)) o Sets [ φ o 459 FMap F (Iso.≅→ (mλ-iso isM)) o Sets [ φ o
445 FMap (m-bi MonoidalSets) ((λ _ → unit ) , id1 Sets (FObj F b) ) ] ] ) x ≡ Iso.≅→ (mλ-iso isM) x 460 FMap (m-bi MonoidalSets) ((λ _ → unit ) , id1 Sets (FObj F b) ) ] ] ) x ≡ Iso.≅→ (mλ-iso isM) x
446 comm30 {a} {b} ( OneObj , x) = begin 461 comm30 {a} {b} ( OneObj , x) = begin
447 (FMap F (Iso.≅→ (mλ-iso isM))) ( φ ( unit , x ) ) 462 (FMap F (Iso.≅→ (mλ-iso isM))) ( φ ( unit , x ) )
448 ≡⟨ {!!} ⟩ 463 ≡⟨ IsHaskellMonoidalFunctor.law4 ismf ⟩
449 x 464 x
450 ≡⟨⟩ 465 ≡⟨⟩
451 Iso.≅→ (mλ-iso isM) ( OneObj , x ) 466 Iso.≅→ (mλ-iso isM) ( OneObj , x )
452 467
453 where 468 where
454 open import Relation.Binary.PropositionalEquality 469 open Relation.Binary.PropositionalEquality.≡-Reasoning
455 open ≡-Reasoning
456 comm3 : {a b : Obj Sets} → Sets [ Sets [ FMap F (Iso.≅→ (mλ-iso isM)) o 470 comm3 : {a b : Obj Sets} → Sets [ Sets [ FMap F (Iso.≅→ (mλ-iso isM)) o
457 Sets [ φ o FMap (m-bi MonoidalSets) ((λ _ → unit ) , id1 Sets (FObj F b)) ] ] ≈ Iso.≅→ (mλ-iso isM) ] 471 Sets [ φ o FMap (m-bi MonoidalSets) ((λ _ → unit ) , id1 Sets (FObj F b)) ] ] ≈ Iso.≅→ (mλ-iso isM) ]
458 comm3 {a} {b} = extensionality Sets ( λ x → comm30 {a} {b} x ) 472 comm3 {a} {b} = extensionality Sets ( λ x → comm30 {a} {b} x )
459 473
460 474
461 record Applicative {c₁ : Level} ( f : Functor (Sets {c₁}) (Sets {c₁}) ) 475
476 record IsApplicative {c₁ : Level} ( f : Functor (Sets {c₁}) (Sets {c₁}) )
477 ( pure : {a : Obj Sets} → Hom Sets a ( FObj f a ) )
478 ( _<*>_ : {a b : Obj Sets} → FObj f ( a → b ) → FObj f a → FObj f b )
462 : Set (suc (suc c₁)) where 479 : Set (suc (suc c₁)) where
463 field 480 _・_ : { a b c : Obj (Sets {c₁} ) } → (b → c) → (a → b) → a → c
464 pure : {a : Obj Sets} → Hom Sets a ( FObj f a ) 481 _・_ f g = λ x → f ( g x )
465 <*> : {a b : Obj Sets} → FObj f ( a → b ) → FObj f a → FObj f b 482 field
483 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 }
485 → (( 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)
487 interchange : { a b : Obj Sets } { u : FObj f ( a → b ) } { x : a } → u <*> pure x ≡ pure (λ f → f x) <*> u
488
489 record Applicative {c₁ : Level} ( F : Functor (Sets {c₁}) (Sets {c₁}) )
490 : Set (suc (suc c₁)) where
491 field
492 pure : {a : Obj Sets} → Hom Sets a ( FObj F a )
493 <*> : {a b : Obj Sets} → FObj F ( a → b ) → FObj F a → FObj F b
466 -- should have Applicative law 494 -- should have Applicative law
467 495
468 lemma1 : {c₁ : Level} ( f : Functor (Sets {c₁}) (Sets {c₁}) ) → Applicative f → HaskellMonoidalFunctor f 496 lemma1 : {c₁ : Level} ( F : Functor (Sets {c₁}) (Sets {c₁}) ) → Applicative F → HaskellMonoidalFunctor F
469 lemma1 f app = record { unit = unit ; φ = φ } 497 lemma1 F app = record { unit = unit ; φ = φ }
470 where 498 where
471 open Applicative 499 open Applicative
472 unit : FObj f One 500 unit : FObj F One
473 unit = pure app OneObj 501 unit = pure app OneObj
474 φ : {a b : Obj Sets} → Hom Sets ((FObj f a) * (FObj f b )) ( FObj f ( a * b ) ) 502 φ : {a b : Obj Sets} → Hom Sets ((FObj F a) * (FObj F b )) ( FObj F ( a * b ) )
475 φ {a} {b} ( x , y ) = <*> app (FMap f (λ j k → (j , k)) x) y 503 φ {a} {b} ( x , y ) = <*> app (FMap F (λ j k → (j , k)) x) y
476 504
477 lemma2 : {c₁ : Level} ( f : Functor (Sets {c₁}) (Sets {c₁}) ) → HaskellMonoidalFunctor f → Applicative f 505 lemma2 : {c₁ : Level} ( F : Functor (Sets {c₁}) (Sets {c₁}) ) → HaskellMonoidalFunctor F → Applicative F
478 lemma2 f mono = record { pure = pure ; <*> = <*> } 506 lemma2 F mono = record { pure = pure ; <*> = <*> }
479 where 507 where
480 open HaskellMonoidalFunctor 508 open HaskellMonoidalFunctor
481 pure : {a : Obj Sets} → Hom Sets a ( FObj f a ) 509 pure : {a : Obj Sets} → Hom Sets a ( FObj F a )
482 pure {a} x = FMap f ( λ y → x ) (unit mono) 510 pure {a} x = FMap F ( λ y → x ) (unit mono)
483 <*> : {a b : Obj Sets} → FObj f ( a → b ) → FObj f a → FObj f b -- ** mono x y 511 <*> : {a b : Obj Sets} → FObj F ( a → b ) → FObj F a → FObj F b -- ** mono x y
484 <*> {a} {b} x y = FMap f ( λ a→b*b → ( proj₁ a→b*b ) ( proj₂ a→b*b ) ) (φ mono ( x , y )) 512 <*> {a} {b} x y = FMap F ( λ a→b*b → ( proj₁ a→b*b ) ( proj₂ a→b*b ) ) (φ mono ( x , y ))
513
514 open Relation.Binary.PropositionalEquality
515
516 HaskellMonoidal→Applicative : {c₁ : Level} ( F : Functor (Sets {c₁}) (Sets {c₁}) )
517 ( unit : FObj F One )
518 ( φ : {a b : Obj Sets} → Hom Sets ((FObj F a) * (FObj F b )) ( FObj F ( a * b ) ) )
519 ( mono : IsHaskellMonoidalFunctor F unit φ )
520 → 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 )))
521 HaskellMonoidal→Applicative {c₁} F unit φ mono = record {
522 identity = identity
523 ; composition = composition
524 ; homomorphism = homomorphism
525 ; interchange = interchange
526 }
527 where
528 isM : IsMonoidal (Sets {c₁}) One SetsTensorProduct
529 isM = Monoidal.isMonoidal MonoidalSets
530 open IsMonoidal
531 pure : {a : Obj Sets} → Hom Sets a ( FObj F a )
532 pure {a} x = FMap F ( λ y → x ) (unit )
533 _<*>_ : {a b : Obj Sets} → FObj F ( a → b ) → FObj F a → FObj F b
534 _<*>_ {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
536 _・_ f g = λ x → f ( g x )
537 identity : { a : Obj Sets } { u : FObj F a } → pure ( id1 Sets a ) <*> u ≡ u
538 identity {a} {u} = begin
539 pure ( id1 Sets a ) <*> u
540 ≡⟨⟩
541 ( FMap F ( λ a→b*b → ( proj₁ a→b*b ) ( proj₂ a→b*b )) ) ( φ ( FMap F ( λ y → id1 Sets a ) 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 )))
543 ( 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 ) )
545 ≡⟨ 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 )))
547 ≡⟨ ≡-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 ) )
549 ≡⟨⟩
550 FMap F (λ x → proj₂ x ) (φ (unit , u ) )
551 ≡⟨⟩
552 FMap F (Iso.≅→ (mλ-iso isM)) (φ (unit , u ))
553 ≡⟨ IsHaskellMonoidalFunctor.law4 mono ⟩
554 u
555
556 where
557 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 }
559 → (( pure _・_ <*> u ) <*> v ) <*> w ≡ u <*> (v <*> w)
560 composition {a} {b} {c} {u} {v} {w} = begin
561 ?
562 ≡⟨ ? ⟩
563 ?
564
565 where
566 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)
568 homomorphism = {!!}
569 interchange : { a b : Obj Sets } { u : FObj F ( a → b ) } { x : a } → u <*> pure x ≡ pure (λ f → f x) <*> u
570 interchange = {!!}