Interlude: Propositions, Proofs, and Indexing
๋ง์ ์ธ์ด์ ๋ง์ฐฌ๊ฐ์ง๋ก Lean์ ๋ฐฐ์ด๊ณผ ๋ฆฌ์คํธ์ ์ธ๋ฑ์ฑ์ ๋๊ดํธ๋ฅผ ์ฌ์ฉํ๋ค.
์๋ฅผ ๋ค์ด woodlandCritters๊ฐ ๋ค์๊ณผ ๊ฐ์ด ์ ์๋์ด ์๋ค๊ณ ํ์.
def woodlandCritters : List String :=
["hedgehog", "deer", "snail"]๊ทธ๋ฌ๋ฉด ๊ฐ ์์๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์ถ์ถํ ์ ์๋ค.
def hedgehog := woodlandCritters[0]
def deer := woodlandCritters[1]
def snail := woodlandCritters[2]๊ทธ๋ฌ๋ ๋ค ๋ฒ์งธ ์์๋ฅผ ์ถ์ถํ๋ ค ํ๋ฉด ๋ฐํ์ ์ค๋ฅ๊ฐ ์๋๋ผ ์ปดํ์ผ ํ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.
def oops := woodlandCritters[3]
์ด ์ค๋ฅ ๋ฉ์์ง๋ Lean์ด 3 < woodlandCritters.length(์ฆ 3 < List.length woodlandCritters)์ ์๋์ผ๋ก ์ํ์ ์ผ๋ก ์ฆ๋ช
ํด ์กฐํ๊ฐ ์์ ํจ์ ๋ณด์ด๋ ค ํ์ง๋ง ๊ทธ๋ ๊ฒ ํ์ง ๋ชปํ๋ค๋ ๋ป์ด๋ค.
๋ฒ์๋ฅผ ๋ฒ์ด๋๋ ์ค๋ฅ๋ ํํ ๋ฒ๊ทธ ์ ํ์ด๋ฉฐ, Lean์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ด์ ์ ๋ฆฌ ์ฆ๋ช
๊ธฐ๋ผ๋ ์ด์ค์ ์ธ ์ฑ๊ฒฉ์ ํ์ฉํด ๊ฐ๋ฅํ ํ ๋ง์ ์ค๋ฅ๋ฅผ ๋ฐฐ์ ํ๋ค.
์ด๊ฒ์ด ์ด๋ป๊ฒ ์๋ํ๋์ง ์ดํดํ๋ ค๋ฉด ๋ช ์ , ์ฆ๋ช , ์ ์ ์ด๋ผ๋ ์ธ ๊ฐ์ง ํต์ฌ ์์ด๋์ด๋ฅผ ์ดํดํด์ผ ํ๋ค.
Propositions and Proofs
๋ช ์ ๋ ์ฐธ์ด๊ฑฐ๋ ๊ฑฐ์ง์ผ ์ ์๋ ๋ฌธ์ฅ์ด๋ค. ๋ค์ ์์ด ๋ฌธ์ฅ์ ๋ชจ๋ ๋ช ์ ๋ค.
-
1 + 1 = 2 -
๋ง์ ์ ๊ตํ๋ฒ์น์ ๋ง์กฑํ๋ค.
-
์์๋ ๋ฌดํํ ๋ง๋ค.
-
1 + 1 = 15 -
ํ๋ฆฌ๋ ํ๋์ค์ ์๋๋ค.
-
๋ถ์๋ ธ์ค์์ด๋ ์ค๋ ๋ํ๋ฏผ๊ตญ์ ์๋๋ค.
-
๋ชจ๋ ์๋ ๋ ์ ์๋ค.
๋ฐ๋ฉด์ ๋ฌด์๋ฏธํ ๋ฌธ์ฅ์ ๋ช ์ ๊ฐ ์๋๋ค. ๋ฌธ๋ฒ์ ์ผ๋ก๋ ๋ง๋๋ผ๋ ๋ค์ ๋ฌธ์ฅ์ ์ด๋ ๊ฒ๋ ๋ช ์ ๊ฐ ์๋๋ค.
-
1 + green = ice cream
-
๋ชจ๋ ์๋๋ ์์๋ค.
-
์ ์ด๋ ํ๋์ gorg๋ fleep์ด๋ค.
๋ช ์ ์๋ ๋ ์ข ๋ฅ๊ฐ ์๋ค. ๊ฐ๋ ์ ์ ์์๋ง ์์กดํ๋ ์์ํ ์ํ์ ๋ช ์ ์ ์ธ๊ณ์ ๊ดํ ์ฌ์ค์ด๋ค. Lean ๊ฐ์ ์ ๋ฆฌ ์ฆ๋ช ๊ธฐ๋ ์ ์์ ๊ด์ฌ์ด ์์ผ๋ฉฐ, ํญ๊ท์ด ๋ ์ ์๋์ง๋ ๋์์ ๋ฒ์ ์ง์์ ๋ํด์๋ ๋งํ ์ ์๋ค.
์ฆ๋ช ์ ๋ช ์ ๊ฐ ์ฐธ์ด๋ผ๋ ์ค๋๋ ฅ ์๋ ๋ ผ์ฆ์ด๋ค. ์ํ์ ๋ช ์ ์ ๋ ผ์ฆ์ ๊ด๋ จ๋ ๊ฐ๋ ์ ์ ์์ ๋ ผ๋ฆฌ์ ์ถ๋ก ๊ท์น์ ์ฌ์ฉํ๋ค. ๋๋ถ๋ถ์ ์ฆ๋ช ์ ์ฌ๋์ด ์ดํดํ๋๋ก ์์ฑํ๋ฏ๋ก ์ง๋ฃจํ ์ธ๋ถ ์ฌํญ์ ๋ง์ด ์๋ตํ๋ค. Lean ๊ฐ์ ์ปดํจํฐ ๋ณด์กฐ ์ ๋ฆฌ ์ฆ๋ช ๊ธฐ๋ ์ํ์๊ฐ ๋ง์ ์ธ๋ถ ์ฌํญ์ ์๋ตํ๊ณ ์ฆ๋ช ์ ์์ฑํ ์ ์๊ฒ ์ค๊ณ๋์์ผ๋ฉฐ, ๋น ์ง ๋ช ์์ ๋จ๊ณ๋ฅผ ์ฑ์ฐ๋ ๊ฒ์ ์ํํธ์จ์ด์ ์ฑ ์์ด๋ค. ์ด ๋จ๊ณ๋ค์ ๊ธฐ๊ณ์ ์ผ๋ก ๊ฒ์ฌํ ์ ์๋ค. ๊ทธ ๊ฒฐ๊ณผ ๋น ๋จ๋ฆผ์ด๋ ์ค์์ ๊ฐ๋ฅ์ฑ์ด ์ค์ด๋ ๋ค.
Lean์์ ํ๋ก๊ทธ๋จ์ ํ์
์ ํ๋ก๊ทธ๋จ๊ณผ ์ํธ์์ฉํ ์ ์๋ ๋ฐฉ์์ ์ค๋ช
ํ๋ค.
์๋ฅผ ๋ค์ด Nat โ List String ํ์
์ ํ๋ก๊ทธ๋จ์ Nat ์ธ์๋ฅผ ๋ฐ์ ๋ฌธ์์ด ๋ชฉ๋ก์ ๋ง๋๋ ํจ์๋ค.
๋ค์ ๋งํด ๊ฐ ํ์
์ ๊ทธ ํ์
์ ๊ฐ์ง ํ๋ก๊ทธ๋จ์ผ๋ก ์ธ์ ๋๋ ๊ฒ์ด ๋ฌด์์ธ์ง ์ง์ ํ๋ค.
Lean์์ ๋ช ์ ๋ ์ฌ์ค ํ์ ์ด๋ค. ๋ช ์ ๋ ๊ทธ ๋ฌธ์ฅ์ด ์ฐธ์ด๋ผ๋ ์ฆ๊ฑฐ๋ก ์ธ์ ๋๋ ๊ฒ์ ์ง์ ํ๋ค. ์ด ์ฆ๊ฑฐ๋ฅผ ์ ๊ณตํ๋ฉด ๋ช ์ ๊ฐ ์ฆ๋ช ๋๊ณ , Lean์ด ์ฆ๊ฑฐ๋ฅผ ๊ฒ์ฌํ๋ค. ๋ฐ๋ฉด ๋ช ์ ๊ฐ ๊ฑฐ์ง์ด๋ฉด ์ด ์ฆ๊ฑฐ๋ฅผ ๊ตฌ์ฑํ ์ ์๋ค.
์๋ฅผ ๋ค์ด ๋ช
์ 1 + 1 = 2๋ Lean์ ์ง์ ์ธ ์ ์๋ค.
์ด ๋ช
์ ์ ์ฆ๊ฑฐ๋ ๋ฐ์ฌ์ฑ(reflexivity)์ ์ค์๋ง์ธ rfl ์์ฑ์๋ค.
์ํ์์ ๋ชจ๋ ์์๊ฐ ์๊ธฐ ์์ ๊ณผ ๊ด๊ณ๋ฅผ ๋งบ์ผ๋ฉด ๊ด๊ณ๊ฐ ๋ฐ์ฌ์ ์ด๋ผ๊ณ ํ๋ค. ์ด๋ ํ๋นํ ๋๋ฑ์ฑ ๊ฐ๋
์ ๊ฐ๊ธฐ ์ํ ๊ธฐ๋ณธ ์๊ตฌ ์ฌํญ์ด๋ค.
1 + 1์ 2๋ก ๊ณ์ฐ๋๋ฏ๋ก ์ค์ ๋ก ๊ฐ์ ๊ฒ์ด๋ค.
def onePlusOneIsTwo : 1 + 1 = 2 := rfl
๋ฐ๋ฉด rfl์ ๊ฑฐ์ง ๋ช
์ 1 + 1 = 15๋ฅผ ์ฆ๋ช
ํ์ง ๋ชปํ๋ค.
def onePlusOneIsFifteen : 1 + 1 = 15 := rfl
์ด ์ค๋ฅ ๋ฉ์์ง๋ ๋๋ฑ์ฑ ๋ฌธ์ฅ์ ์๋ณ์ด ์ด๋ฏธ ๊ฐ์ ์์ผ ๋ rfl์ด ๋ ์์ด ๊ฐ์์ ์ฆ๋ช
ํ ์ ์๋ค๋ ๋ป์ด๋ค.
1 + 1์ ๋ฐ๋ก 2๋ก ํ๊ฐ๋๋ฏ๋ก ๊ฐ์ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋๊ณ , ์ด์ ๋ฐ๋ผ onePlusOneIsTwo๊ฐ ๋ฐ์๋ค์ฌ์ง๋ค.
Type์ด ์๋ฃ๊ตฌ์กฐ์ ํจ์๋ฅผ ๋ํ๋ด๋ Nat, String, List (Nat ร String ร (Int โ Float)) ๊ฐ์ ํ์
์ ์ค๋ช
ํ๋ฏ, Prop์ ๋ช
์ ๋ฅผ ์ค๋ช
ํ๋ค.
๋ช
์ ๊ฐ ์ฆ๋ช
๋๋ฉด ์ด๋ฅผ ์ ๋ฆฌ๋ผ๊ณ ๋ถ๋ฅธ๋ค.
Lean์์๋ ์ ๋ฆฌ๋ฅผ def ๋์ theorem ํค์๋๋ก ์ ์ธํ๋ ๊ฒ์ด ๊ด๋ก๋ค.
์ด๋ ๊ฒ ํ๋ฉด ๋
์๊ฐ ์ด๋ค ์ ์ธ์ ์ํ์ ์ฆ๋ช
์ผ๋ก ์ฝ์ด์ผ ํ๊ณ ์ด๋ค ์ ์ธ์ ์ ์๋ก ์ฝ์ด์ผ ํ๋์ง ์ ์ ์๋ค.
์ผ๋ฐ์ ์ผ๋ก ์ฆ๋ช
์์๋ ๋ช
์ ๊ฐ ์ฐธ์ด๋ผ๋ ์ฆ๊ฑฐ๊ฐ ์๋ค๋ ์ ์ด ์ค์ํ๊ณ , ์ด๋ค ์ฆ๊ฑฐ๋ฅผ ์ ๊ณตํ๋์ง๋ ํน๋ณํ ์ค์ํ์ง ์๋ค.
๋ฐ๋ฉด ์ ์์์๋ ์ด๋ค ํน์ ๊ฐ์ ์ ํํ๋์ง๊ฐ ๋งค์ฐ ์ค์ํ๋ค. ํญ์ 0์ ๋ฐํํ๋ ๋ง์
์ ์๋ ๋ถ๋ช
ํ ์๋ชป๋์๊ธฐ ๋๋ฌธ์ด๋ค.
์ฆ๋ช
์ ์ธ๋ถ ์ฌํญ์ ์ดํ ์ฆ๋ช
์ ์ค์ํ์ง ์์ผ๋ฏ๋ก theorem ํค์๋๋ฅผ ์ฌ์ฉํ๋ฉด Lean ์ปดํ์ผ๋ฌ๊ฐ ๋ ํฐ ๋ณ๋ ฌ์ฑ์ ํ์ฉํ ์ ์๋ค.
์์ ์์ ๋ ๋ค์๊ณผ ๊ฐ์ด ๋ค์ ์ธ ์ ์๋ค.
def OnePlusOneIsTwo : Prop := 1 + 1 = 2
theorem onePlusOneIsTwo : OnePlusOneIsTwo := rflTactics
์ฆ๋ช ์ ๋ณดํต ์ฆ๊ฑฐ๋ฅผ ์ง์ ์ ๊ณตํ๊ธฐ๋ณด๋ค ์ ์ ์ ์ฌ์ฉํด ์์ฑํ๋ค. ์ ์ ์ ๋ช ์ ์ ์ฆ๊ฑฐ๋ฅผ ๊ตฌ์ฑํ๋ ์์ ํ๋ก๊ทธ๋จ์ด๋ค. ์ด ํ๋ก๊ทธ๋จ์ ์ฆ๋ช ํ ๋ฌธ์ฅ(๋ชฉํ๋ผ๊ณ ๋ถ๋ฅธ๋ค)๊ณผ ์ด๋ฅผ ์ฆ๋ช ํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ ๊ฐ์ ์ ์ถ์ ํ๋ ์ฆ๋ช ์ํ์์ ์คํ๋๋ค. ๋ชฉํ์ ์ ์ ์ ์คํํ๋ฉด ์๋ก์ด ๋ชฉํ๊ฐ ๋ค์ด ์๋ ์ ์ฆ๋ช ์ํ๊ฐ ๋์จ๋ค. ๋ชจ๋ ๋ชฉํ๊ฐ ์ฆ๋ช ๋๋ฉด ์ฆ๋ช ์ด ์์ฑ๋๋ค.
์ ์ ๋ก ์ฆ๋ช
์ ์์ฑํ๋ ค๋ฉด ์ ์๋ฅผ by๋ก ์์ํ๋ผ.
by๋ฅผ ์ฐ๋ฉด Lean์ ๋ค์ ๋ค์ฌ์ฐ๊ธฐ ๋ธ๋ก์ด ๋๋ ๋๊น์ง ์ ์ ๋ชจ๋๋ก ๋ค์ด๊ฐ๋ค.
์ ์ ๋ชจ๋์์ Lean์ ํ์ฌ ์ฆ๋ช
์ํ์ ๊ดํ ํผ๋๋ฐฑ์ ๊ณ์ ์ ๊ณตํ๋ค.
์ ์ ๋ก ์์ฑํ onePlusOneIsTwo๋ ์ฌ์ ํ ๋งค์ฐ ์งง๋ค.
theorem onePlusOneIsTwo : 1 + 1 = 2 := โข 1 + 1 = 2
All goals completed! ๐
decide ์ ์ ์ ๋ฌธ์ฅ์ด ์ฐธ์ธ์ง ๊ฑฐ์ง์ธ์ง ๊ฒ์ฌํ๊ณ ์ด๋ ๊ฒฝ์ฐ๋ ์ ์ ํ ์ฆ๋ช
์ ๋ฐํํ๋ ํ๋ก๊ทธ๋จ์ธ ๊ฒฐ์ ์ ์ฐจ๋ฅผ ํธ์ถํ๋ค.
์ฃผ๋ก 1, 2 ๊ฐ์ ๊ตฌ์ฒด์ ์ธ ๊ฐ์ ๋ค๋ฃฐ ๋ ์ฌ์ฉํ๋ค.
์ด ์ฑ
์ ๋ค๋ฅธ ์ค์ํ ์ ์ ์ โ๋จ์ํโ๋ฅผ ๋ปํ๋ simp์ ๋ง์ ์ ๋ฆฌ๋ฅผ ์๋์ผ๋ก ์ฆ๋ช
ํ ์ ์๋ grind๋ค.
์ ์ ์ ์ฌ๋ฌ ์ด์ ๋ก ์ ์ฉํ๋ค.
-
๋ง์ ์ฆ๋ช ์ ๊ฐ์ฅ ์์ ์ธ๋ถ ์ฌํญ๊น์ง ์ง์ ์ฐ๋ฉด ๋ณต์กํ๊ณ ์ง๋ฃจํ์ง๋ง, ์ ์ ์ ์ด๋ฐ ํฅ๋ฏธ๋กญ์ง ์์ ๋ถ๋ถ์ ์๋ํํ ์ ์๋ค.
-
์ ์ฐํ ์๋ํ๊ฐ ์ ์์ ์์ ๋ณ๊ฒฝ์ ๊ฐ๋ ค ์ค ์ ์์ผ๋ฏ๋ก ์ ์ ๋ก ์์ฑํ ์ฆ๋ช ์ ์๊ฐ์ด ์ง๋๋ ์ ์งํ๊ธฐ ์ฝ๋ค.
-
ํ๋์ ์ ์ ๋ก ์ฌ๋ฌ ์ ๋ฆฌ๋ฅผ ์ฆ๋ช ํ ์ ์์ผ๋ฏ๋ก Lean์ ๋ด๋ถ์ ์ผ๋ก ์ ์ ์ ์ฌ์ฉํด ์ฌ์ฉ์๊ฐ ์์ผ๋ก ์ฆ๋ช ์ ์์ฑํ์ง ์์๋ ๋๊ฒ ํ๋ค. ์๋ฅผ ๋ค์ด ๋ฐฐ์ด ์กฐํ์๋ ์ธ๋ฑ์ค๊ฐ ๋ฒ์ ์์ ์๋ค๋ ์ฆ๋ช ์ด ํ์ํ์ง๋ง, ์ ์ ์ ๋ณดํต ์ฌ์ฉ์๊ฐ ์ ๊ฒฝ ์ฐ์ง ์์๋ ๊ทธ ์ฆ๋ช ์ ๊ตฌ์ฑํ ์ ์๋ค.
๋ด๋ถ์ ์ผ๋ก ์ธ๋ฑ์ฑ ํ๊ธฐ๋ฒ์ ์ ์ ์ ์ฌ์ฉํด ์ฌ์ฉ์์ ์กฐํ ์ฐ์ฐ์ด ์์ ํจ์ ์ฆ๋ช ํ๋ค. ์ด ์ ์ ์ ์ฐ์ ์ ๊ดํ ๋ง์ ์ฌ์ค์ ๊ณ ๋ คํ๊ณ ํ์ฌ ๋ฒ์์์ ์๋ ค์ง ์ฌ์ค๊ณผ ๊ฒฐํฉํด ์ธ๋ฑ์ค๊ฐ ๋ฒ์ ์์ ์์์ ์ฆ๋ช ํ๋ ค ํ๋ค.
simp ์ ์ ์ Lean ์ฆ๋ช
์ ์ผ๊พผ์ด๋ค.
๋ชฉํ๋ฅผ ๊ฐ๋ฅํ ํ ๋จ์ํ ํํ๋ก ๋ค์ ์ด๋ค.
๋ง์ ๊ฒฝ์ฐ ์ด๋ ๊ฒ ๋ค์ ์ฐ๋ฉด ๋ฌธ์ฅ์ด ์ถฉ๋ถํ ๋จ์ํด์ ธ ์๋์ผ๋ก ์ฆ๋ช
ํ ์ ์๋ค.
๋ด๋ถ์ ์ผ๋ก๋ ์์ธํ ํ์ ์ฆ๋ช
์ด ๊ตฌ์ฑ๋์ง๋ง simp๋ฅผ ์ฌ์ฉํ๋ฉด ์ด ๋ณต์ก์ฑ์ด ๊ฐ๋ ค์ง๋ค.
decide์ฒ๋ผ grind ์ ์ ์ ์ฆ๋ช
์ ๋ง๋ฌด๋ฆฌํ๋ ๋ฐ ์ฌ์ฉํ๋ค.
๋ค์ํ ์ ๋ฆฌ๋ฅผ ์ฆ๋ช
ํ ์ ์๋ SMT ์๋ฒ์ ๊ธฐ๋ฒ ๋ชจ์์ ์ฌ์ฉํ๋ค.
simp์ ๋ฌ๋ฆฌ grind๋ ์ฆ๋ช
์ ์์ ํ ๋๋ด์ง ์๊ณ ๋ ์ฆ๋ช
์ ํฅํด ์กฐ๊ธ๋ ๋์๊ฐ ์ ์์ผ๋ฉฐ, ์์ ํ ์ฑ๊ณตํ๊ฑฐ๋ ์คํจํ๋ค.
grind ์ ์ ์ ๋งค์ฐ ๊ฐ๋ ฅํ๊ณ ์ฌ์ฉ์ํํ ์ ์์ผ๋ฉฐ ํ์ฅ ๊ฐ๋ฅํ๋ค. ์ด ํ๊ณผ ์ ์ฐ์ฑ ๋๋ฌธ์ ์ ๋ฆฌ๋ฅผ ์ฆ๋ช
ํ์ง ๋ชปํ์ ๋์ ์ถ๋ ฅ์๋ ์๋ จ๋ Lean ์ฌ์ฉ์๊ฐ ์คํจ ์ด์ ๋ฅผ ์ง๋จํ๋ ๋ฐ ๋์์ด ๋๋ ์ ๋ณด๊ฐ ๋ง์ด ๋ด๊ธด๋ค.
์ด๋ ์ฒ์์๋ ๋ฒ
์ฐฐ ์ ์์ผ๋ฏ๋ก ์ด ์ฅ์์๋ decide์ simp๋ง ์ฌ์ฉํ๋ค.
Connectives
โ๊ทธ๋ฆฌ๊ณ โ, โ๋๋โ, โ์ฐธโ, โ๊ฑฐ์งโ, โ์๋๋คโ์ ๊ฐ์ ๋ ผ๋ฆฌ์ ๊ธฐ๋ณธ ๊ตฌ์ฑ ์์๋ฅผ ๋ ผ๋ฆฌ ์ฐ๊ฒฐ์ฌ๋ผ๊ณ ํ๋ค. ๊ฐ ์ฐ๊ฒฐ์ฌ๋ ๊ทธ ์ฐ๊ฒฐ์ฌ๊ฐ ์ฐธ์ด๋ผ๋ ์ฆ๊ฑฐ๋ก ์ธ์ ๋๋ ๊ฒ์ ์ ์ํ๋ค. ์๋ฅผ ๋ค์ด โA ๊ทธ๋ฆฌ๊ณ Bโ๋ผ๋ ๋ฌธ์ฅ์ ์ฆ๋ช ํ๋ ค๋ฉด A์ B๋ฅผ ๋ชจ๋ ์ฆ๋ช ํด์ผ ํ๋ค. ๋ฐ๋ผ์ โA ๊ทธ๋ฆฌ๊ณ Bโ์ ์ฆ๊ฑฐ๋ A์ ์ฆ๊ฑฐ์ B์ ์ฆ๊ฑฐ๋ฅผ ๋ชจ๋ ๋ด์ ์์ด๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก โA ๋๋ Bโ์ ์ฆ๊ฑฐ๋ A์ ์ฆ๊ฑฐ๋ B์ ์ฆ๊ฑฐ ์ค ํ๋๋ค.
ํนํ ์ด๋ฌํ ์ฐ๊ฒฐ์ฌ ๋๋ถ๋ถ์ ๋ฐ์ดํฐ ํ์
์ฒ๋ผ ์ ์๋๋ฉฐ ์์ฑ์๋ฅผ ๊ฐ์ง๋ค.
A์ B๊ฐ ๋ช
์ ๋ผ๋ฉด โA ๊ทธ๋ฆฌ๊ณ Bโ(ํ๊ธฐ๋ A โง B)๋ ๋ช
์ ๋ค.
A โง B์ ์ฆ๊ฑฐ๋ A โ B โ A โง B ํ์
์ ๊ฐ๋ And.intro ์์ฑ์๋ค.
A์ B๋ฅผ ๊ตฌ์ฒด์ ์ธ ๋ช
์ ๋ก ๋ฐ๊พธ๋ฉด And.intro rfl rfl๋ก 1 + 1 = 2 โง "Str".append "ing" = "String"์ ์ฆ๋ช
ํ ์ ์๋ค.
๋ฌผ๋ก decide๋ ์ด ์ฆ๋ช
์ ์ฐพ์ ๋งํผ ๊ฐ๋ ฅํ๋ค.
theorem addAndAppend : 1 + 1 = 2 โง "Str".append "ing" = "String" := โข 1 + 1 = 2 โง "Str".append "ing" = "String"
All goals completed! ๐
๋ง์ฐฌ๊ฐ์ง๋ก โA ๋๋ Bโ(ํ๊ธฐ๋ A โจ B)์๋ ๋ ์์ฑ์๊ฐ ์๋ค. โA ๋๋ Bโ์ ์ฆ๋ช
์๋ ๋ ๋ช
์ ์ค ํ๋๋ง ์ฐธ์ด๋ฉด ๋๊ธฐ ๋๋ฌธ์ด๋ค.
๋ ์์ฑ์๋ A โ A โจ B ํ์
์ Or.inl๊ณผ B โ A โจ B ํ์
์ Or.inr๋ค.
ํจ์๋ ํจ์(A์ด๋ฉด B)๋ฅผ ๋ํ๋ธ๋ค.
ํนํ A์ ์ฆ๊ฑฐ๋ฅผ B์ ์ฆ๊ฑฐ๋ก ๋ฐ๊พธ๋ ํจ์ ์์ฒด๊ฐ A๊ฐ B๋ฅผ ํจ์ํ๋ค๋ ์ฆ๊ฑฐ๋ค.
์ด๋ A โ B๋ฅผ ยฌA โจ B์ ์ค์๋ง๋ก ๋ณด๋ ์ผ๋ฐ์ ์ธ ์ค๋ช
๊ณผ ๋ค๋ฅด์ง๋ง ๋ ํํ์ ๋๋ฑํ๋ค.
โ๊ทธ๋ฆฌ๊ณ โ์ ์ฆ๊ฑฐ๋ ์์ฑ์์ด๋ฏ๋ก ํจํด ๋งค์นญ๊ณผ ํจ๊ป ์ฌ์ฉํ ์ ์๋ค.
์๋ฅผ ๋ค์ด A ๊ทธ๋ฆฌ๊ณ B๊ฐ A ๋๋ B๋ฅผ ํจ์ํ๋ค๋ ์ฆ๋ช
์, A ๊ทธ๋ฆฌ๊ณ B์ ์ฆ๊ฑฐ์์ A์ ์ฆ๊ฑฐ(๋๋ B์ ์ฆ๊ฑฐ)๋ฅผ ๊บผ๋ด ๊ทธ ์ฆ๊ฑฐ๋ก A ๋๋ B์ ์ฆ๊ฑฐ๋ฅผ ๋ง๋๋ ํจ์๋ค.
theorem andImpliesOr : A โง B โ A โจ B :=
fun andEvidence =>
match andEvidence with
| And.intro a b => Or.inl a์ฐ๊ฒฐ์ฌ | Lean ๋ฌธ๋ฒ | ์ฆ๊ฑฐ |
|---|---|---|
์ฐธ | ||
๊ฑฐ์ง | ์ฆ๊ฑฐ ์์ | |
|
|
|
|
|
|
|
|
|
|
|
|
decide ์ ์ ์ ์ด๋ฌํ ์ฐ๊ฒฐ์ฌ๋ฅผ ์ฌ์ฉํ๋ ์ ๋ฆฌ๋ฅผ ์ฆ๋ช
ํ ์ ์๋ค.
์๋ฅผ ๋ค์ด ๋ค์๊ณผ ๊ฐ๋ค.
theorem onePlusOneOrLessThan : 1 + 1 = 2 โจ 3 < 5 := โข 1 + 1 = 2 โจ 3 < 5 All goals completed! ๐
theorem notTwoEqualFive : ยฌ(1 + 1 = 5) := โข ยฌ1 + 1 = 5 All goals completed! ๐
theorem trueIsTrue : True := โข True All goals completed! ๐
theorem trueOrFalse : True โจ False := โข True โจ False All goals completed! ๐
theorem falseImpliesTrue : False โ True := โข False โ True All goals completed! ๐Evidence as Arguments
์ด๋ค ๊ฒฝ์ฐ์๋ ๋ชฉ๋ก์ ์์ ํ๊ฒ ์ธ๋ฑ์ฑํ๋ ค๋ฉด ๋ชฉ๋ก์ ์ต์ ํฌ๊ธฐ๊ฐ ์์ด์ผ ํ์ง๋ง ๋ชฉ๋ก ์์ฒด๋ ๊ตฌ์ฒด์ ์ธ ๊ฐ์ด ์๋๋ผ ๋ณ์๋ค. ์ด ์กฐํ๊ฐ ์์ ํ๋ ค๋ฉด ๋ชฉ๋ก์ด ์ถฉ๋ถํ ๊ธธ๋ค๋ ์ฆ๊ฑฐ๊ฐ ์์ด์ผ ํ๋ค. ์ธ๋ฑ์ฑ์ ์์ ํ๊ฒ ๋ง๋๋ ๊ฐ์ฅ ์ฌ์ด ๋ฐฉ๋ฒ ์ค ํ๋๋ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์กฐํํ๋ ํจ์๊ฐ ์์ ์ฑ์ ํ์ํ ์ฆ๊ฑฐ๋ฅผ ์ธ์๋ก ๋ฐ๊ฒ ํ๋ ๊ฒ์ด๋ค. ์๋ฅผ ๋ค์ด ๋ชฉ๋ก์ ์ธ ๋ฒ์งธ ํญ๋ชฉ์ ๋ฐํํ๋ ํจ์๋ ๋ชฉ๋ก์ ์์๊ฐ 0๊ฐ, 1๊ฐ, 2๊ฐ์ผ ์ ์์ผ๋ฏ๋ก ์ผ๋ฐ์ ์ผ๋ก ์์ ํ์ง ์๋ค.
def third (xs : List ฮฑ) : ฮฑ := xs[2]ํ์ง๋ง ์ธ๋ฑ์ฑ ์ฐ์ฐ์ด ์์ ํ๋ค๋ ์ฆ๊ฑฐ๋ก ์ด๋ฃจ์ด์ง ์ธ์๋ฅผ ์ถ๊ฐํ๋ฉด ๋ชฉ๋ก์ ํญ๋ชฉ์ด ์ ์ด๋ ์ธ ๊ฐ ์์์ ๋ณด์ด๋ ์๋ฌด๋ฅผ ํธ์ถ์์๊ฒ ๋ถ๊ณผํ ์ ์๋ค.
def third (xs : List ฮฑ) (ok : xs.length > 2) : ฮฑ := xs[2]
์ด ์์ ์์ xs.length > 2๋ xs์ ํญ๋ชฉ์ด 2๊ฐ๋ณด๋ค ๋ง์์ง ๊ฒ์ฌํ๋ ํ๋ก๊ทธ๋จ์ด ์๋๋ค.
์ฐธ์ผ ์๋ ๊ฑฐ์ง์ผ ์๋ ์๋ ๋ช
์ ์ด๋ฉฐ, ok ์ธ์๋ ์ด ๋ช
์ ๊ฐ ์ฐธ์ด๋ผ๋ ์ฆ๊ฑฐ์ฌ์ผ ํ๋ค.
ํจ์๋ฅผ ๊ตฌ์ฒด์ ์ธ ๋ชฉ๋ก์ ํธ์ถํ๋ฉด ๋ชฉ๋ก์ ๊ธธ์ด๋ฅผ ์๋ค.
์ด ๊ฒฝ์ฐ by decide๊ฐ ์ฆ๊ฑฐ๋ฅผ ์๋์ผ๋ก ๊ตฌ์ฑํ ์ ์๋ค.
#eval third woodlandCritters (โข woodlandCritters.length > 2 All goals completed! ๐)Indexing Without Evidence
์ธ๋ฑ์ฑ ์ฐ์ฐ์ด ๋ฒ์ ์์ ์์์ ์ฆ๋ช
ํ๊ธฐ๊ฐ ํ์ค์ ์ด์ง ์์ ๊ฒฝ์ฐ์๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ด ์๋ค.
๋ฌผ์ํ๋ฅผ ๋ถ์ด๋ฉด Option์ด ๋๋ฉฐ, ์ธ๋ฑ์ค๊ฐ ๋ฒ์ ์์ด๋ฉด ๊ฒฐ๊ณผ๋ some์ด๊ณ ๊ทธ๋ ์ง ์์ผ๋ฉด none์ด๋ค.
์๋ฅผ ๋ค์ด ๋ค์๊ณผ ๊ฐ๋ค.
def thirdOption (xs : List ฮฑ) : Option ฮฑ := xs[2]?#eval thirdOption woodlandCritters#eval thirdOption ["only", "two"]
Messages You May Meet
decide ์ ์ ์ ๋ฌธ์ฅ์ด ์ฐธ์์ ์ฆ๋ช
ํ ๋ฟ ์๋๋ผ ๊ฑฐ์ง์๋ ์ฆ๋ช
ํ ์ ์๋ค.
์์๊ฐ ํ๋์ธ ๋ชฉ๋ก์ ์์๊ฐ ๋ ๊ฐ๋ณด๋ค ๋ง๋ค๊ณ ์ฆ๋ช
ํ๋ผ๊ณ ํ๋ฉด, ๋ฌธ์ฅ์ด ์ค์ ๋ก ๊ฑฐ์ง์์ ๋ํ๋ด๋ ์ค๋ฅ๋ฅผ ๋ฐํํ๋ค.
#eval third ["rabbit"] (โข ["rabbit"].length > 2 โข ["rabbit"].length > 2)
simp์ decide ์ ์ ์ def๋ก ์ ์ํ ๊ฒ์ ์๋์ผ๋ก ํผ์น์ง ์๋๋ค.
simp๋ฅผ ์ฌ์ฉํด OnePlusOneIsTwo๋ฅผ ์ฆ๋ช
ํ๋ ค ํ๋ฉด ์คํจํ๋ค.
theorem onePlusOneIsStillTwo : OnePlusOneIsTwo := โข OnePlusOneIsTwo โข OnePlusOneIsTwo
์ค๋ฅ ๋ฉ์์ง๋ OnePlusOneIsTwo๋ฅผ ํผ์น์ง ์์ผ๋ฉด ์ง์ ํ ์ ์์ผ๋ฏ๋ก ์๋ฌด๊ฒ๋ ํ ์ ์๋ค๊ณ ๋จ์ํ ๋งํ๋ค.
decide๋ฅผ ์ฌ์ฉํด๋ ์คํจํ๋ค.
theorem onePlusOneIsStillTwo : OnePlusOneIsTwo := โข OnePlusOneIsTwo โข OnePlusOneIsTwo
์ด ์ญ์ OnePlusOneIsTwo๋ฅผ ํผ์น์ง ์๊ธฐ ๋๋ฌธ์ด๋ค.
abbrev๋ก OnePlusOneIsTwo๋ฅผ ์ ์ํ๋ฉด ํผ์น ์ ์๋ก ํ์๋๋ฏ๋ก ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋๋ค.
์ธ๋ฑ์ฑ ์ฐ์ฐ์ด ์์ ํ๋ค๋ ์ปดํ์ผ ํ์ ์ฆ๊ฑฐ๋ฅผ Lean์ด ์ฐพ์ง ๋ชปํ ๋ ๋ฐ์ํ๋ ์ค๋ฅ ์ธ์๋, ์์ ํ์ง ์์ ์ธ๋ฑ์ฑ์ ์ฌ์ฉํ๋ ๋คํ ํจ์๋ ๋ค์ ๋ฉ์์ง๋ฅผ ๋ผ ์ ์๋ค.
def unsafeThird (xs : List ฮฑ) : ฮฑ := xs[2]!์ด๋ Lean์ ์ ๋ฆฌ ์ฆ๋ช ์ ์ํ ๋ ผ๋ฆฌ์ด์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ก ์ฌ์ฉํ ์ ์๊ฒ ํ๋ ๊ธฐ์ ์ ์ ํ ๋๋ฌธ์ด๋ค. ํนํ ํ์ ์ ๊ฐ์ด ์ ์ด๋ ํ๋ ํฌํจ๋ ํ๋ก๊ทธ๋จ๋ง ์ค๋จํ ์ ์๋ค. Lean์ ๋ช ์ ๋ ์ฐธ์ ์ฆ๊ฑฐ๋ฅผ ๋ถ๋ฅํ๋ ์ผ์ข ์ ํ์ ์ด๊ธฐ ๋๋ฌธ์ด๋ค. ๊ฑฐ์ง ๋ช ์ ์๋ ๊ทธ๋ฐ ์ฆ๊ฑฐ๊ฐ ์๋ค. ๋น ํ์ ์ ๊ฐ์ง ํ๋ก๊ทธ๋จ์ด ์ค๋จํ ์ ์๋ค๋ฉด ๊ทธ ์ค๋จํ๋ ํ๋ก๊ทธ๋จ์ ๊ฑฐ์ง ๋ช ์ ์ ๊ฐ์ง ์ฆ๊ฑฐ์ฒ๋ผ ์ฌ์ฉํ ์ ์๋ค.
๋ด๋ถ์ ์ผ๋ก Lean์๋ ๊ฐ์ด ์ ์ด๋ ํ๋ ์๋ค๋ ์ฌ์ค์ด ์๋ ค์ง ํ์
์ ํ๊ฐ ์๋ค.
์ด ์ค๋ฅ๋ ์์์ ํ์
ฮฑ๊ฐ ๊ทธ ํ์ ๋ฐ๋์ ๋ค์ด ์๋ค๊ณ ํ ์ ์๋ค๋ ๋ป์ด๋ค.
๋ค์ ์ฅ์์๋ ์ด ํ์ ํ์
์ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ๊ณผ unsafeThird ๊ฐ์ ํจ์๋ฅผ ์ฑ๊ณต์ ์ผ๋ก ์์ฑํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช
ํ๋ค.
๋ชฉ๋ก๊ณผ ์กฐํ์ ์ฌ์ฉํ๋ ๋๊ดํธ ์ฌ์ด์ ๊ณต๋ฐฑ์ ๋ฃ์ผ๋ฉด ๋ ๋ค๋ฅธ ๋ฉ์์ง๊ฐ ๋์ฌ ์ ์๋ค.
#eval woodlandCritters [1]
๊ณต๋ฐฑ์ ๋ฃ์ผ๋ฉด Lean์ ์์ ํจ์ ์ ์ฉ์ผ๋ก, ์ธ๋ฑ์ค๋ฅผ ์ซ์ ํ๋๋ฅผ ๋ด์ ๋ชฉ๋ก์ผ๋ก ์ทจ๊ธํ๋ค.
์ด ์ค๋ฅ ๋ฉ์์ง๋ Lean์ด woodlandCritters๋ฅผ ํจ์๋ก ์ทจ๊ธํ๋ ค ํ๊ธฐ ๋๋ฌธ์ ๋์จ๋ค.
Exercises
-
๋ค์ ์ ๋ฆฌ๋ฅผ
rfl๋ก ์ฆ๋ช ํ๋ผ:2 + 3 = 5,15 - 8 = 7,"Hello, ".append "world" = "Hello, world".rfl๋ก5 < 18์ ์ฆ๋ช ํ๋ ค ํ๋ฉด ์ด๋ป๊ฒ ๋๋๊ฐ? ๊ทธ ์ด์ ๋ฅผ ์ค๋ช ํ๋ผ. -
๋ค์ ์ ๋ฆฌ๋ฅผ
by decide๋ก ์ฆ๋ช ํ๋ผ:2 + 3 = 5,15 - 8 = 7,"Hello, ".append "world" = "Hello, world",5 < 18. -
๋ชฉ๋ก์ ๋ค์ฏ ๋ฒ์งธ ํญ๋ชฉ์ ์กฐํํ๋ ํจ์๋ฅผ ์์ฑํ๋ผ. ์ด ์กฐํ๊ฐ ์์ ํ๋ค๋ ์ฆ๊ฑฐ๋ฅผ ํจ์์ ์ธ์๋ก ์ ๋ฌํ๋ผ.