Slide 1

Slide 1 text

Swiftͱ࿦ཧ ʙͦͯ͠ؼ͖ͬͯͨݍ࿦ʙ 2019/09/06 iOSDC 2019 Yasuhiro Inami / @inamiy

Slide 2

Slide 2 text

࿦ཧֶ ࢥߟͷಓےΛʮਅཧ 5SVUI ʯ ͱ͍͏֓೦Λ༻͍ͯઆ໌͢Δֶ໰

Slide 3

Slide 3 text

J04%$͸J04ΧϯϑΝϨϯε J04ΧϯϑΝϨϯε͸ͨͷ͠ʔ ΑͬͯɺJ04%$͸ͨͷ͠ʔ

Slide 4

Slide 4 text

΋͠"ͳΒ͹# ΋͠#ͳΒ͹$ Αͬͯɺ΋͠"ͳΒ͹$

Slide 5

Slide 5 text

2͜Ε͸ৗʹਖ਼͍͠ʁ

Slide 6

Slide 6 text

൴ࢯ͸ΰϦϥ ΰϦϥ͸Πέϝϯ Αͬͯɺ൴ࢯ͸Πέϝϯ

Slide 7

Slide 7 text

No content

Slide 8

Slide 8 text

ʮਖ਼͍͠ʯͱ͸ͳΜͧ΍ʁ ԿΛਖ਼͍͠ͱߟ͑ɺࢥߟΛల։͍͚ͯ͠Δ͔ʁ

Slide 9

Slide 9 text

࿦ཧͷʮਖ਼͠͞ʯΛ෼͚ͯߟ͑Δ ࿦ཧͷʮܗʯ͕ਖ਼͍͠ ࿦ཧͷʮ಺༰ʯ͕ਖ਼͍͠

Slide 10

Slide 10 text

ߏจ࿦(Syntax) ه߸తͳ࿦ཧࣜͱਪ࿦نଇΛ࢖ͬͯɺ ʢػցతʹʣ৽͍͠࿦ཧࣜΛܭࢉʢূ໌ʣ͢Δ

Slide 11

Slide 11 text

࿦ཧͷύλʔϯ "ͳΒ͹# "ͱ# "·ͨ͸# "Ͱͳ͍ A → B A ∧ B A ∨ B ¬A

Slide 12

Slide 12 text

໋୊ͱ࿦ཧࣜ ࿦ཧه߸ ໋୊ม߲ ໋୊ఆ߲ ∧ , ∨ , ¬, → A, B, C, ⋯ ⊤ , ⊥

Slide 13

Slide 13 text

࿦ཧࣜͷྫ A ∧ (B → C) (A ∨ B) ∧ (C → D) (¬A → ⊥ ) ∨ (¬B ∧ ⊤ )

Slide 14

Slide 14 text

ਪ࿦نଇͷྫɿϞʔμεϙωϯε A → B A B جຊతͳਪ࿦نଇΛ ެཧܥͱͯ͠ఆΊΔ લఏ̍ɿ"ͳΒ͹# લఏ̎ɿ"Ͱ͋Δ ݁࿦ɹɿ#Ͱ͋Δ

Slide 15

Slide 15 text

ূ໌ਤͷྫʢਪ࿦نଇͷద༻աఔͷ໦ߏ଄ʣ

Slide 16

Slide 16 text

ҙຯ࿦(Semantics) ࿦ཧࣜʹʮਅʯ·ͨ͸ʮِʯͷ ਅཧ஋Λ෇༩ͯ͠ղऍ͢Δ

Slide 17

Slide 17 text

࿦ཧࣜʢه߸ʣˠਅཧ஋ͷׂΓ౰ͯ A B ¬A A∧B A∨B A→B 1 1 0 1 1 1 1 0 0 0 1 0 0 1 1 0 1 1 0 0 1 0 0 1 ෇஋ ਅ ِ A → B A ∧ B A ∨ B ¬A ֤ม߲ͷਅِΛܾΊΔ ʹߦΛબͿ

Slide 18

Slide 18 text

ਅཧ஋දͷྫ A B ¬A ¬A∨B A→B (¬A∨B) → (A→B) (A→B) → (¬A∨B) 1 1 0 1 1 1 1 1 0 0 0 0 1 1 0 1 1 1 1 1 1 0 0 1 1 1 1 1 ৗʹʹͳΔ ࿦ཧ͕ࣜଘࡏ

Slide 19

Slide 19 text

(A → B) ↔ (¬A ∨ B) ͸ɺ໋୊"ɺ#ʹΑΒͣɺৗʹਅ ߃ਅ τʔτϩδʔ P ↔ Q := (P → Q) ∧ (Q → P)

Slide 20

Slide 20 text

߃ਅʢτʔτϩδʔʣͷྫ ྗͱ͸ύϫʔ ຖ೔͕ΤϒϦσΠ A → A ಉҰ཯

Slide 21

Slide 21 text

߃ਅʢτʔτϩδʔʣͷྫ ੈͷதʹ͸छྨͷஉ͔͠ډͳ͍ Զ͔ɺԶҎ֎͔ A ∨ ¬A ഉத཯

Slide 22

Slide 22 text

߃ਅʢτʔτϩδʔʣͷྫ (A → B) → ((B → C) → (A → C)) ((((A → B) → (¬C → ¬D)) → C) → E) → ((E → A) → (D → A)) ¬(A ∧ ¬A) (A ∧ ¬A) → B ((A → B) → A) → A ¬¬A → A (A → B) ↔ (¬B → ¬A) ¬(A ∧ B) ↔ (¬A ∨ ¬B) ¬(A ∨ B) ↔ (¬A ∧ ¬B)

Slide 23

Slide 23 text

(A → B) → ((B → C) → (A → C)) ((((A → B) → (¬C → ¬D)) → C) → E) → ((E → A) → (D → A)) ¬(A ∧ ¬A) (A ∧ ¬A) → B ((A → B) → A) → A ¬¬A → A (A → B) ↔ (¬B → ¬A) ¬(A ∧ B) ↔ (¬A ∨ ¬B) ¬(A ∨ B) ↔ (¬A ∧ ¬B) ߃ਅʢτʔτϩδʔʣͷྫ ໃ६཯ രൃ཯ ೋॏ൱ఆআڈ ύʔεͷ๏ଇ ରۮ཯ υɾϞϧΨϯͷ๏ଇ ਪҠ཯ ϝϨσΟεͷެཧ

Slide 24

Slide 24 text

߃ਅʢτʔτϩδʔʣͷྫ ߃ਅͳ࿦ཧࣜ͸ແݶʹଘࡏ͢Δ
 ˠ༗ݶͷنଇ͔Βಋ͖ग़ͤͳ͍͔ʁ A → ¬¬A A → ¬¬¬¬A A → ¬¬¬¬¬¬A ⋯

Slide 25

Slide 25 text

߃ਅͳ࿦ཧ͔ࣜΒ ܗࣜతମܥΛߟ͑Δ

Slide 26

Slide 26 text

ܗࣜతମܥʢه߸ʴจ๏ʴެཧʴਪ࿦نଇʣ ެཧʹલఏͱͯ͠ಋೖ͞ΕΔجຊతͳԾఆ ʢҰ෦ͷ߃ਅͳ࿦ཧࣜʣ ਪ࿦نଇʹ࿦ཧ͔ࣜΒଞͷ࿦ཧࣜΛಋ͘͜ͱ ެཧͱਪ࿦نଇʢܗࣜతମܥʣΛ࢖ͬͯ ͢΂ͯͷ߃ਅͳ࿦ཧࣜʢఆཧʣΛಋ͘

Slide 27

Slide 27 text

ܗࣜతମܥͷछྨ w ήϯπΣϯྲྀ w ࣗવԋ៷ʜ೔ৗͷਪ࿦ʹ͍ۙɺެཧͳ͠ɺਪ࿦نଇ͕ଟ͍ w γʔΫΤϯτܭࢉʜެཧ͕̍ͭʢಉҰੑʣɺਪ࿦نଇ͕ଟ͍ w ώϧϕϧτྲྀ w ެཧ͕ଟ͍ɺਪ࿦نଇ͕̍ͭʢϞʔμεϙωϯεʣ w ܗࣜతମܥ͔Βಋग़͞ΕΔ࿦ཧࣜʢఆཧʣ͸ɺ߃ਅʢ݈શੑʣ

Slide 28

Slide 28 text

ήϯπΣϯྲྀɾࣗવԋ៷ A B A ∧ B A ∧ B A A ∧ B B A A ∨ B B A ∨ B A ∨ B C C C A → B A B B A → B ⊥ ¬A A ¬A ⊥ ⊥ A ⋮ [A] ¬¬A A ⋮ [A] ⋮ [B] ⋮ [A] <">ʜ"ͷԾఆΛด͡Δ

Slide 29

Slide 29 text

ήϯπΣϯྲྀɾࣗવԋ៷ʢγʔΫΤϯτܭࢉ෩ʣ Γ ⊢ A Γ ⊢ B Γ ⊢ A ∧ B Γ ⊢ A ∧ B Γ ⊢ A Γ ⊢ A ∧ B Γ ⊢ B Γ ⊢ A Γ ⊢ A ∨ B Γ ⊢ B Γ ⊢ A ∨ B Γ ⊢ A ∨ B Γ, A ⊢ C Γ, B ⊢ C Γ ⊢ C Γ ⊢ A → B Γ ⊢ A Γ ⊢ B Γ, A ⊢ B Γ ⊢ A → B Γ, A ⊢ ⊥ Γ ⊢ ¬A Γ ⊢ A Γ ⊢ ¬A Γ ⊢ ⊥ Γ ⊢ ⊥ Γ ⊢ A Γ ⊢ ¬¬A Γ ⊢ A A ∈ Γ Γ ⊢ A ϵ⊢"ʜ࿦ཧࣜͷ༗ݶྻϵ͔Βɺ࿦ཧࣜ"͕ূ໌Ͱ͖Δ

Slide 30

Slide 30 text

ώϧϕϧτྲྀ A → B A B B → (A → B) (A → (B → C)) → ((A → B) → (A → C)) ¬¬A → A A → A ∨ B ⊥ → A B → A ∨ B (A → C) → ((B → C) → ((A ∨ B) → C)) A ∧ B → A A ∧ B → B A → (B → (A ∧ B)) ਪ࿦نଇ͸ ϞʔμεϙωϯεͷΈ (A → ¬A) → ¬A ¬A → (A → B)

Slide 31

Slide 31 text

ͦΕͱͳ͘
 ʮ4XJGUϓϩάϥϛϯάʯ ͬΆ͍

Slide 32

Slide 32 text

࿦ཧ˱4XJGUϓϩάϥϛϯά A → B A ∧ B A ∨ B ¬A := A → ⊥ ରԠ 㱻 ؔ਺ܕ ௚ੵܕ ௚࿨ܕ ⊥ Either Never typealias Not = (A) -> Never (A, B) (A) -> B ϘτϜܕ 㲄Λ࢖ͬͯ ൱ఆΛఆٛͰ͖Δ

Slide 33

Slide 33 text

ʲ࠶ܝʳήϯπΣϯྲྀɾࣗવԋ៷ A B A ∧ B A ∧ B A A ∧ B B A A ∨ B B A ∨ B A ∨ B C C C A → B A B B A → B ⊥ ¬A A ¬A ⊥ ⊥ A ⋮ [A] ¬¬A A ⋮ [A] ⋮ [B] ⋮ [A]

Slide 34

Slide 34 text

Slide 38

Slide 38 text

Slide 39

Slide 39 text

ʲ࠶ܝʳώϧϕϧτྲྀ B → (A → B) (A → (B → C)) → ((A → B) → (A → C)) A → A ∨ B B → A ∨ B (A → C) → ((B → C) → ((A ∨ B) → C)) A ∧ B → A A ∧ B → B A → (B → (A ∧ B)) A → B A B ਪ࿦نଇ͸ ϞʔμεϙωϯεͷΈ ¬¬A → A ⊥ → A (A → ¬A) → ¬A ¬A → (A → B)

Slide 40

Slide 40 text

ʲ࠶ܝʳώϧϕϧτྲྀ (A → C) → ((B → C) → ((A ∨ B) → C)) A → B A B A → A ∨ B B → A ∨ B A ∧ B → A A ∧ B → B A → (B → (A ∧ B)) ਪ࿦نଇ͸ ϞʔμεϙωϯεͷΈ ¬¬A → A ⊥ → A (A → ¬A) → ¬A ¬A → (A → B) (A → (B → C)) → ((A → B) → (A → C)) A ∨ B := ¬A → B := ¬B → A A ∧ B := ¬(A → ¬B) := ¬(B → ¬A) ¬A := A → ⊥ /05&ˮ ˭ ™͸ɺˠͱ˵ͷΈΛ࢖ͬͯهड़Ͱ͖Δ B → (A → B)

Slide 41

Slide 41 text

ίϯϏωʔλ࿦ཧ Kxy = x Sxyz = xz(yz) I = SKK K : X → Y → X S : (Z → Y → X) → (Z → Y) → Z → X I : X → X ஋ͷؔ਺Խ ҰൠԽ 
 3FBEFSϞφυͷQVSF Ϟʔμεϙωϯε ͷҰൠԽ
 3FBEFSϞφυͷBQ

Slide 44

Slide 44 text

࿦ཧ ⇕ 4XJGUϓϩάϥϛϯά

Slide 45

Slide 45 text

No content

Slide 46

Slide 46 text

No content

Slide 47

Slide 47 text

((A → B) → A) → A A ∨ ¬A ¬¬A → A ¬(A ∧ B) → (¬A ∨ ¬B) (A → B) → (¬A ∨ B) (¬B → ¬A) → (A → B) ഉத཯ ೋॏ൱ఆআڈ ରۮ཯ ൱ఆআڈWFS υɾϞϧΨϯͷ๏ଇ ™㱸 ؚ࣮࣭ҙ ύʔεͷ๏ଇ /05& ʮٯʯ͸߃ਅ 4XJGUͰ࣮૷Ͱ͖ͳ͍߃ਅͳ࿦ཧࣜ

Slide 48

Slide 48 text

/// `A ∨ ¬A` (Law of excluded middle) func excludedMiddle() -> Either> { fatalError("Can't impl in Swift”) }

Slide 49

Slide 49 text

/// `A ∨ ¬A` (Law of excluded middle) func excludedMiddle() -> Either> { fatalError("Can't impl in Swift”) } ANY LANGUAGES!

Slide 52

Slide 52 text

͜Ε·Ͱͷ࿦ཧ͸ɾɾɾ ݹయ࿦ཧ ϒʔϧ࿦ཧ ࿦ཧࣜʹʮਅʯ·ͨ͸ʮِʯͷ
 ਅཧ஋Λ෇༩ͯ͠ղऍ͢Δ

Slide 53

Slide 53 text

ݹయ࿦ཧʹ͓͚Δʮˠʯ A → B Bool true false USVFPSGBMTF ௨Γ͔͠ͳ͍

Slide 54

Slide 54 text

4XJGUϓϩάϥϛϯάʹ͓͚Δʮˠʯ Types Int Bool (A) -> B (Int)->Bool ৽͍͠ܕ͕ ߏ੒͞ΕΔ

Slide 55

Slide 55 text

ݹయ࿦ཧ ϒʔϧ࿦ཧ ˣ
 ߏ੒త࿦ཧ
 ௚؍ओٛ࿦ཧ ഉத཯΍ೋॏ൱ఆআڈ͕ ੒Γཱͨͳ͘ͳΔ

Slide 56

Slide 56 text

௚؍ओٛ࿦ཧ ⇕ 4XJGUϓϩάϥϛϯά

Slide 57

Slide 57 text

௚؍ओ໋ٛ୊࿦ཧʹ͓͚Δ ࣗવԋ៷ ⇕ ୯७ܕ෇͖ϥϜμܭࢉ
 ؔ਺ܕϓϩάϥϛϯάͷཧ࿦తج൫

Slide 58

Slide 58 text

ܕͳ͠ϥϜμܭࢉʢུ֓ʣ t ::= x | λx . t | t t ʢม਺ʣ ʢλந৅ɺؔ਺ఆٛʣ ʢؔ਺ద༻ʣ λx . x λx . (λy . x) (λx . xx)(λx . xx) λ߲ͷྫ ϥϜμ߲

Slide 59

Slide 59 text

ܕ෇͖ϥϜμܭࢉʢུ֓ʣ T ::= X | T → T ʢܕม਺ʣ ʢؔ਺ܕʣ t ::= x | λ(x : T) . t | t t ʢม਺ʣ ʢλந৅ʣ ʢؔ਺ద༻ʣ : T ϥϜμ߲ ܕɹ

Slide 60

Slide 60 text

ܕ෇͖ϥϜμܭࢉʢུ֓ʣ A ∈ Γ Γ ⊢ A Γ, A ⊢ B Γ ⊢ A → B Γ ⊢ A → B Γ ⊢ A Γ ⊢ B (x : A) ∈ Γ Γ ⊢ x : A Γ, x : A ⊢ t : B Γ ⊢ λ(x : A) . t : A → B Γ ⊢ t12 : A → B Γ ⊢ t1 : A Γ ⊢ t12 t1 : B ܕ෇͚نଇͷʮܕͷΈʯʹ஫໨͢Δͱʜ ࣗવԋ៷ͱ ಉ౳ λ߲ͷܕ෇͚نଇ ม਺ Еந৅ ؔ਺ద༻

Slide 61

Slide 61 text

௚؍ओ໋ٛ୊࿦ཧʹ͓͚Δ ࣗવԋ៷ ⇕ ୯७ܕ෇͖ϥϜμܭࢉ
 ؔ਺ܕϓϩάϥϛϯάͷཧ࿦తج൫ ΧϦʔɾϋϫʔυ ಉܕରԠ

Slide 62

Slide 62 text

ΧϦʔɾϋϫʔυಉܕରԠ ௚؍ओ໋ٛ୊࿦ཧʹ͓͚Δ
 ࣗવԋ៷ ୯७ ܕ෇͖ϥϜμܭࢉ
 ؔ਺ܕϓϩάϥϛϯά ໋୊ɾఆཧ ܕ ূ໌ਤ ϥϜμ߲ʢϓϩάϥϜʣ ؚҙಋೖ ϥϜμந৅ʢؔ਺ఆٛʣ Ϟʔμεϙωϯε ؔ਺ద༻ ެཧ άϩʔόϧม਺ Ծఆ ࣗ༝ม਺ ԾఆΛด͡Δ ଋറม਺ ଞͷ࿦ཧԋࢉ 㱸 㱹ͳͲ ͷ ֦ுͱಉܕରԠ΋Մೳ

Slide 63

Slide 63 text

௚؍ओٛ࿦ཧ
 ࿦ཧࣜʹʮՄೳੈքʯΛߟྀͨ͠ ʮਅʯʮِʯͷਅཧ஋Λ෇༩ͯ͠ղऍ͢Δ

Slide 64

Slide 64 text

௚؍ओٛ࿦ཧͱʮՄೳੈքʯʢ஌ࣝঢ়ଶʣ A 0 B 0 A 1 B 0 A 1 B 1

Slide 65

Slide 65 text

֤ੈքͱਅཧ஋ͷҨ఻ؔ܎ A 0 B 0 A 1 B 0 A 1 B 0 ͸ະདྷ΁Ҩ఻͢Δ ʹ໭Βͳ͍ ৽͍͠஌ݟ

Slide 66

Slide 66 text

֤ੈքͱਅཧ஋ͷҨ఻ؔ܎ A 0 ¬A 0 A 0 ¬A 1 A 0 ¬A 1 ™"ͷ৔߹ɺ ݱࡏ͔Βະདྷʹ͔͚ͯ" ʢ"ʹͳΔ͜ͱ͸ͳ͍ʣ Ҩ఻

Slide 67

Slide 67 text

A 0 ¬A 0 A 0 ¬A 1 A 0 ¬A 1 ™"ͷ৔߹ɺ ݱࡏ͔Βະདྷʹ͔͚ͯ" ʢ"ʹͳΔ͜ͱ͸ͳ͍ʣ Ҩ఻ ֤ੈքͱਅཧ஋දͷҨ఻ؔ܎ A ∨ ¬A ഉத཯͸߃ਅͰ͸ͳ͍

Slide 68

Slide 68 text

֤ੈքͱਅཧ஋ͷҨ఻ؔ܎ A → B 1 A 0 B 0 A → B 1 A 1 B 1 A → B 1 A 1 B 1 Ҩ఻ "͕ಘΒΕΔͱɺ
 #΋ࣗಈతʹಘΒΕΔ " #ʹ ͳΔ͜ͱ͸ͳ͍

Slide 69

Slide 69 text

֤ੈքͱਅཧ஋ͷҨ఻ؔ܎ "͕ಘΒΕΔͱɺ
 #΋ࣗಈతʹಘΒΕΔ A 0 B 0 A 1 B 0 A 1 B 1 A 0 B 1

Slide 70

Slide 70 text

ΫϦϓΩɾϞσϧʢࡶͳղઆʣ wΫϦϓΩɾϑϨʔϜʜˠˠͳͲͷੈքͷॱংू߹ wΫϦϓΩɾϞσϧʜϑϨʔϜͷ֤ੈքͷ্ʹҨ఻͢Δ
 ɹɹɹɹɹɹɹɹɹਅཧ஋ͷׂΓ౰ͯΛߦͬͨ΋ͷ w௚؍ओٛ࿦ཧʹ͓͚Δ߃ਅ
 ʜ೚ҙͷϑϨʔϜʴ೚ҙͷਅཧ஋ͷׂΓ౰ͯ
 ɹʹ೚ҙͷϞσϧʹ͓͍ͯਅʹͳΔ࿦ཧࣜͷ͜ͱ "͕ಘΒΕΔͱɺ
 #΋ࣗಈతʹಘΒΕΔ

Slide 71

Slide 71 text

ݹయ࿦ཧ˩௚؍ओٛ࿦ཧ ࠷খ࿦ཧ ௚؍ओٛ࿦ཧ ݹయ࿦ཧ A ∨ ¬A ⊥ → A → , ∧ , ∨ , ¬, ⊥ Λ࢖ͬͨ࿦ཧࣜ A → A ∨ B A ∧ B → A ໃ६཯ ഉத཯ ⋮ ʲ஫ҙʳ௚؍ओٛ࿦ཧ͕ഉத཯Λ௚઀ؚΉΘ͚Ͱ͸ͳ͍ʢ࣍ϖʔδࢀরʣ

Slide 72

Slide 72 text

άϦϕϯίͷఆཧɿݹయ࿦ཧˠ௚؍ओٛ࿦ཧ΁ͷຒΊࠐΈ ௚؍ओٛ࿦ཧ ݹయ࿦ཧ A ∨ ¬A ¬¬(A ∨ ¬A) ¬¬ ೋॏ൱ఆಋೖ ഉத཯ ೋॏ൱ఆഉத཯

Slide 73

Slide 73 text

((A → B) → A) → A A ∨ ¬A ¬¬A → A ¬(A ∧ B) → (¬A ∨ ¬B) (A → B) → (¬A ∨ B) (¬B → ¬A) → (A → B) ഉத཯ ೋॏ൱ఆআڈ ରۮ཯ ൱ఆআڈWFS υɾϞϧΨϯͷ๏ଇ ™㱸 ؚ࣮࣭ҙ ύʔεͷ๏ଇ ʲ࠶ܝʳ௚؍ओٛ࿦ཧͰ੒Γཱͨͳ͍࿦ཧࣜ /05& ʮٯʯ͸߃ਅ

Slide 74

Slide 74 text

¬¬(((A → B) → A) → A) ¬¬(A ∨ ¬A) ¬¬(¬¬A → A) ¬¬(¬(A ∧ B) → (¬A ∨ ¬B)) ¬¬((A → B) → (¬A ∨ B)) ¬¬((¬B → ¬A) → (A → B)) ௚؍ओٛ࿦ཧͰ߃ਅͳ࿦ཧࣜ ͢΂ͯ ௚؍ओٛ࿦ཧ Ͱ੒Γཱͭ

Slide 75

Slide 75 text

¬¬((A → B) → A) → ¬¬A ¬¬(A ∨ ¬A) ¬¬¬¬A → ¬¬A ¬¬¬(A ∧ B) → ¬¬(¬A ∨ ¬B) ¬¬(A → B) → ¬¬(¬A ∨ B) ¬¬(¬B → ¬A) → ¬¬(A → B) Tautologies in Intuitionistic Logic Using helper rule ¬¬(A → B) ¬¬A → ¬¬B

Slide 76

Slide 76 text

Slide 77

Slide 77 text

/// `¬¬¬¬A ===> ¬¬A` (Double negation elimination in IL) func doubleNegationElim_IL( _ notNotNotNotA: Not>>> ) -> Not> { Not> { notA in notNotNotNotA.f( Not>> { notNotA in notNotA.f(notA) } ) } }

Slide 80

Slide 80 text

ύʔεͷ๏ଇˠDBMMDD ¬¬(A → B) ¬¬A → ¬¬B ((A → ¬¬B) → ¬¬A) → ¬¬A ͜͜Ͱ Λ࢖͏ͱ ¬¬(A → B) A → ¬¬B ¬¬(((A → B) → A) → A) ύʔεͷ๏ଇ

Slide 81

Slide 81 text

/// Continuation. typealias Cont = (@escaping (A) -> R) -> R /// /// Call with Current Continuation. /// - Peirce: `((A → B) → A) → A` /// - CallCC: `((A → M) → M) → M` /// /// - Note: `callCC` is like control operators e.g. `goto`, `return`, `throw`. /// func callCC( _ f: @escaping (_ exit: @escaping (A) -> Cont) -> Cont ) -> Cont { { outer in f { a in { _ in outer(a) } }(outer) } }

Slide 82

Slide 82 text

func doubleNegationElim_callCC( _ doubleNegation: @escaping ( _ neg: @escaping (A) -> Cont ) -> Cont ) -> Cont { callCC { exit -> Cont in flatMap(doubleNegation(exit), absurd) } }

Slide 83

Slide 83 text

֊໋୊࿦ཧ
 ͢΂ͯʮ˲ʯͱଘࡏʮ˳ʯ

Slide 84

Slide 84 text

֊໋୊࿦ཧ A1 ∧ A2 ∧ ⋯ ≅ ∀X . X A1 ∨ A2 ∨ ⋯ ≅ ∃X . X (A1 → C) ∧ (A2 → C) ∧ ⋯ ≅ ∀X . (X → C) ʮ໋୊ʯͷશশྔԽ㱼ɺଘࡏྔԽ㱽
 ֊ड़ޠ࿦ཧͷʮ߲ʯͷྔԽͱҟͳΔͷͰ஫ҙ 㱸ͱ㱼 㱹ͱ㱽

Slide 85

Slide 85 text

֊໋୊࿦ཧͷਪ࿦نଇ ∀X . A(X) A(T) A(Y) ∀X . A(X) ∃X . A(X) ∀X . (A(X) → C) C A(T) ∃X . A(X) ͸ɹɹɹʹࢸΔԋ៷ͷԾఆ͢΂ͯͱɹɹɹͷதͰ ࣗ༝ม਺ͱͯ͠࢖ΘΕ͍ͯͳ͍ܕม਺ Y A(Y) A(X) ͸ɹɹʹ ୅ೖՄೳͳܕ T A

Slide 86

Slide 86 text

(A1 → C) ∧ (A2 → C) ∧ ⋯ ≅ ∀X . (X → C) let intToBool: (Int) -> Bool = { ... } let floatToBool: (Float) -> Bool = { ... } let strToBool: (String) -> Bool = { ... } // ... ͢΂ͯͷܕʹ͍ͭͯಉ͡Α͏ͳ࣮૷Λߦ͍͍ͨ // Swift ͷδΣωϦΫεʢଟ૬ؔ਺ʣΛ࢖͏ͱɺ // ্هͷॏෳίʔυΛ1ͭʹ·ͱΊͯந৅ԽͰ͖Δɻ func xToBool(_ x: X) -> Bool { ... }

Slide 87

Slide 87 text

˲ͱ˳ͷؔ܎ (A1 ∨ A2 ) → C ≅ (A1 → C) ∧ (A2 → C) (∃X . X) → C ≅ ∀X . (X → C) (A1 ∨ A2 ∨ ⋯) → C ≅ (A1 → C) ∧ (A2 → C) ∧ ⋯ (A → C) → ((B → C) → ((A ∨ B) → C)) ࢀߟɿ

Slide 88

Slide 88 text

∀X . (X → C) ≅ (∃X . X) → C func forallXToBool(_ x: X) -> Bool { anyToBool(x) } /// - Note: `∃X.X` is isomorphic to `Any`. func anyToBool(_ any: Any) -> Bool { forallXToBool(any) }

Slide 89

Slide 89 text

∀(X <: P) . (X → C) ≅ (∃(X <: P) . X) → C protocol P { var value: String { get } } struct AnyP: P { let value: String } func forallXProtocolToBool(_ x: X) -> Bool { // Generic func protocolToBool(x) } func protocolToBool(_ p: P) -> Bool { // Protocol func (dynamic) forallXProtocolToBool(AnyP(value: p.value)) }

Slide 90

Slide 90 text

∀(X <: P) . (X → C) ≅ (∃(X <: P) . X) → C // Reverse Opaque Result Type (static) func someProtocolToBool(_ p: some P) -> Bool { forallXProtocolToBool(p) } // ERROR: Isn’t supported yet in Swift 5.1

Slide 91

Slide 91 text

֊໋୊࿦ཧ ⇕ δΣωϦΫε ଟ૬ੑ Ұ෦ɺϓϩτίϧϕʔεʹஔ͖׵͑΋Մೳ

Slide 92

Slide 92 text

ϥϜμΩϡʔϒ

Slide 93

Slide 93 text

ϥϜμΩϡʔϒ ֊ ଟ૬ ϥϜμ ֊௚؍ओ໋ٛ୊࿦ཧ ܕʹґଘͨ͠஋ ଟ૬ؔ਺ ͕࡞ΕΔ ୯७ܕ෇͖ϥϜμ ֊௚؍ओ໋ٛ୊࿦ཧ ஋ʹґଘͨ͠஋ ߴ֊ؔ਺ ͕࡞ΕΔ ґଘܕ ֊௚؍ओٛड़ޠ࿦ཧ ஋ʹґଘͨ͠ܕ͕࡞ΕΔ ߴ֊ଟ૬ϥϜμ ߴ֊ΧΠϯυʴଟ૬ؔ਺ ߴ֊ΧΠϯυܕ ܕʹґଘͨ͠ܕ ߴ֊ͷܕؔ਺ ͕࡞ΕΔ

Slide 94

Slide 94 text

ϥϜμΩϡʔϒ 4XJGU͸ ΠϚίί ࠓճ ֶΜͩ͜ͱ

Slide 95

Slide 95 text

ϥϜμΩϡʔϒ ֊ ଟ૬ ϥϜμ ֊௚؍ओ໋ٛ୊࿦ཧ ܕʹґଘͨ͠஋ ଟ૬ؔ਺ ͕࡞ΕΔ ୯७ܕ෇͖ϥϜμ ௚؍ओ໋ٛ୊࿦ཧ ஋ʹґଘͨ͠஋ ௨ৗͷߴ֊ؔ਺ ͕࡞ΕΔ ґଘܕ ֊௚؍ओٛड़ޠ࿦ཧ ஋ʹґଘͨ͠ܕ͕࡞ΕΔ ߴ֊ଟ૬ϥϜμ ଟ૬ͳߴ֊ܕߏஙࢠ͕࡞ΕΔ ߴ֊ΧΠϯυܕ ܕʹґଘͨ͠ܕ ߴ֊ͷܕߏஙࢠ ͕࡞ΕΔ Calculus of Constructions

Slide 96

Slide 96 text

·ͱΊ w࿦ཧΛʮܗࣜʯͱʮҙຯʯͷͭͷଆ໘͔Βߟ͑Δ wܗࣜతମܥʜެཧʢҰ෦ͷ߃ਅͳ࿦ཧࣜʣͱਪ࿦نଇ wݹయ࿦ཧ͔Β௚؍ओٛ࿦ཧ΁ʢഉத཯ͷഇࢭͱΫϦϓΩҙຯ࿦ʣ w֊໋୊࿦ཧʢδΣωϦΫεͱϓϩτίϧʣ w௚؍ओٛ࿦ཧ˱4XJGUϓϩάϥϛϯάʢΧϦʔɾϋϫʔυରԠʣ w࿦ཧΛֶͿͱɺܕͷҙຯͱՁ஋͕෼͔Δ

Slide 97

Slide 97 text

Sample Code
 http://gist.github.com/inamiy/SwiftAndLogic

Slide 98

Slide 98 text

One more thing…

Slide 99

Slide 99 text

ʙؼ͖ͬͯͨݍ࿦ʙ

Slide 100

Slide 100 text

ࡢ೥ͷJ04%$ͷൃද
 IUUQTTQFBLFSEFDLDPNJOBNJZJPTEDKBQBO
 IUUQTRJJUBDPNJOBNJZJUFNTFDEFBGCDE

Slide 101

Slide 101 text

A B C ݍ

Slide 102

Slide 102 text

A B C ݍ idA idB idC

Slide 103

Slide 103 text

A B C ݍ f g ∘ f g

Slide 104

Slide 104 text

߃౳ࣹͱ߹੒ A → B B → C A → C A → A

Slide 105

Slide 105 text

࿦ཧԋࢉ˭ ͔ͭ A ∧ B A A ∧ B B A B A ∧ B

Slide 106

Slide 106 text

A ∧ B A B A ∧ B A A ∧ B B

Slide 107

Slide 107 text

(C → A) ∧ (C → B) C → (A ∧ B) A B C A ∧ B A B A ∧ B HomC (C, A) × HomC (C, B) ≅ HomC (C, A × B)

Slide 108

Slide 108 text

࿦ཧԋࢉˮ ·ͨ͸ A A ∨ B B A ∨ B A ∨ B A → C B → C C

Slide 109

Slide 109 text

A ∨ B A B A A ∨ B B A ∨ B

Slide 110

Slide 110 text

A B C A ∨ B (A → C) ∧ (B → C) (A ∨ B) → C A ∨ B A → C B → C C HomC (A, C) × HomC (B, C) ≅ HomC (A + B, C)

Slide 111

Slide 111 text

ถాͷิ୊ Hom[C,Set] (HomC (A, − ), F) ≅ F(A) ∀B . (A → B) → F(B) ≅ F(A) A ⟺ ∀B . (A → B) → B A ⟹ (A → ⊥ ) → ⊥ '߃౳ؔखͷͱ͖ #˵ʹಛघԽ
 ˲আڈ ೋॏ൱ఆ ¬¬A

Slide 112

Slide 112 text

άϦϕϯίͷఆཧɿݹయ࿦ཧˠ௚؍ओٛ࿦ཧ΁ͷຒΊࠐΈ ௚؍ओٛ࿦ཧ ݹయ࿦ཧ A ∨ ¬A ¬¬(A ∨ ¬A) ¬¬ ೋॏ൱ఆಋೖ ഉத཯ ೋॏ൱ఆഉத཯ $14ม׵ A ⟹ (A → ⊥ ) → ⊥

Slide 113

Slide 113 text

F(C) D ݍ F C ݍ U(D) ࣹͷू߹ U ≅ rightAdjunct leftAdjunct

Slide 114

Slide 114 text

F(C) D ݍ F U C U(D) ݍ F(U(D)) U(F(C)) f f F(f) U(f) unitC counitD

Slide 115

Slide 115 text

A × X B ݍ − × X ( − )X A BX ݍ BX × X f f f × id eval ႈ ࢦ਺ର৅ ධՁࣹ

Slide 116

Slide 116 text

B BX × X eval A × X − × X ( − )X A BX f f f × id ႈ ࢦ਺ର৅ ݍ ݍ ධՁࣹ X → B B B

Slide 117

Slide 117 text

σΧϧτ ΧϧςγΞϯ ดݍ ऴର৅ ⊤ ௚ੵ"ʷ# "˭# ႈ ࢦ਺ର৅ #" "ˠ# Λ࣋ͭݍͷ͜ͱ ௚؍ओٛ ࿦ཧͷܗࣜతମܥ͸σΧϧτดݍʹΑͬͯ
 ݍ࿦తʹҙຯ෇͚͢Δ͜ͱ͕Ͱ͖Δ σΧϧτดݍ ࿦ཧࣜͷূ໌ ܕ෇͖ϥϜμܭࢉ ର৅ ࿦ཧࣜ ܕ ࣹ ূ໌ ϥϜμ߲ ࣗ༝ม਺Λ࣋ͨͳ͍ ႈର৅ ˠΛ࢖ͬͨ࿦ཧࣜ ؔ਺ܕ ධՁࣹ Ϟʔμεϙωϯε ؔ਺ద༻ ΧϦʔɾϋϫʔυɾϥϯϕοΫରԠ

Slide 118

Slide 118 text

No content

Slide 119

Slide 119 text

No content

Slide 120

Slide 120 text

"MHFCSBJD%BUB5ZQFJO4XJGU
 IUUQTTQFBLFSEFDLDPNJOBNJZBMHFCSBJDEBUBUZQFJOTXJGU

Slide 121

Slide 121 text

τϙεʹσΧϧτดݍʴ෦෼ର৅෼ྨࢠ {a ∈ A|p(a)} A τϙε Ω true 1 unit m p p.b.

Slide 122

Slide 122 text

τϙεʹσΧϧτดݍʴ෦෼ର৅෼ྨࢠ {a ∈ A|p(a)} A τϙε Ω true 1 unit m ෦෼ର৅ 4VCPCKFDU Ϟϊࣹ ෦෼ର৅෼ྨࢠ 4VCPCKFDU$MBTTJpFS ྫɿτϙε͕ू߹ͷݍͷͱ͖
 Њ\USVF GBMTF^ p p.b. Ҿ͖໭͠
 1VMMCBDL QC ಛੑࣹ "্ͷड़ޠ

Slide 123

Slide 123 text

ࢀߟจݙʢ࿦ཧֶɺϥϜμܭࢉɺܕγεςϜʣ w ʰܭࢉ࿦ཧֶʱߨٛࢿྉُࢁ޾ٛ w ΧϦʔʹϋϫʔυಉܕରԠ8JLJQFEJB w ΧϦʔɾϋϫʔυରԠͱ௚؍ओٛ࿦ཧͷ ҙຯ࿦ೖ໳໼ా෦ढ़հ w ௚؍ओٛ࿦ཧ΁ͷট଴রҪҰ੒ w ਺ֶಉ޷ձފా w $MBTTJDBM-PHJDJO)BTLFMM w "5ZQF4ZTUFN'SPN4DSBUDIr 3PCFSU8JENBOO w "4IPSU*OUSPEVDUJPOUP4ZTUFNT' BOE'Т1BCMP/PHVFJSB w ࿦ཧͱܭࢉͷ͘͠ΈԮ୩ণݾɺ੢࡚ਅ໵ w ৘ใՊֶʹ͓͚Δ࿦ཧখ໺׮᏷ w ϓϩάϥϜҙຯ࿦ԣ಺׮จ w ܕγεςϜೖ໳ 5B1- 1JFSDF

Slide 124

Slide 124 text

ࢀߟจݙʢݍ࿦ɺτϙεʣ w ೥ݍ࿦ษڧձࢿྉதଜߊҰ w ᐻࢁਖ਼޾ͷΩϚΠϥࣂҭه w ఩ֶऀͷͨΊͷݍ࿦ೖ໳৿ాਅੜ w ݍ࿦ʹΑΔϓϩάϥϛϯάͱ࿦ཧ !TIJBUTVNBU !@@JOU w τϙεBMHE w 5IF%BSL4JEFPG'PSDJOH w 0MJWJB$BSBNFMMPTXFCTJUF w "O*OUSPEVDUJPOUP5PQPT5IFPSZ w ,SJQLFr+PZBMҙຯ࿦;JQIJM"MFTIMBT w (SPUIFOEJFDL5PQPT΁ͷೖ໳ !LSJQLFKPZBM w ϓϩάϥϛϯάݴޠͷҙຯ࿦ͱݍ࿦௕୩઒ ਅਓ w τϙεͱߴ֊࿦ཧ5BJDIJ6FNVSB w ݍ࿦"XPEFZ w ݍ࿦ʹΑΔ࿦ཧֶʕߴ֊࿦ཧͱτϙεਗ਼ ਫٛ෉ w ݍ࿦ͷา͖ํ೔ຊධ࿦ࣾ

Slide 125

Slide 125 text

Thanks! Yasuhiro Inami @inamiy