← 갤러리
범주론

화살표만으로 본 수학

최대공약수⁠(greatest common divisor)⁠와 교집합⁠(intersection)⁠과 논리의 '그리고'는 같은 것입니다. 무엇으로 만들었는지는 묻지 않고, 다른 것들과 어떻게 이어지는지만 보면 그렇습니다. 1945년 두 수학자가 '자연스럽다'는 말 하나를 정확히 하려다 만든 언어, 범주론⁠(category theory)⁠으로 이 사이트의 여러 분야를 가로질러 봅니다.

이 글의 처럼 점선이 그어진 숫자는 좌우로 끌 수 있고(키보드 ←/→도 됩니다), 색이 칠해진 같은 말은 눌러서 바꿀 수 있습니다. 밑줄 친 말에 마우스를 올리면 그림에서 그 부분이 빛납니다. 그림 속의 점과 표의 칸은 대부분 누를 수 있고, 마우스를 올리면 정확한 값이 나옵니다. 휴대폰에서는 마우스를 올리는 대신 누르면 됩니다.

1897년 독일 브라운슈바이크. 3년 전 공과대학 교수 자리에서 물러난 리하르트 데데킨트가 예순을 훌쩍 넘긴 나이에 짧은 논문 한 편을 냈습니다. 제목은 「최대공약수에 의한 수의 분해에 관하여」. 실수⁠(real number)⁠를 '유리수⁠(rational number)⁠ 전체를 둘로 가르는 칼자리'(절단⁠, cut⁠)로 정의하고, 정수론⁠(number theory)⁠을 '아이디얼⁠(ideal)⁠'이라는 수의 모임으로 다시 쓴 사람이, 말년에 초등학교에서 배우는 최대공약수와 최소공배수⁠(least common multiple)⁠를 붙들고 있었습니다.

그가 들여다본 것은 계산이 아니라 법칙이었습니다. 최대공약수를 gcd, 최소공배수를 lcm으로 적고 법칙 두 가지를 12와 18로 확인해 봅시다.

법칙최대공약수 쪽최소공배수 쪽 (gcd와 lcm을 맞바꾼 것)
순서를 바꿔도 같다gcd(a, b) = gcd(b, a)
gcd(12, 18) = gcd(18, 12) = 6
lcm(a, b) = lcm(b, a)
lcm(12, 18) = lcm(18, 12) = 36
한쪽 결과를 다른 쪽에 넣으면 a로 돌아온다gcd(a, lcm(a, b)) = a
gcd(12, 36) = 12
lcm(a, gcd(a, b)) = a
lcm(12, 6) = 12

법칙이 늘 짝으로 나옵니다. 한 법칙에서 gcd와 lcm을 맞바꾸면 다른 법칙이 됩니다. 왜 그럴까요? 그림으로 그리면 까닭이 보입니다.

36의 약수⁠(divisor)⁠ 아홉 개(1, 2, 3, 4, 6, 9, 12, 18, 36)를 점으로 찍고, 어떤 수에 2나 3을 곱한 수를 한 칸 위에 두어 화살표로 잇습니다. 예를 들어 6에서는 12(= 6 × 2)와 18(= 6 × 3)로 화살표가 올라갑니다. 그러면 'a가 b를 나눈다'는 'a에서 화살표를 따라 위로만 가서 b에 닿는다'와 같은 말이 됩니다. 2는 36을 나누고, 실제로 2 → 6 → 12 → 36처럼 위로만 가서 닿습니다. 4는 18을 나누지 않고, 4에서 위로 가면 12와 36에만 닿습니다.

이것을 짧게 'a는 b의 아래에 있다'고 하고, 점 자신도 자기 아래에 있다고 칩니다. 그러면 두 수의 최대공약수는 두 수 모두의 아래에 있는 점들 가운데 맨 위의 점이고, 최소공배수는 두 수 모두의 위에 있는 점들 가운데 맨 아래의 점입니다. 12와 18로 확인해 봅시다. 둘 모두의 아래에 있는 점은 공약수 1, 2, 3, 6이고, 그 가운데 맨 위가 6입니다. 둘 모두의 위에 있는 점은 36 하나뿐이니 맨 아래도 36입니다. 표의 gcd(12, 18) = 6, lcm(12, 18) = 36과 같습니다.

점을 눌러 a와 b를 고르세요. 마지막으로 누른 점이 b, 그 전에 누른 점이 a입니다. 지금 보는 법칙 를 누르면 짝 법칙으로 바뀝니다. 그림 아래의 설명이 고른 수로 법칙을 한 걸음씩 따라갑니다.

36의 약수와 '나눈다' 화살표. 노란 점이 b입니다. 첫째 법칙에서는 분홍 점이 lcm(a, b), 흐린 청록 점이 a와 lcm(a, b) 모두의 아래에 있는 점, 청록 점이 그 가운데 맨 위의 점 a입니다. 둘째 법칙에서는 청록 점이 gcd(a, b), 흐린 분홍 점이 a와 gcd(a, b) 모두의 위에 있는 점, 분홍 점이 그 가운데 맨 아래의 점 a입니다.

순서를 바꿔도 같다는 법칙은 그림에서 당연합니다. '두 수 모두의 아래'는 어느 수를 먼저 부르든 같은 점들입니다.

둘째 줄의 법칙도 그림으로 읽힙니다. lcm(a, b)는 a의 위에 있으므로 a의 아래에 있는 점은 모두 lcm(a, b)의 아래에도 있고, 그래서 'a와 lcm(a, b) 모두의 아래에 있는 점'은 그냥 'a의 아래에 있는 점'입니다. 그 가운데 맨 위는 a 자신이니 gcd(a, lcm(a, b)) = a입니다. 이제 이 설명에서 '위'와 '아래'를 모두 맞바꿔 보세요. 최대공약수와 최소공배수의 뜻이 서로 바뀌고, 설명은 고칠 데 없이 lcm(a, gcd(a, b)) = a의 설명이 됩니다. 정리하면, 짝 법칙은 그림을 위아래로 뒤집어 읽은 같은 법칙입니다. 이 생각을 정확히 적는 것이 1절의 '화살표 뒤집기'입니다.

게다가 이 법칙들은 수에만 있지 않았습니다. 집합⁠(set)⁠의 교집합(두 집합에 모두 든 원소⁠(element)⁠들)과 합집합(어느 한쪽에라도 든 원소들)도, 조지 불이 1847년 논리를 대수로 적기 시작한 뒤 자리 잡은 '그리고'와 '또는'의 계산도 똑같은 법칙을 따릅니다. 예를 들어 {1, 2}와 {2, 3}의 교집합은 {2}이고, {1, 2}와 이 {2}의 합집합⁠(union)⁠은 다시 {1, 2}입니다. 교집합을 gcd로, 합집합을 lcm으로 읽으면 표의 lcm(12, gcd(12, 18)) = 12와 같은 모양입니다.

데데킨트는 이미 1894년, 더하고 빼도 그 안에 머무는 수들의 모임(가군)을 연구하면서 가군 사이의 두 연산이 이런 법칙을 따른다는 것을 적어 두었습니다. 이 논문에서는 두 연산이 이런 법칙을 따르는 구조에 '쌍대군'(Dualgruppe)이라는 이름을 붙여 본격적으로 다루었습니다. 오늘날 격자(lattice)라 부르는 구조, 곧 '두 원소마다 gcd 같은 연산과 lcm 같은 연산이 하나씩 있어 위와 같은 법칙들을 따르는 모임'입니다.

이 글의 물음은 이것입니다. 서로 다른 곳에서 태어난 수와 집합과 논리가 왜 같은 법칙을 따를까? 그 법칙들은 왜 늘 뒤집힌 짝으로 나타날까? 답은 반세기 뒤, 대상의 속을 열어 보지 않고 대상 사이의 화살표만 보는 언어에서 나왔습니다. 범주론입니다. 이 언어로 보면 최대공약수와 교집합과 '그리고'와 순서쌍⁠(ordered pair)⁠의 집합은 한 가지 성질이고, 화살표를 모두 뒤집으면 최소공배수와 합집합과 '또는'과 서로소 합집합⁠(disjoint union)⁠이 됩니다. 같은 눈으로 '자연스럽다'는 말의 뜻, 대상을 관계만으로 알아보는 요네다의 생각, 미분⁠(differentiation)⁠의 연쇄법칙⁠(chain rule)⁠, 내림과 올림을 차례로 봅니다. 그리고 이 언어가 해 주지 않는 것도 분명히 적어 두겠습니다. 낯선 이름이 많지만, 어느 것이든 먼저 손으로 확인할 수 있는 작은 예를 보인 뒤에 정의합니다.

1 · 1897년 브라운슈바이크하나의 성질, 세 개의 이름

이 절의 물음은 이것입니다. 최대공약수, 교집합, '그리고'를 한 문장으로 정의할 수 있을까? 그 문장에는 수도 원소도 참·거짓도 나오지 않고, 화살표만 나와야 합니다.

12와 18을 둘 다 나누는 수는 1, 2, 3, 6입니다. 최대공약수 6은 이 가운데 가장 큰 수이지만, 크기보다 더 쓸모 있는 성질이 있습니다. 나머지 공약수 1, 2, 3이 모두 6을 나눈다는 것입니다. 곧 '12와 18을 둘 다 나누는 수는 모두 6을 나눈다'는 성질입니다. 이 문장에는 크기가 나오지 않고 '나눈다'는 관계만 나옵니다.

유클리드 호제법⁠(Euclidean algorithm)⁠이 찾아 주는 것도 바로 이 성질을 가진 수입니다. 호제법은 두 수 가운데 큰 수를 '큰 수를 작은 수로 나눈 나머지⁠(remainder)⁠'로 바꾸기를 나머지가 0이 될 때까지 되풀이하는 방법입니다. 12와 18이면 (18, 12) → (12, 6) → (6, 0)이고, 남은 6이 답입니다. 한 번 바꿀 때마다 '두 수를 둘 다 나누는 수'의 모임은 그대로입니다. 18과 12를 둘 다 나누는 수는 나머지 6 = 18 − 12도 나누고, 거꾸로 12와 6을 둘 다 나누는 수는 18 = 12 + 6도 나누기 때문입니다. 마지막 (6, 0)을 둘 다 나누는 수는 6의 약수 전부이므로(0은 어떤 수로도 나누어떨어집니다), 처음의 12와 18을 둘 다 나누는 수는 모두 6을 나눕니다. 호제법은 공약수들의 크기를 한 번도 비교하지 않고 이 성질을 가진 수에 닿습니다.

'a가 b를 나눈다'를 a에서 b로 가는 화살표 a → b로 그려 봅시다. 머리말의 그림에서 위로 올라가는 화살표가 바로 이것입니다. 12와 18로 화살표를 보내는 수, 곧 둘 다 나누는 수는 1, 2, 3, 6입니다. 그 가운데 6은 나머지 1, 2, 3에게서 모두 화살표를 받습니다. 그러니 최대공약수는 이렇게 적힙니다. 두 수로 화살표를 보내는 수들 가운데, 나머지가 모두 화살표를 보내는 하나.

교집합도 똑같이 적힙니다. 'A가 B에 포함된다'(A의 원소가 모두 B에도 든다)를 A → B로 그립니다. {2, 3}과 {2, 5}에 모두 포함되는 집합은 빈 집합 ∅(원소가 하나도 없는 집합)과 {2} 둘이고, ∅은 {2}에 포함되니 {2}가 '나머지가 모두 포함되는 하나'입니다. 이것이 교집합이고, 기호로 {2, 3} ∩ {2, 5} = {2}라고 적습니다(∩는 '교집합'이라 읽습니다). 일반적으로 A ∩ B는 두 집합에 모두 포함되는 집합들 가운데 나머지가 모두 포함되는 하나입니다.

명제도 같습니다. 'p이면 q'를 p → q로 그리고, 이때 'p가 q를 끌어낸다'고 합시다. 'p 그리고 q'는 p와 q를 모두 끌어내는 명제들 가운데 나머지가 모두 끌어내는 하나입니다. 까닭은 두 방향으로 확인됩니다. 무엇이든 'p 그리고 q'를 끌어내면 p와 q를 각각 끌어내고, 거꾸로 p와 q를 둘 다 끌어내는 명제는 'p 그리고 q'도 끌어냅니다. 예를 들어 '오늘은 토요일이다'가 '주말이다'와 '평일이 아니다'를 둘 다 끌어낸다면, '주말이고 평일이 아니다'도 끌어냅니다.

세 세계에는 문장 말고도 공통점이 있습니다. 화살표 두 개가 끝과 시작이 맞으면 이어 붙일 수 있습니다. 2 → 6과 6 → 30이 있으면 2 → 30이 있고(2가 6을, 6이 30을 나누면 2는 30을 나눕니다), 포함과 '이면'도 마찬가지입니다. 또 모든 점에는 자기 자신으로 가는 화살표가 있습니다(6은 6을 나눕니다). 이 두 가지, 이어 붙이기와 제자리 화살표가 범주⁠(category)⁠를 이루는 재료의 전부입니다.

정확히 적으면 이렇습니다. 범주는 대상들(여기서는 점)과 그 사이의 화살표들로 이루어지고, 끝과 시작이 맞는 두 화살표 f: A → B, g: B → C를 이어 붙인 화살표 g ∘ f: A → C('f 다음 g'라 읽습니다. 먼저 하는 f를 오른쪽에 씁니다)가 있고, 대상마다 '제자리' 화살표가 하나씩 있어야 합니다. 조건은 둘입니다. 세 화살표를 이을 때 앞의 둘을 먼저 잇든 뒤의 둘을 먼저 잇든 결과가 같고(결합법칙⁠, associativity⁠), 제자리 화살표를 앞이나 뒤에 이어 붙여도 아무것도 바뀌지 않아야 합니다. 이 제자리 화살표를 항등 화살표라 부르고, A의 것을 idA\mathrm{id}_A로 적습니다. 약수의 세계처럼 두 점 사이에 화살표가 많아야 하나인 범주에서는 두 조건이 저절로 성립합니다. 화살표가 여럿일 수 있는 범주는 2절에서 봅니다.

세 경우가 모양까지 같다는 것을 그림으로 확인해 봅시다. 30의 약수는 1, 2, 3, 5, 6, 10, 15, 30의 여덟 개이고, 30 = 2 × 3 × 5이므로 약수는 소수⁠(prime number)⁠ 2, 3, 5 가운데 몇 개를 골라 곱한 것입니다. 6은 2와 3을 고른 것이고, 1은 하나도 고르지 않은 것입니다. 그래서 30의 약수와 {2, 3, 5}의 부분집합(원소를 몇 개 골라 만든 집합)은 6 ↔ {2, 3}, 1 ↔ ∅처럼 하나씩 짝지어집니다. 짝지어진 채로 화살표도 맞습니다. 6이 30을 나누듯 {2, 3}은 {2, 3, 5}에 포함되고, 6이 10을 나누지 않듯 {2, 3}은 {2, 5}에 포함되지 않습니다.

명제도 끼워 넣을 수 있습니다. 내일 날씨가 맑음, 흐림, 비 가운데 정확히 하나라고 하고, 명제를 '그것이 참이 되는 날씨들의 모임'으로 봅니다. '비는 안 온다'는 {맑음, 흐림}이고, '맑다'는 {맑음}입니다. 'p이면 q'는 p가 참인 날씨에서는 q도 참이라는 뜻, 곧 모임의 포함입니다. {맑음}이 {맑음, 흐림}에 포함되니 '맑다이면 비는 안 온다'가 성립합니다. 맑음을 2, 흐림을 3, 비를 5에 대응시키면 세 세계가 한 그림이 됩니다. '비는 안 온다'는 {2, 3}이고 6입니다.

아래 그림에서 할 일은 두 가지입니다. 먼저 점 두 개를 골라 청록 점(곱)과 분홍 점(쌍대곱⁠, coproduct⁠)이 어디에 서는지 봅니다. 그다음 이름표를 바꿔 가며, 같은 자리의 점이 세 세계에서 각각 무엇으로 불리는지 봅니다. 이름표: , 화살표: . 점을 차례로 눌러 두 원소를 고르세요(마지막으로 누른 두 점이 골라집니다). '곱'과 '쌍대곱'이라는 이름은 그림 뒤에서 정확히 정의합니다. 지금은 청록 점이 최대공약수 자리, 분홍 점이 최소공배수 자리라는 것만 보면 됩니다.

여덟 점과 회색 화살표가 한 세계입니다. 노란 점이 고른 두 원소, 청록 점이 곱, 분홍 점이 쌍대곱입니다. 흐린 청록 점은 두 원소로 화살표를 보내는 다른 후보, 흐린 분홍 점은 두 원소에서 화살표를 받는 다른 후보입니다. 청록 점선은 다른 후보에서 곱으로 가는 화살표, 분홍 점선은 쌍대곱에서 다른 후보로 가는 화살표입니다. 점에 마우스를 올리면 세 이름을 모두 보여 줍니다.

이름표를 바꿔도 색이 칠해지는 자리는 그대로입니다. 6과 10의 최대공약수 2, {2, 3}과 {2, 5}의 교집합 {2}, '비는 안 온다'와 '흐리지는 않다'의 '그리고'인 '맑다'가 모두 같은 점입니다. 세 세계가 같은 그림이니 같은 법칙을 따르는 것은 당연합니다. 그러나 더 중요한 것은 세 연산을 정한 문장이 한 가지라는 점입니다.

이 문장을 화살표만으로 적어 봅시다. 6과 10의 경우를 먼저 적습니다. 최대공약수 2에서는 6과 10으로 화살표가 하나씩 나갑니다(2 → 6, 2 → 10). 다른 공약수, 예를 들어 1도 6과 10으로 화살표를 보냅니다(1 → 6, 1 → 10). 그리고 1에서 2로 가는 화살표가 있어서, 1 → 6은 '1 → 2 다음 2 → 6'으로, 1 → 10은 '1 → 2 다음 2 → 10'으로 갈아탈 수 있습니다. 두 수로 화살표를 보내는 것은 모두 2를 거쳐 갈 수 있다는 뜻입니다.

이제 일반적으로 적습니다. 이것이 곱(product)입니다. 두 대상 A, B의 곱은 대상 P와 두 화살표 π1:P→A\pi_1 : P \to A, π2:P→B\pi_2 : P \to B로 이루어지고('파이 일', '파이 이'라 읽습니다. π₁: P → A는 'P에서 A로 가는 화살표 π₁'이라는 뜻입니다), 다른 어떤 대상 X와 화살표 f:X→Af : X \to A, g:X→Bg : X \to B가 와도 아래를 만족하는 화살표 u가 정확히 하나 있습니다.

u:X→P,π1∘u=f,π2∘u=gu : X \to P, \qquad \pi_1 \circ u = f, \qquad \pi_2 \circ u = g

식을 말로 읽으면 이렇습니다. X에서 P로 가는 화살표 u가 있어서, u 다음 π₁로 가면 f와 같고, u 다음 π₂로 가면 g와 같다. 6과 10의 예에 맞추면 A = 6, B = 10, P = 2, π₁ = (2 → 6), π₂ = (2 → 10)이고, X = 1일 때 f = (1 → 6), g = (1 → 10), u = (1 → 2)입니다. 곱 P는 'A와 B로 가는 모든 화살표 쌍이 거쳐 가는 길목'입니다.

이런 정의를 보편 성질⁠(universal property)⁠이라 부릅니다. 대상을 '무엇으로 만들었는가'가 아니라 '다른 모든 대상과 어떻게 이어지는가'로 정하기 때문입니다. 약수나 부분집합⁠(subset)⁠이나 명제처럼 두 원소 사이의 화살표가 많아야 하나인 세계에서는 u가 있기만 하면 '하나뿐'이라는 조건은 저절로 성립하고, 두 식 π1∘u=f\pi_1 \circ u = f, π2∘u=g\pi_2 \circ u = g도 저절로 맞습니다. 양쪽 모두 같은 두 점을 잇는 화살표인데, 그런 화살표는 하나뿐이기 때문입니다. 이 조건들이 실제로 일하는 모습은 2절에서 봅니다.

흔히 '두 원소마다 곱이 있다'고 생각하기 쉽지만, 곱이 늘 있는 것은 아닙니다. 네 원소 a, b, c, d가 있고 화살표가 c → a, c → b, d → a, d → b(그리고 제자리 화살표)뿐인 세계를 생각해 봅시다. a와 b로 화살표를 보내는 후보는 c와 d인데, c와 d 사이에는 화살표가 없어서 어느 쪽도 다른 쪽이 거쳐 가는 길목이 되지 못합니다. 그래서 a와 b의 곱은 없습니다. 보편 성질 페이지의 '나비넥타이' 순서가 이 예입니다(두 화살표 쌍이 엇갈린 모양이 나비넥타이를 닮았습니다).

이제 부분을 눌러 화살표를 모두 뒤집어 보세요. 곱의 정의는 한 글자도 바꾸지 않았는데 청록 고리가 원래의 최소공배수 자리로 올라갑니다. 6과 10을 골랐다면 청록 점이 30에 섭니다. 뒤집힌 세계에서 '두 원소로 화살표를 보내는 것'은 원래 세계에서 '두 원소에서 화살표를 받는 것'이기 때문입니다.

원래 세계에서 이 자리를 부르는 이름이 쌍대곱(coproduct)입니다. 곱의 정의에서 화살표 방향만 모두 바꾼 것입니다. 두 화살표 A→QA \to Q, B→QB \to Q가 있고, A와 B에서 X로 가는 화살표 쌍이 모두 Q를 거치는 하나뿐인 화살표 Q→XQ \to X로 정해집니다. 6과 10이면 Q = 30이고, 양의 정수⁠(integer)⁠ 전체의 세계에서 6과 10이 모두 나누는 다른 수, 예를 들어 X = 60에 대해 6 → 60과 10 → 60은 모두 '30까지 간 뒤 30 → 60'으로 갈아탈 수 있습니다. 약수에서는 최소공배수, 부분집합에서는 합집합, 명제에서는 '또는'입니다.

여기서 데데킨트가 본 짝의 까닭이 나옵니다. 어떤 범주든 대상은 그대로 두고 화살표를 모두 뒤집으면 다시 범주가 됩니다. 이것을 반대 범주⁠(opposite category)⁠라 합니다. 약수의 범주를 뒤집으면 '6 → 2'가 '6은 2의 배수⁠(multiple)⁠이다'를 뜻하는 범주가 됩니다. 그래서 화살표로만 적고 화살표로만 증명한 정리는, 모든 화살표를 뒤집은 짝 정리를 따로 증명하지 않고 공짜로 얻습니다. 뒤집은 범주에 원래 증명을 그대로 적용하면 되기 때문입니다. 머리말에서 gcd(a, lcm(a, b)) = a를 '위'와 '아래'만으로 설명했고, 그래서 위아래를 바꾼 설명이 lcm(a, gcd(a, b)) = a의 증명이 되었습니다. 곱과 쌍대곱을 맞바꾸고 화살표를 뒤집으면 한 정리의 증명이 다른 정리의 증명이 되는 것입니다.

분배법칙⁠(distributive law)⁠도 그렇습니다. 수로 적으면 gcd(a, lcm(b, c)) = lcm(gcd(a, b), gcd(a, c))이고, a = 6, b = 10, c = 15이면 왼쪽은 gcd(6, 30) = 6, 오른쪽은 lcm(2, 3) = 6입니다. gcd와 lcm을 맞바꾼 짝은 lcm(a, gcd(b, c)) = gcd(lcm(a, b), lcm(a, c))이고, 같은 수로 왼쪽은 lcm(6, 5) = 30, 오른쪽은 gcd(30, 30) = 30입니다. 명제로 읽으면 '그리고가 또는에 분배된다'와 '또는이 그리고에 분배된다'입니다. 격자에서는 이 둘이 서로를 끌어냅니다. 한쪽에서 다른 쪽을 끌어내는 증명을 한 번 하면, 반대 방향은 뒤집기로 공짜로 얻습니다. 이것이 쌍대성⁠(duality)⁠이 가장 깔끔하게 드러나는 모습입니다.

한 가지를 구별해 둡니다. 쌍대성 원리⁠(duality principle)⁠는 모든 세계에서 성립하지만, 뒤집은 세계가 원래 세계와 같은 모양이라는 보장은 없습니다. 양의 정수 전체를 나누어떨어짐으로 이으면 모든 수를 나누는 1은 있지만 모든 수가 나누는 양의 정수는 없으니, 뒤집으면 모양이 달라집니다.

30의 약수는 특별합니다. 거울이 있기 때문입니다. 각 약수 n을 30/n으로 보내 봅시다(이것을 n ↦ 30/n이라 적고, 'n을 30/n으로 보낸다'고 읽습니다). 1 ↔ 30, 2 ↔ 15, 3 ↔ 10, 5 ↔ 6이 서로 자리를 바꿉니다. 2가 6을 나누면 30/6 = 5는 30/2 = 15를 나누듯, 화살표는 모두 거꾸로 됩니다. 그래서 그림이 위아래로 뒤집혀 제자리에 겹칩니다. 지금 고른 두 원소로 확인하면 이렇습니다. n ↦ 30/n, 여집합(전체 {2, 3, 5}에서 빼고 남은 것), '아니다'는 모두 화살표를 뒤집으면서 그림을 제자리에 겹쳐 놓는 대응이고, 그래서 곱을 쌍대곱으로 보냅니다.

이것이 드모르간의 법칙입니다. 세 세계로 적으면 30/lcm(a, b) = gcd(30/a, 30/b), '합집합의 여집합⁠(complement)⁠은 여집합들의 교집합', '(p 또는 q)가 아니다'는 'p가 아니고 q도 아니다'와 같다는 것입니다. a = 6, b = 10이면 왼쪽은 30/30 = 1, 오른쪽은 gcd(5, 3) = 1입니다. 불 대수⁠(Boolean algebra)⁠에는 늘 이런 거울(부정)이 있습니다.

정리하면, 최대공약수·교집합·'그리고'는 '두 대상으로 화살표를 보내는 것들이 모두 거쳐 가는 길목'이라는 한 문장(곱)의 세 이름이고, 화살표를 뒤집은 같은 문장(쌍대곱)이 최소공배수·합집합·'또는'입니다. 짝 법칙은 이 뒤집기에서 나옵니다.

드모르간의 법칙이라는 이름의 주인은 런던 유니버시티 칼리지의 오거스터스 드모르간으로, 그는 1847년의 『형식 논리학』에서 이 법칙을 명제와 부류(집합)의 계산으로 다듬었습니다. 말로 풀어 쓴 형태는 중세 논리학자들도 알고 있었습니다. 같은 1847년에 불도 『논리의 수학적 분석』을 냈으니, 두 사람은 논리를 대수처럼 계산하려는 흐름을 함께 연 셈입니다. 드모르간은 5년 뒤인 1852년에는 한 학생이 가져온 지도 칠하기 질문을 더블린의 해밀턴에게 편지로 알려 4색 문제의 첫 기록을 남겼습니다(「일곱 다리의 도시」 4절).

데데킨트의 쌍대군은 한동안 거의 읽히지 않았습니다. 비슷한 무렵 독일의 논리학자 에른스트 슈뢰더도 1890년부터 낸 『논리 대수 강의』에서 같은 구조를 다루었지만, 이것을 하나의 분야로 세운 사람은 한 세대 뒤의 미국 수학자 개릿 버코프였습니다. 1933년 스물두 살의 그는 부분군⁠(subgroup)⁠들, 부분공간⁠(subspace)⁠들, 동치관계⁠(equivalence relation)⁠들의 모임이 모두 같은 법칙을 따른다는 것을 보고 이 구조에 lattice(격자)라는 이름을 붙였습니다. 부분공간은 평면 안에서 원점을 지나는 직선처럼 공간 안에 든 작은 공간이고, 부분군과 동치관계(원소들을 무리로 나누는 방식)도 저마다 포함 관계로 줄 세울 수 있습니다. 셋 모두 두 원소마다 '둘 다에 포함되는 가장 큰 것'과 '둘 다를 포함하는 가장 작은 것'이 늘 있습니다. 그것이 데데킨트의 쌍대군과 같다는 것은 뒤에 알았는데, 전하는 바로는 노르웨이 출신의 오위스테인 오레가 알려 주었다고 합니다. 버코프는 데데킨트의 논문을 알기 전에 그보다 조금 더 나아가 있었던 것을 다행으로 여겼다고 합니다. 그의 1940년 책 『격자 이론』이 이 분야의 교과서가 되었고, 이듬해 그는 하버드의 동료 매클레인과 함께 미국 대학에 추상대수⁠(abstract algebra)⁠를 퍼뜨린 교과서 『현대 대수학 개관』을 냈습니다. 3절에서 범주론을 만드는 사람이 바로 그 매클레인입니다.

2 · '정확히 하나'가 일하는 곳왜 합집합이 아니라 서로소 합집합인가

약수와 부분집합에서는 두 원소 사이에 화살표가 많아야 하나라서, 곱의 정의에 붙은 '정확히 하나'가 하는 일이 보이지 않았습니다. 이 절의 물음은 이것입니다. 두 대상 사이에 화살표가 여럿 있는 세계에서 곱과 쌍대곱은 무엇이 되고, '정확히 하나'는 어떤 후보를 걸러 낼까?

화살표가 많은 세계로 가 봅시다. 집합을 대상으로, 함수⁠(function)⁠를 화살표로 두는 세계입니다. 집합 X에서 집합 A로 가는 함수 f: X → A는 X의 원소마다 A의 원소를 하나씩 정해 주는 규칙입니다. X = {x, y}, A = {1, 2}라면 x와 y가 각각 1이나 2로 갈 수 있으니, X에서 A로 가는 함수는 (x↦1, y↦1), (x↦1, y↦2), (x↦2, y↦1), (x↦2, y↦2)의 4가지입니다(x↦1은 'x를 1로 보낸다'). 이제 두 대상 사이의 화살표가 여러 개입니다. 함수 두 개를 이어 붙이는 것은 '먼저 f를 적용하고 그 결과에 g를 적용하기', 곧 (g ∘ f)(x) = g(f(x))입니다.

A = {1, 2}, B = {2, 3}이라 하고, 곱과 쌍대곱의 후보를 몇 개 시험해 봅니다. 후보: .

시험하는 방법은 정의 그대로입니다. 곱의 후보 P라면 원소가 둘인 집합 X = {x, y}를 잡고, X에서 A로 가는 함수 f와 X에서 B로 가는 함수 g를 모두(각각 4가지, 모두 4 × 4 = 16쌍) 늘어놓습니다. 쌍마다 조건을 만족하는 u: X → P가 몇 개인지 셉니다. 함수에서 조건 π1∘u=f\pi_1 \circ u = f는 'X의 원소마다 π₁(u(x)) = f(x)'라는 뜻입니다. 곧 u는 x를, 첫째 화살표 π₁을 따라가면 f(x)에 닿고 둘째 화살표 π₂를 따라가면 g(x)에 닿는 P의 원소로 보내야 합니다. 쌍대곱의 후보 Q라면 방향을 뒤집어, A와 B에서 X = {p, q}로 가는 함수의 쌍마다 u: Q → X를 셉니다.

그림의 오른쪽 표에서 칸을 하나씩 눌러 보세요. 곱이나 쌍대곱이라면 16칸이 모두 초록(u가 정확히 하나)이어야 합니다. 빨간 칸은 u가 없는 경우, 주황 칸은 u가 둘 이상인 경우이고, 왼쪽 그림의 빨간 점과 주황 점이 그 까닭이 된 원소입니다.

왼쪽은 고른 시험 하나를 그린 것입니다. 노란 화살표가 f, 분홍 화살표가 g, 회색 화살표가 후보에 딸린 두 화살표, 초록 점선이 조건을 만족하는 u입니다(여러 개면 그 가운데 하나). 빨간 점은 u를 정할 수 없게 만드는 원소, 주황 점은 u를 두 가지 이상으로 정할 수 있게 만드는 원소입니다. 오른쪽 표의 칸은 16가지 시험이고, 칸의 수가 u의 개수입니다(초록 1, 빨강 0, 주황 2 이상). 칸을 누르면 왼쪽에 그립니다.

곱의 후보부터 봅시다. 순서쌍의 집합 A × B('A 곱하기 B')는 A의 원소 하나와 B의 원소 하나를 순서대로 짝지은 것들의 모임입니다. 여기서는 A × B = {(1, 2), (1, 3), (2, 2), (2, 3)}이고, π₁은 쌍의 앞자리를, π₂는 뒷자리를 읽는 함수입니다. 이 후보는 모든 칸이 1입니다. 예를 들어 f = (x↦1, y↦2), g = (x↦3, y↦2)이면 u는 x를 (1, 3)으로, y를 (2, 2)로 보내야 하고, 다른 선택은 없습니다. 일반적으로 u는 x를 (f(x), g(x))로 보내는 수밖에 없고, 그런 원소가 A × B에 꼭 하나 있기 때문입니다.

여기에 원소 ★ 하나를 덧붙여 π₁, π₂가 ★를 (1, 3)과 같은 곳으로 보내게 하면, 어떤 칸에서는 u가 X의 원소를 (1, 3)으로 보낼지 ★로 보낼지 고를 수 있게 되어 '정확히 하나'가 깨집니다. 쓸데없는 원소가 끼어 있으면 '하나뿐'이라는 조건이 그것을 잡아냅니다. 반대로 교집합 A ∩ B = {2}는 원소가 모자랍니다. 이 후보의 유일한 원소 2는 π₁으로 A의 2에, π₂로 B의 2에 가므로, f와 g가 모든 원소를 2로 보내는 한 칸에서만 u가 있고 나머지 15칸에서는 u가 없습니다. 집합의 세계에서 곱은 교집합이 아니라 순서쌍의 집합입니다. 부분집합의 세계에서 곱이던 교집합이, 함수의 세계에서는 곱이 아닌 것입니다. 어느 세계에서 보느냐, 곧 무엇을 화살표로 삼느냐가 답을 정합니다.

쌍대곱 쪽이 더 흥미롭습니다. 합집합 A ∪ B = {1, 2, 3}은 16칸 가운데 8칸에서 실패합니다. 2가 A에서도 오고 B에서도 오는데, f가 A의 2를 p로, g가 B의 2를 q로 보내면 u(2)를 정할 수 없기 때문입니다. f(2)와 g(2)가 같은 곳을 가리키는 절반의 칸에서만 통과합니다.

겹치는 원소도 '왼쪽에서 온 2'(2ᴬ)와 '오른쪽에서 온 2'(2ᴮ)로 따로 두는 서로소 합집합 A ⊔ B = {1ᴬ, 2ᴬ, 2ᴮ, 3ᴮ}만 모든 칸을 통과합니다(⊔는 '서로소⁠(coprime)⁠ 합'이라 읽습니다). 이제 u는 2ᴬ를 f(2)로, 2ᴮ를 g(2)로 따로 보낼 수 있습니다. 프로그래밍의 'A 아니면 B' 타입⁠(type)⁠이 값마다 어느 쪽에서 왔는지 꼬리표를 붙이는 까닭이 이것입니다(대수적 자료형⁠(algebraic data type)⁠). 여기에도 아무것도 들어오지 않는 ★를 덧붙이면 ★를 어디로 보낼지 마음대로 정할 수 있어서, 모든 칸이 2가 됩니다.

원소가 둘인 X만 시험해도 되는지 궁금할 수 있습니다. 집합에서는 이것으로 충분합니다. 곱의 조건은 X의 원소마다 따로 따지는 조건이라, 원소 둘로 모든 경우가 드러납니다(두 원소를 같은 곳으로 보내는 f, g를 쓰면 원소 하나짜리 X의 시험도 그 안에 들어 있습니다). 쌍대곱에서는 원소가 둘인 X로 'Q의 두 원소가 같은 곳으로 가야 하는가'를 가려낼 수 있습니다. 합집합의 2처럼 두 원소가 합쳐져 있으면 둘을 다른 곳으로 보내는 f, g에서 u가 없고, ★처럼 남는 원소가 있으면 그것을 p로도 q로도 보낼 수 있습니다. 그래서 이 표가 모두 초록이면 후보는 실제로 곱이나 쌍대곱입니다.

합집합이 실패하는 더 깊은 까닭도 있습니다. B를 이름만 바꾼 {7, 8}로 바꾸면 A ∪ B의 원소 수가 3에서 4로 바뀝니다. 합집합은 원소의 이름이 겹치느냐에 기대는 구성이라, 이름이 아니라 화살표만 보는 범주의 눈에는 아예 잡히지 않습니다. 곱과 쌍대곱은 이름을 바꿔도 같은 꼴(동형⁠, isomorphism⁠)로 남습니다. 두 대상이 동형이라는 것은 서로 오가는 화살표가 있어 이어 붙이면 제자리 화살표가 된다는 뜻이고, 집합에서는 원소를 하나씩 빠짐없이 짝지을 수 있다는 뜻입니다.

원소 수로 보면, |A|를 A의 원소 수라 할 때 ∣A×B∣=∣A∣⋅∣B∣|A \times B| = |A| \cdot |B|, ∣A⊔B∣=∣A∣+∣B∣|A \sqcup B| = |A| + |B|입니다. 여기서는 2 × 2 = 4와 2 + 2 = 4입니다. 경우의 수⁠(number of cases)⁠의 곱의 법칙⁠(rule of product)⁠과 합의 법칙⁠(rule of sum)⁠이 곧 곱과 쌍대곱입니다. 「세지 않고 세기」가 다룬 세는 기술들이 여기에 기대고 있습니다.

같은 두 문장이 사이트의 여러 분야에서 일합니다. 화살표를 무엇으로 삼느냐에 따라 곱과 쌍대곱이 이렇게 바뀝니다.

세계 (대상 · 화살표)곱쌍대곱 (화살표를 뒤집은 것)
양의 정수 · 나누어떨어짐최대공약수최소공배수
부분집합 · 포함교집합합집합
명제 · '이면'그리고또는
집합 · 함수순서쌍의 집합 A × B서로소 합집합 A ⊔ B
타입 · 프로그램쌍 타입 (A, B)'A 아니면 B' 타입
벡터 공간⁠(vector space)⁠ · 선형 사상⁠(linear map)⁠직합⁠(direct sum)⁠ A ⊕ B직합 A ⊕ B (같은 것)
군 · 준동형⁠(homomorphism)⁠직곱⁠(direct product)⁠ A × B자유곱 (곱셈이 서로 교환되지 않는 합)
실수 · 크기 순서(≤)minmax

표의 아래쪽 두 줄은 설명이 조금 필요합니다. 벡터⁠(vector)⁠ 공간은 화살표(벡터)를 더하고 수배(수를 곱해 늘이거나 줄이기) 할 수 있는 세계이고, 평면이 대표적인 예입니다. 벡터 공간 사이의 화살표는 선형 사상, 곧 덧셈과 수배를 지키는 함수(f(v + w) = f(v) + f(w), f(cv) = c·f(v))입니다. 이 세계에서는 곱과 쌍대곱이 같은 대상 A ⊕ B('직합')입니다. A의 벡터와 B의 벡터를 쌍으로 묶고, 쌍끼리는 자리별로 더하는 공간입니다.

평면 ℝ²(실수 두 개의 쌍 (x, y)들의 공간)로 확인해 봅시다. 평면은 두 직선의 곱입니다. 점 (x, y)에서 좌표 x와 y를 따로 읽을 수 있고, 거꾸로 두 좌표를 주면 점이 하나로 정해지기 때문입니다. 동시에 쌍대곱이기도 합니다. 가로축 위의 선형 사상 f와 세로축 위의 선형 사상 g를 아무렇게나 골라도, u(x, y) = f(x) + g(y)라는 평면 위의 선형 사상 하나로 합쳐지고, 그렇게 합치는 방법은 이것뿐이기 때문입니다. 차원은 1 + 1 = 2로 더해집니다.

군은 곱셈(또는 덧셈)이 있고, 원소마다 그 곱셈을 되돌리는 원소가 있는 세계입니다(정확한 법칙은 링크에 있습니다). 정수의 덧셈이 대표적이고, 이것을 ℤ로 적습니다. 군 사이의 화살표(준동형)는 곱셈을 지키는 함수입니다. 군에서는 곱과 쌍대곱이 전혀 달라서, ℤ 두 개의 곱은 정수 쌍들이지만 쌍대곱은 두 기호 a, b와 그 되돌림 a⁻¹, b⁻¹을 늘어놓은 낱말들(예: ab, ba, aab⁻¹)의 모임이고, 여기서 ab ≠ ba입니다. 다만 a 바로 옆에 a⁻¹이 오면(b와 b⁻¹도 마찬가지) 둘을 지워 없앤 것과 같은 낱말로 칩니다. 그래서 aa⁻¹b는 b와 같습니다. 이것을 자유곱⁠(free product)⁠이라 합니다.

논리의 '그리고'와 '또는'이 타입의 쌍과 '아니면'이라는 사실은 증명과 프로그램을 잇는 커리–하워드 대응⁠(Curry–Howard correspondence)⁠의 한 고리이고, 「증명은 프로그램이다」에서 이어집니다. 정리하면, 곱과 쌍대곱은 '무엇을 화살표로 삼느냐'에 따라 모습이 바뀌지만, 정의하는 문장은 어디서나 같습니다.

3 · 1945년'자연스럽다'는 말의 정확한 뜻

수학책에는 '자연스러운 대응'이라는 말이 자주 나옵니다. 두 대상을 짝짓는 방법이 여럿일 때, 어떤 것은 자연스럽고 어떤 것은 그렇지 않다고 합니다. 이 절의 물음은 이것입니다. 그 차이를 정확한 조건으로 적을 수 있을까? 이 물음에서 범주론이 태어났습니다.

범주라는 말이 처음 나온 곳은 곱이 아니라 '자연스럽다'는 형용사였습니다. 1941년 하버드의 손더스 매클레인이 미시간 대학에 강연하러 갔다가, 2년 전 바르샤바에서 건너온 위상수학자 새뮤얼 에일렌베르크를 만났습니다. 매클레인의 연속 강연은 군의 확장, 곧 작은 군 두 개로 큰 군을 짜 맞추는 방법을 세는 대수 문제였습니다. 마지막 강연에서 그는 한 가지 확장 군을 계산해 보였는데, 그 강연을 놓친 에일렌베르크가 따로 설명을 청해 들었습니다. 에일렌베르크는 그 답이, 1940년 스틴로드가 계산한 한 공간의 위상수학⁠(topology)⁠적 불변량(공간을 찢지 않고 늘리거나 구부려도 변하지 않는 값)과 똑같다는 것을 알아보았습니다. 그 공간은 솔레노이드, 곧 고리를 한없이 여러 겹으로 감아 만든 기묘한 공간을 3차원 구면에서 파낸 나머지입니다. 매클레인의 회고에 따르면 두 사람은 대수의 계산과 기하⁠(geometry)⁠의 계산이 왜 같은 답을 내는지 밤새 따졌습니다. 그렇게 공동 연구를 시작한 두 사람은 1942년의 짧은 논문에 이어 1945년 「자연 동치의 일반 이론」을 냈습니다. 수학자들이 늘 쓰면서도 정의한 적 없는 말, '자연스러운 동형'을 정의하는 것이 목적이었습니다. 그들은 이렇게 적었습니다.

범주라는 개념은 본질적으로 보조적인 것이다. 우리의 기본 개념은 본질적으로 함자⁠(functor)⁠와 자연 변환⁠(natural transformation)⁠이다.— 에일렌베르크와 매클레인, 「자연 동치의 일반 이론」(1945)

그들은 자기들의 일이 어디서 왔는지도 밝혔습니다. 같은 논문에서 이 이론을 "클라인의 에를랑겐 프로그램의 연장"이라고 부른 것입니다. 1872년 펠릭스 클라인은 비유클리드 기하⁠(non-Euclidean geometry)⁠와 사영기하⁠(projective geometry)⁠처럼 새 기하가 여럿 등장해 유클리드 기하와 나란히 놓인 혼란 속에서, 기하를 '어떤 변환들 아래서 변하지 않는 성질의 연구'로 정리하자고 제안했습니다(「평행선의 반란」). 에일렌베르크와 매클레인은 '공간과 그 변환들의 군'을 '대상들과 그 사이 화살표들의 대수'로 넓혔다고 적었습니다. 변환을 보면 대상이 보인다는 생각을, 변환이 되돌릴 수 없는 경우와 대상이 여럿인 경우까지 밀고 간 것입니다.

이름은 철학에서 빌려 왔습니다. '범주'는 아리스토텔레스와 칸트(그리고 미국의 철학자 찰스 샌더스 퍼스)의 낱말이고, '함자'는 논리학자 루돌프 카르나프의 낱말입니다. 아리스토텔레스의 범주는 실체, 양, 질, 관계처럼 '있는 것을 말하는 가장 일반적인 갈래'였고, 칸트의 범주는 경험을 정리하는 지성의 틀이었습니다. 두 수학자는 낱말만 가져오고 뜻은 수학으로 새로 정했습니다. 그래도 '가장 일반적인 틀'이라는 울림은 남아, 이 글이 수와 집합과 논리를 한 그림에 놓는 까닭과 통합니다.

논문은 선형대수⁠(linear algebra)⁠의 예로 시작합니다. 함자와 자연 변환도 이 예에서 나오니, 평면에서 천천히 따라가 봅시다. 평면의 점(벡터)을 v = (v₁, v₂)처럼 좌표 두 개로 적습니다. 평면 위의 선형 함수는 벡터를 받아 수를 내놓되 덧셈과 수배를 지키는 함수이고, 평면에서는 늘 φ(w) = a·w₁ + b·w₂ 꼴입니다(φ는 '파이'라 읽습니다). 예를 들어 ψ(w) = w₁ − 2w₂이면(ψ는 '프사이'라 읽습니다) ψ(3, 1) = 3 − 2 = 1입니다.

평면 V 위의 선형 함수들을 모두 모은 것을 V*('브이 스타', 쌍대 공간⁠(dual space)⁠)라 합니다. 선형 함수 하나는 두 수 (a, b)로 정해지니, V*도 평면처럼 수 두 개로 적히는 공간입니다. 이런 뜻에서 V와 V*는 같은 꼴(동형)입니다. 일반적으로 유한 차원(좌표가 유한 개인) 공간 V와 V*는 차원이 같아서 늘 같은 꼴입니다. 그런데 벡터 하나에 선형 함수 하나를 실제로 짝지으려면 규칙을 골라야 합니다. v = (a, b)를 a·w₁ + b·w₂에 짝지을 수도 있고, 2a·w₁ + b·w₂에 짝지을 수도 있습니다. 어느 쪽도 일대일 대응입니다.

반면 V와 이중 쌍대⁠(double dual)⁠ V**('선형 함수를 받아 수를 내놓는 선형 함수'들의 공간)는 아무것도 고르지 않고 짝지어집니다. 벡터 v를 '선형 함수 ψ를 받아 ψ(v)를 내놓는 것'에 짝지으면 됩니다. v = (3, 1)이면 이 짝은 위의 ψ를 받아 1을 내놓습니다. 이 규칙에는 좌표를 어떻게 잡느냐가 나오지 않습니다. 왜 한쪽은 고르는 일이 필요하고 다른 쪽은 필요 없는지를 그림으로 봅시다.

평면 위의 선형 함수 φ는 수를 내놓는 함수이니 화살표로 그릴 수 없지만, 등고선으로는 정직하게 그릴 수 있습니다. φ(w) = k인 점들은 직선이고, k = −3, −2, …, 3의 직선들은 같은 간격으로 늘어선 줄무늬가 됩니다. 이제 벡터 v 하나에 선형 함수 하나를 짝짓는 가장 흔한 방법, 내적⁠(dot product)⁠ v↦⟨v,⋅⟩v \mapsto \langle v, \cdot \rangle을 봅시다. 내적은 ⟨v, w⟩ = v₁w₁ + v₂w₂이고, 식은 'v를, w를 받아 ⟨v, w⟩를 내놓는 선형 함수로 보낸다'고 읽습니다(가운데 점 ·은 w가 들어갈 빈자리입니다). 그림의 처음 v = (1.5, 1)이면 짝은 w ↦ 1.5w₁ + w₂입니다. 노란 줄무늬가 ⟨v, w⟩ = k인 직선들입니다. v에 수직이고, v가 길수록 촘촘합니다.

이 짝짓기가 '자연스럽다'는 것은 평면을 어떻게 옮겨도 짝짓기가 따라온다는 뜻입니다. 되돌릴 수 있는 선형 사상 f로 평면을 옮긴다고 합시다. v에서 출발해 선형 함수에 닿는 길이 두 가지 생깁니다. 하나는 v를 그대로 짝짓는 길이고(노랑), 다른 하나는 v를 f(v)로 옮긴 뒤 짝짓는 길입니다. 두 번째 길의 결과 ⟨f v, ·⟩은 옮긴 평면 위의 함수이므로, 노랑과 비교하려면 원래 평면으로 되돌려 읽어야 합니다. 원래 평면의 w를 먼저 f로 옮긴 뒤 넣는 것입니다. 그러면 w ↦ ⟨f v, f w⟩가 됩니다. 이것이 분홍 줄무늬입니다.

두 길을 네모의 두 변처럼 그릴 수 있어서, 두 길의 결과가 같으면 '네모가 닫힌다'고 말합니다. 짝짓고 옮기든 옮기고 짝짓든 같아야 하므로, 자연스럽다면 두 줄무늬가 모든 v에서 겹쳐야 합니다. 손으로 먼저 확인해 봅시다. f가 가로로 1.5배 늘리는 사상이고 v = (1, 0)이면, 노랑은 w ↦ w₁입니다. f(v) = (1.5, 0), f(w) = (1.5w₁, w₂)이니 분홍은 w ↦ 1.5 × 1.5w₁ = 2.25w₁입니다. w = (1, 0)을 넣으면 노랑은 1, 분홍은 2.25로 다릅니다. 분홍 줄무늬가 2.25배 촘촘한 것입니다.

이제 그림에서 여러 f로 시험해 보세요. 보기: , f: . 청록과 파란 화살표는 f가 두 기준 벡터 e₁ = (1, 0), e₂ = (0, 1)을 보내는 곳이고, 끌어서 바꿀 수 있습니다. 선형 사상은 이 두 벡터가 가는 곳만 정하면 전부 정해집니다(v = v₁e₁ + v₂e₂이니 f(v) = v₁f(e₁) + v₂f(e₂)). 이 두 벡터를 세로로 세워 나란히 놓은 수표가 f의 행렬⁠(matrix)⁠이고, 두 벡터는 행렬의 두 열입니다. 흰검은 화살표 v도 끌 수 있습니다. 볼 것은 하나입니다. 어떤 f에서 두 줄무늬가 모든 v에 대해 겹치는가?

노란 줄무늬는 ⟨v, w⟩ = k(k = −3, …, 3)인 직선들, 분홍 줄무늬는 비교할 선형 함수가 k인 직선들이고, 굵은 줄이 k = 0입니다. 청록·파란 화살표 끝을 끌면 f(또는 기저)가 바뀌고, 흰검은 화살표 끝을 끌면 v가 바뀝니다.

f를 30° 회전⁠(rotation)⁠이나 위아래 뒤집기로 두면 두 줄무늬가 늘 겹칩니다. 밀기, 가로 1.5배, 모두 2배로 두면 어긋납니다. 식으로는 모든 v, w에 대해 ⟨f v, f w⟩ = ⟨v, w⟩이어야 합니다. 내적은 길이와 각도로 정해지는 값이므로(⟨v, v⟩는 v의 길이의 제곱입니다), 이 조건은 f가 길이와 각을 지키는 변환, 곧 회전과 뒤집기(직교 변환⁠, orthogonal transformation⁠)라는 것과 같습니다. 행렬로는 f의 행렬 M이 MTM=IM^{\mathsf T} M = I를 만족한다는 것입니다. 여기서 Mᵀ('M 전치')는 M의 행과 열을 맞바꾼 행렬, I는 아무것도 바꾸지 않는 단위행렬⁠(identity matrix)⁠ (1001)\begin{pmatrix} 1 & 0 \\ 0 & 1 \end{pmatrix}이고, 이 식은 'M의 두 열이 서로 수직이고 길이가 1'이라는 말과 같습니다. 그림 아래의 설명에 지금 f의 M과 MᵀM이 한 행씩 [[첫째 행], [둘째 행]] 꼴로 적혀 나오니, MᵀM이 [[1.00, 0.00], [0.00, 1.00]], 곧 단위행렬인지 확인해 보세요.

그러니 내적으로 짝짓는 방법은 회전과 뒤집기에 대해서는 자연스럽지만, 되돌릴 수 있는 선형 사상 전체에 대해서는 자연스럽지 않습니다. '자연스럽다'는 말에는 늘 '어떤 화살표들에 대해서'가 따라붙어야 한다는 것, 이것이 이 정의가 처음 밝혀 준 것입니다.

그렇다면 되돌릴 수 있는 선형 사상 전체에 대해 자연스러운 짝짓기가 따로 있을까요? 없습니다. 직선(1차원 공간) 위에서 모든 것을 2배로 늘리는 f를 생각하면 됩니다. 직선 위의 선형 함수는 w ↦ c·w 꼴이고, 수 c 하나로 정해집니다. 자연스러운 짝짓기 η('에타')가 있어서 η가 1을 w ↦ c·w에 짝짓는다고 합시다. 짝짓기가 선형이니 η(2v) = 2η(v)이어야 하고, 그래서 2는 w ↦ 2c·w에 짝지어집니다. 한편 자연스럽다면 네모가 닫혀야 합니다. 1을 f로 옮기면 2이고, 2의 짝 w ↦ 2c·w를 되돌려 읽으면(w를 먼저 2배 해서 넣으면) w ↦ 2c·2w = 4c·w입니다. 이것이 1의 짝 w ↦ c·w와 같아야 하므로 4c = c, 곧 c = 0입니다. 그러면 η는 모든 벡터를 0을 내놓는 함수에 짝짓게 되어 일대일 대응⁠(one-to-one correspondence)⁠이 될 수 없습니다(자연 변환). 한 줄로 줄이면, 선형성은 η(2v)가 η(v)를 2배 한 것이기를, 자연성⁠(naturality)⁠은 ½배 한 것이기를 요구하니 둘 다 만족하는 짝은 0뿐입니다.

보기를 '기저로 짝짓기'로 바꾸면 흔히 쓰는 다른 방법이 보입니다. 기저는 평면의 모든 벡터를 v = c₁·b₁ + c₂·b₂로 딱 한 가지 방법으로 적게 해 주는 두 벡터 b₁, b₂이고, (c₁, c₂)가 그 기저에 대한 v의 좌표입니다. 기저를 고르면 '좌표 c₁을 읽는 함수'와 '좌표 c₂를 읽는 함수'가 생기는데, 이 둘을 쌍대 기저라 합니다. 이 방법은 v의 좌표 (c₁, c₂)를 받아 w ↦ c₁·(w의 첫 좌표) + c₂·(w의 둘째 좌표)에 짝짓습니다. 기저를 끌면 같은 v의 짝이 따라 움직이고, 두 벡터가 서로 수직이고 길이가 1일 때에만 노랑과 겹칩니다.

식으로 보기

행렬로 적으면 기저 행렬이 B일 때 v의 짝은 w↦vT(BBT)−1ww \mapsto v^{\mathsf T} (B B^{\mathsf T})^{-1} w이고, 이것은 'B를 정규직교⁠(orthonormal)⁠ 기저로 만드는 내적'으로 짝짓는 것과 같습니다. B는 b₁, b₂를 두 열로 세운 행렬입니다. v의 좌표는 c = B⁻¹v이고 w의 좌표는 B⁻¹w이므로, 짝이 내놓는 값은 (B⁻¹v)ᵀ(B⁻¹w) = vᵀ(B⁻¹)ᵀB⁻¹w = vᵀ(BBᵀ)⁻¹w입니다.

기저를 고르는 일은 내적을 고르는 일이었던 것입니다. 흔히 V와 V*를 '같은 공간'으로 여기지만, 그렇게 여기는 순간 기저나 내적 하나를 이미 고른 것입니다.

이제 이중 쌍대 쪽을 봅시다. 이중 쌍대로 가는 짝짓기는 v↦evvv \mapsto \mathrm{ev}_v, evv(ψ)=ψ(v)\mathrm{ev}_v(\psi) = \psi(v)입니다. ev는 evaluation(값 매기기)의 줄임말이고, ev_v는 '선형 함수 ψ를 받아 v에서의 값 ψ(v)를 내놓는 것'입니다. 여기서도 f로 옮기는 길과 그대로 짝짓는 길을 비교합니다. V**의 원소를 f로 옮기는 규칙 f**는 'ψ를 받으면 ψ 대신 ψ ∘ f(먼저 f, 다음 ψ)를 넣어 준다'는 것입니다. 지금 그림의 f와 v로 계산하면 이렇습니다.

이 정의에는 기저도 내적도 나오지 않고, 되돌릴 수 없는 f까지 포함한 모든 선형 사상에 대해 네모가 닫힙니다. 두 길 모두 결국 ψ(f(v))를 계산하기 때문입니다.

이제 이름을 붙일 수 있습니다. 공간 V마다 공간 V**를, 선형 사상 f마다 선형 사상 f**를 정해 주는 대응처럼, 대상은 대상으로, 화살표는 화살표로 함께 옮기되 이어 붙이기와 항등 화살표⁠(identity arrow)⁠를 지키는 대응을 함자라 합니다(5절에서 더 자세히 봅니다). 아무것도 바꾸지 않는 대응(V는 V로, f는 f로)도 함자입니다. 두 함자 사이에서 대상마다 화살표를 하나씩 골라 놓은 것(여기서는 V마다 v ↦ ev_v 하나)이 모든 화살표 f에 대해 네모를 닫으면, 이것을 자연 변환이라 합니다. 에일렌베르크와 매클레인은 이런 '모든 화살표와 맞물리는 대상별 선택'을 정의하려 했고, 그러려면 함자가, 그러려면 대상과 화살표의 세계인 범주가 먼저 있어야 했습니다.

하나 더 짚어 둘 것이 있습니다. 자연스러운 것과 동형인 것은 별개입니다. 좌표가 끝없이 필요한 무한 차원 공간에서도 V→V∗∗V \to V^{**}는 여전히 자연스럽고 서로 다른 벡터를 서로 다른 곳으로 보내지만, V**가 훨씬 커서 동형은 아닙니다. 유한 차원에서는 두 공간의 차원이 같아 동형이 됩니다.

목록을 재배열하는 프로그램으로 같은 네모를 확인하는 그림은 「증명은 프로그램이다」 5절에 있습니다. 거기서 본 결론은 여기서도 같습니다. 자연 변환은 모든 대상에 같은 방식으로, 대상의 속을 들여다보지 않고 일해야 합니다. 기저를 고르는 일은 공간 하나하나를 들여다보는 선택이라 자연스럽지 않습니다.

행렬식⁠(determinant)⁠이 자연 변환이라는 것도 같은 뜻입니다. 2 × 2 행렬 (abcd)\begin{pmatrix} a & b \\ c & d \end{pmatrix}의 행렬식은 ad − bc입니다. 행렬식은 어느 가환환(덧셈과 뺄셈과 곱셈이 되고 곱하는 순서를 바꿔도 되는 수 체계⁠(number system)⁠, 예를 들어 정수나 '5로 나눈 나머지')에서나 성분들의 같은 다항식⁠(polynomial)⁠이라, 정수 행렬의 행렬식을 구한 뒤 5로 나눈 나머지를 보든, 성분을 먼저 5로 나눈 나머지로 바꾼 뒤 행렬식을 구하든 같습니다. (7345)\begin{pmatrix} 7 & 3 \\ 4 & 5 \end{pmatrix}로 확인하면, 행렬식은 35 − 12 = 23이고 5로 나눈 나머지는 3입니다. 성분을 먼저 바꾸면 (2340)\begin{pmatrix} 2 & 3 \\ 4 & 0 \end{pmatrix}이고, 행렬식 0 − 12 = −12를 5로 나눈 나머지도 3입니다(−12 = 5 × (−3) + 3). 큰 정수 행렬의 행렬식을 여러 소수로 나눈 나머지에서 따로 구해 중국인의 나머지 정리⁠(Chinese remainder theorem)⁠로 맞추는 방법이 이 자연성에 기댑니다.

'자연스럽다'가 가장 쓸모 있게 일하는 곳은 서로 크기가 같은 두 모임 사이입니다. 원소 수가 같은 두 유한 집합 사이에는 일대일 대응이 늘 있고, 보통은 아주 많습니다. 예로 두 인수를 한꺼번에 받는 함수와 인수를 하나씩 받는 함수를 봅시다. 더하기 add(a, b) = a + b는 두 수를 한꺼번에 받습니다. 같은 일을 '수 a를 받아 함수 b ↦ a + b를 돌려주는 함수'로도 할 수 있습니다. 3을 넣으면 '3을 더하는 함수'가 나오고, 거기에 4를 넣으면 7입니다. 앞의 것을 뒤의 것으로 바꾸는 규칙을 커링⁠(currying)⁠이라 합니다.

두 인수를 한꺼번에 받는 함수 A × B → C들의 모임과 인수를 하나씩 받는 함수 A → (B → C)들의 모임은 원소가 각각 ∣C∣∣A∣∣B∣|C|^{|A||B|}개와 (∣C∣∣B∣)∣A∣(|C|^{|B|})^{|A|}개로 수가 같으니, 둘 사이의 일대일 대응은 아주 많습니다. 예를 들어 A와 C가 원소 2개, B가 원소 3개이면 두 수는 2⁶ = 64와 (2³)² = 64입니다(A × B의 원소 6개가 저마다 C의 원소 2개 가운데 하나로 가니 2⁶입니다). 그 가운데 커링 f↦(a↦(b↦f(a,b)))f \mapsto (a \mapsto (b \mapsto f(a, b)))만 A, B, C를 무엇으로 바꿔도 같은 규칙으로 작동하고, 앞뒤에 어떤 함수를 이어 붙여도 맞물립니다. 수가 같다는 것은 우연이 아니라 이 자연스러운 대응의 그림자입니다. 커링을 표로 직접 해 보는 그림은 데카르트 닫힌 범주⁠(cartesian closed category)⁠에, 타입의 원소를 세어 지수 법칙을 확인하는 그림은 「증명은 프로그램이다」 6절에 있습니다.

정리하면, 짝짓기가 '자연스럽다'는 것은 어떤 화살표로 옮긴 뒤에 짝지어도 짝지은 뒤에 옮겨도 결과가 같다는 뜻이고, 이 조건을 적으려고 함자와 자연 변환과 범주가 만들어졌습니다.

범주론의 두 사람이 미시간에서 만난 데에는 유럽의 사정이 있었습니다. 에일렌베르크는 바르샤바 대학에서 카롤 보르수크의 지도로 1936년 박사 학위를 받은 폴란드 위상수학 학파의 사람이었습니다. 1918년 독립⁠(independence)⁠한 폴란드에서 수학자 지그문트 야니셰프스키는 한 분야에 힘을 모으는 학술지를 구상했고, 그가 세상을 떠난 직후인 1920년 바르샤바에서 『푼다멘타 마테마티카에』가 창간되었습니다. 수학의 한 분야만 다루는 첫 전문 학술지로, 집합론⁠(set theory)⁠과 위상수학과 수학의 기초⁠(basics)⁠를 실었습니다. 에일렌베르크의 박사 논문도 여기 실렸습니다. 1939년 그는 아버지의 권유로 미국으로 떠났고, 프린스턴의 오즈월드 베블런과 솔로몬 레프셰츠의 도움으로 이듬해 미시간 대학에 자리를 얻었습니다. 매클레인은 그보다 앞서 유럽 수학의 다른 중심이 무너지는 것을 괴팅겐에서 직접 보았습니다. 1933년 5월 그는 어머니에게, 해고되거나 떠난 교수와 강사가 너무 많아 수학과가 거의 빈껍데기가 되었다고 써 보냈습니다. 범주론은 바르샤바에서 건너온 위상수학과 괴팅겐에서 배워 온 대수학이 미시간의 한 강연장에서 만난 자리에서 태어난 셈입니다. 에일렌베르크는 1949년 앙드레 베유의 초대로 프랑스 수학자 집단 부르바키에 들어가 1950–51년을 파리에서 보냈고, 1966년까지 그 모임에 나갔습니다. 범주를 만든 사람이 프랑스 수학의 한가운데에 들어간 것입니다.

4 · 1950년대 파리관계를 알면 대상을 안다: 요네다

1절에서는 최대공약수를 '다른 수들과 어떻게 이어지는가'로 정했습니다. 이 절의 물음은 이것을 끝까지 밀고 갑니다. 대상의 속은 전혀 보지 않고, 다른 대상들과의 화살표만 보고도 그 대상이 무엇인지 알아낼 수 있을까?

놀이를 하나 해 봅시다. 60의 약수 열두 개 가운데 하나를 컴퓨터가 몰래 골랐습니다. 이 수 h를 직접 물을 수는 없고, 물을 수 있는 것은 화살표뿐입니다. '들어오는 화살표'로 물으면 수 d를 눌러 'd → h, 곧 d가 h를 나누는가'를 묻고, '나가는 화살표'로 물으면 'h → d, 곧 h가 d를 나누는가'를 묻습니다. 묻는 방향: . 새 문제 모든 화살표 보기

60의 약수를 나누어떨어짐으로 이은 그림입니다(아래에서 위로 가는 화살표가 '나눈다'). 초록 점은 '예', 빨간 점은 '아니요'라는 답을 받은 물음, 흰검은 점은 아직 후보인 수, 어두운옅은 점은 답과 맞지 않아 후보에서 빠진 수입니다. 후보가 하나 남으면 그 수가 노랗게 바뀝니다. 점에 마우스를 올리면 그 점에서 묻는 물음이 나옵니다.

후보가 하나로 줄어드는 까닭은 서로 다른 두 수가 들어오는 화살표를 똑같이 가질 수 없기 때문입니다. a와 b의 약수가 모두 같다면, a는 a 자신을 나누니 a가 b의 약수이고, 같은 까닭으로 b가 a의 약수이니 a = b입니다. 12와 20으로 보면, 12의 약수 {1, 2, 3, 4, 6, 12}에는 12가 있지만 20의 약수 {1, 2, 4, 5, 10, 20}에는 12가 없어서 둘이 갈립니다. 이 논증의 요점은 한 가지입니다. '자기 자신에게로 가는 화살표', 곧 항등 화살표 a → a를 넣어 보는 것입니다.

'모든 화살표 보기'를 누르면 열두 물음의 답이 한꺼번에 나옵니다. 초록 점들은 h로 들어오는 화살표 전체이고, 그 가운데 나머지 초록 점이 모두 나누는 점이 딱 하나 있습니다. h 자신입니다(h | h, 'h는 h를 나눈다'). 들어오는 화살표 전체의 정보가 항등 화살표 h → h 하나에 모여 있다는 것, 이것이 요네다 논법의 알맹이입니다.

이 관찰을 모든 범주로 넓힌 것이 요네다 보조정리⁠(Yoneda lemma)⁠입니다. 일반 정리로 가기 전에, 놀이의 세계에서 한 걸음 더 나간 사실을 하나 확인해 둡시다. A의 약수가 모두 B의 약수이면 A는 B를 나눕니다. 까닭은 역시 항등 화살표입니다. A는 A의 약수이므로 B의 약수이기도 합니다. 12와 60이면 12의 약수 {1, 2, 3, 4, 6, 12}가 모두 60을 나누고, 실제로 12는 60을 나눕니다. 12와 18이면 4가 12는 나누지만 18은 나누지 않고, 12도 18을 나누지 않습니다. '들어오는 화살표들 사이의 관계'가 '대상 사이의 화살표'를 정확히 알려 준 것입니다.

일반적인 범주에서도 같은 일을 합니다. 대상 A로 들어오는 화살표들을 모두 모으면, 대상 X마다 'X에서 A로 가는 화살표들의 집합' Hom(X, A)가 하나씩 생깁니다(Hom은 homomorphism, 곧 '구조를 지키는 화살표'에서 온 이름입니다). 약수의 세계에서 Hom(X, A)는 X가 A를 나누면 화살표 하나짜리 집합이고, 나누지 않으면 빈 집합입니다. 놀이의 초록 점들이 Hom(X, h)가 비어 있지 않은 X들이었습니다. 또 다른 대상 X′('X 프라임')에서 X로 가는 화살표 g: X′ → X가 있으면, X에서 A로 가는 화살표 앞에 g를 이어 붙여 X′에서 A로 가는 화살표를 얻습니다. 이렇게 대상마다 집합을, 화살표마다 집합 사이의 함수를 주는 모음을 Hom(−, A)라 적습니다. 빈칸 −에 대상을 넣으면 집합이 나온다는 뜻입니다.

요네다 보조정리는 이 모음이 A를 동형인 것까지 정확히 결정한다고 말합니다. 더 정확히는 이 모음에서 다른 모음 F(대상마다 집합을, 화살표마다 함수를 주는 또 다른 모음)로 가는 자연 변환이 F(A)의 원소와 하나씩 대응하고, 그 원소는 항등 화살표 idA\mathrm{id}_A가 가는 곳입니다. 식으로 적으면 아래와 같고, 'Hom(−, A)에서 F로 가는 자연 변환들(Nat)은 F(A)의 원소들과 일대일로 대응하며(≅), 자연 변환 α('알파')는 α가 id_A를 보내는 곳에 대응한다'고 읽습니다.

Nat(Hom(−,A), F)  ≅  F(A),α  ↦  αA(idA)\mathrm{Nat}\bigl(\mathrm{Hom}(-, A),\, F\bigr) \;\cong\; F(A), \qquad \alpha \;\mapsto\; \alpha_A(\mathrm{id}_A)

F가 Hom(−, B)이면 이 식은 위에서 확인한 사실이 됩니다. 'A로 들어오는 화살표를 B로 들어오는 화살표로 자연스럽게 바꾸는 방법'이 'A에서 B로 가는 화살표'와 하나씩 대응합니다. 약수로는 'A의 약수가 모두 B의 약수'와 'A가 B를 나눈다'가 같은 말이라는 것입니다.

증명은 놀이에서 본 한 수 그대로입니다. 아무 화살표 f: X → A는 idA\mathrm{id}_A 앞에 f를 이어 붙인 것이므로(f = id_A ∘ f), 자연 변환이 f를 보내는 곳은 idA\mathrm{id}_A를 보내는 곳에서 자연성으로 정해집니다. 그래서 Hom(−, A)와 Hom(−, B)가 자연스럽게 같은 모양이면 A와 B는 같은 꼴입니다.

'사물은 다른 모든 것과 맺는 관계로 정해진다'는 흔한 요약이 정확해지려면 두 가지가 붙어야 합니다. 정해지는 것은 동형인 것까지이고, 관계들 사이의 대응이 자연스러워야, 곧 화살표를 이어 붙이는 일과 맞물려야 합니다. 두 수의 약수가 '개수만' 같은 것으로는 부족하다는 뜻입니다. 12와 18은 약수가 여섯 개씩이지만 다른 수입니다.

같은 정리가 여러 분야에서 다른 얼굴로 나옵니다. 먼저 군입니다. 정삼각형을 0°, 120°, 240° 돌리는 회전 셋은 '잇달아 돌리기'를 곱셈으로 하는 군입니다. 이것을 대상이 하나(삼각형)뿐이고 화살표가 세 회전인 범주로 볼 수 있습니다. 120° 회전 g를 모든 원소에 곱하면 0° → 120°, 120° → 240°, 240° → 0°로 세 원소의 자리가 바뀝니다. 이렇게 원소 g가 모든 원소에 왼쪽에서 곱해지는 방식(h ↦ gh라는 치환, 곧 자리 바꾸기)이 g를 정확히 정하고, 그래서 모든 군이 치환들의 군 안에 구조째로 들어갑니다. 1854년 아서 케일리가 적은 케일리의 정리이고, 요네다 보조정리 페이지에서 정삼각형의 대칭으로 직접 확인할 수 있습니다. 여기서도 비결은 아무것도 하지 않는 원소, 곧 항등원 e(0° 회전)에 물어보는 것입니다. g·e = g이니까요.

프로그래밍에서는 '모든 타입 R에 대해, A → R 함수를 주면 R을 돌려주는 것'이 A의 값 하나와 같다는 사실이 됩니다. 예를 들어 정수 5를 가진 것은 '함수 k를 받으면 k(5)를 돌려주는 것'이 됩니다. 그런 것이 할 수 있는 일은 가지고 있는 A 값 하나를 받은 함수에 넣는 것뿐이기 때문입니다(다형성⁠, polymorphism⁠). 타입도 '그 타입에서 나가는 함수들이 어떻게 생겼는가'로 정해집니다. 참·거짓 두 값의 타입 Bool에서 X로 가는 함수는 X의 원소 두 개(참일 때와 거짓일 때)와 정확히 대응하고, 이 성질이 Bool을 '원소 하나짜리 타입 두 개의 쌍대곱'으로 정합니다. 2절의 서로소 합집합으로 말하면 {참} ⊔ {거짓}입니다.

대수기하학에서는 알렉산더 그로텐디크가 이 생각을 밀고 나가, 방정식이 정하는 도형을 '수 체계마다 그 안의 해들의 모임을 주는 함자'로 보았습니다. x² + y² = 1은 실수에서는 원, 13으로 나눈 나머지에서는 점 12개, 유리수에서는 (3/5, 4/5) 같은 점들의 모임입니다((3/5)² + (4/5)² = 9/25 + 16/25 = 1). 수 체계를 바꾸면 해의 모임도 따라 바뀌니, 이 대응은 대상과 화살표를 함께 옮기는 함자입니다. 이 모음들 전체가 도형을 결정한다는 것을 요네다 보조정리가 보장합니다. 관계로 대상을 대신하는 이 방법은 표현 바꾸기의 가장 극단적인 형태입니다.

정리하면, 대상은 그리로 들어오는 화살표 전체로 (동형인 것까지) 정해지고, 그 정보는 항등 화살표 하나에 모여 있습니다.

이 보조정리⁠(lemma)⁠의 이름은 매클레인이 붙였습니다. 요네다의 동료 기노시타 요시키가 전한 이야기로는, 1950년대 중반 파리 북역의 카페에서 요네다 노부오가 매클레인에게 이 논법을 설명했고, 대화는 요네다가 탄 기차가 떠날 때까지 이어졌습니다. 요네다는 그때 이십대 중반의 젊은 수학자였습니다.

이름은 요네다의 것이지만, 이 논법이 널리 알려진 길은 요네다의 논문이 아니었습니다. 그가 1954년 도쿄에서 발표한 논문은 가군 사이의 확장을 다루는 호몰로지 계산(작은 대수 구조 둘로 큰 구조를 짜 맞추는 방법들을 체계적으로 세는 계산)이었고, 파리 북역에서 매클레인에게 설명한 논법은 매클레인의 강의와 교과서를 거쳐 '요네다 보조정리'라는 이름으로 퍼졌습니다. 요네다의 경력은 뜻밖의 쪽으로도 이어졌습니다. 1960년대 그는 국제정보처리연맹(IFIP)의 알고리즘⁠(algorithm)⁠ 언어 작업반(WG 2.1)에 참여해, 프로그래밍 언어 ALGOL 60을 유지하고 ALGOL 68을 설계하는 일을 함께했습니다. 범주론의 핵심 정리 하나에 이름을 남긴 사람이 프로그래밍 언어의 설계자이기도 했던 것입니다. 8절의 모나드⁠(monad)⁠와 「기계가 풀 수 없는 문제」에서 보는 계산의 이론은 그만큼 수학과 가깝습니다.

5 · 1957년 캔자스함자: 구조를 지키는 번역

이 절의 물음은 이것입니다. 한 세계의 문제를 다른 세계로 옮겨 풀려면, 옮기는 규칙이 무엇을 지켜야 할까? 그리고 그렇게 옮기면 무엇을 얻을까?

작은 예부터 봅시다. 30의 약수마다 '소인수의 개수'를 붙이면 1 ↦ 0, 2 ↦ 1, 6 ↦ 2, 30 ↦ 3처럼 약수의 세계가 수 0, 1, 2, 3의 세계로 옮겨집니다. 수의 세계에서는 'm ≤ n'을 화살표 m → n으로 봅니다. a가 b를 나누면 a의 소인수는 모두 b의 소인수이니 a의 소인수 개수는 b의 것 이하입니다. 그래서 화살표 a → b는 화살표로 옮겨집니다. 6과 10이 둘 다 2로 가듯 정보는 잃지만, 화살표는 하나도 잃지 않습니다. 이 번역에서 곧바로 불가능이 증명됩니다. 6 ↦ 2, 5 ↦ 1이고 2 ≤ 1은 거짓이니, 6은 5를 나눌 수 없습니다. 번역한 쪽에 화살표가 없으면 원래 쪽에도 없습니다.

이런 번역이 함자입니다. 함자 F는 한 범주의 대상을 다른 범주의 대상으로, 화살표를 화살표로 보내면서 두 가지를 지킵니다. 이어 붙인 화살표는 이어 붙인 화살표로 가고(F(g∘f)=F(g)∘F(f)F(g \circ f) = F(g) \circ F(f), '이어 붙인 뒤 옮기나 옮긴 뒤 이어 붙이나 같다'), 항등 화살표는 항등 화살표로 갑니다. 구조를 지키는 번역입니다. 번역이 구조를 지키면, 번역한 쪽에서 불가능한 일은 원래 쪽에서도 불가능합니다. 원래 쪽에서 그 일이 되었다면, 번역한 결과도 번역한 쪽에서 그대로 되었을 것이기 때문입니다.

이 수법의 유명한 예가 기본군입니다. 앙리 푸앵카레가 1895년 논문 「위치 해석⁠(analysis situs)⁠」에서 만든 기본군⁠(fundamental group)⁠은 공간마다 '한 점에서 떠나 돌아오는 고리들'의 군을 붙이는 함자입니다. 두 고리는 한쪽을 끊지 않고 조금씩(연속적으로) 움직여 다른 쪽으로 바꿀 수 있으면 같은 것으로 칩니다. 공간 사이의 연속 함수는 고리를 고리로 옮기므로 군 사이의 화살표로 옮겨집니다. 원 위의 고리는 원을 몇 바퀴, 어느 방향으로 감았느냐로 구별되니, 원의 기본군은 정수 전체 ℤ입니다(한 바퀴는 1, 반대로 두 바퀴는 −2). 원판 위의 고리는 모두 한 점으로 오므릴 수 있으니, 원판의 기본군은 원소 하나짜리 군 0입니다.

이제 원판에서 경계의 원으로, 원 위의 점은 움직이지 않으면서 연속적으로 접어 넣는 방법이 있다고 해 봅시다. 원을 원판에 넣었다가(원 → 원판) 다시 원으로 접으면(원판 → 원) 원의 모든 점이 제자리이니, 이어 붙인 것은 원의 항등 화살표입니다. 함자로 옮기면 ℤ → 0 → ℤ가 항등이어야 합니다. 그런데 0을 거치면 모든 정수가 0으로 가니, 1이 1로 돌아올 수 없습니다. 불가능하므로 그런 방법은 없고, 여기서 브라우어르의 이름이 붙은 2차원 고정점 정리⁠(fixed-point theorem)⁠가 나옵니다. 원판에서 원판으로 가는 연속 함수에는 반드시 제자리에 머무는 점, 곧 f(p) = p인 점 p가 있다는 정리입니다. 자세한 논증은 함자 페이지에 있습니다. 이렇게 '움직여도 변하지 않는 것'을 찾아 불가능을 증명하는 수법이 각의 삼등분과 5차방정식에서는 어떤 모습인지는 「불가능의 증명」에 있습니다.

이 사이트에서 가장 자주 쓰인 함자는 뜻밖에도 미분입니다. 함수 f의 점 a에서의 미분 f′(a)('f 프라임 a')는, x를 a에서 아주 조금 움직일 때 f(x)가 그 몇 배만큼 움직이는지를 나타내는 기울기입니다. f(x) = x²이고 a = 3이면, x를 3에서 3.01로 0.01만큼 움직일 때 f(x)는 9에서 9.0601로 0.0601만큼 움직입니다. 약 6배이고, 실제로 f′(3) = 2 × 3 = 6입니다.

한 점 a에서 미분하면 '값 f(a)'와 '기울기⁠(slope)⁠ f′(a)'를 얻습니다. 이 둘을 함께 옮기는 대응을 T라 합시다. T는 실수 a와 기울기 s의 쌍을 (f(a), f′(a) · s)로 보냅니다. 여기서 s는 '지금까지 쌓인 기울기', 곧 처음 입력을 조금 움직일 때 a가 몇 배로 움직이는지입니다. 손으로 해 봅시다. f(x) = x² 다음 g(y) = 3y + 1을 이어 붙이면 g(f(x)) = 3x² + 1입니다. x = 3에서 출발하면 (3, 1)이 T(f)로 (9, 6 × 1) = (9, 6)이 되고, T(g)로 (3 × 9 + 1, 3 × 6) = (28, 18)이 됩니다. 한편 3x² + 1을 직접 미분하면 6x이니 x = 3에서 18이고, 값은 28입니다. 두 길의 답이 같습니다.

이것이 연쇄법칙 (g∘f)′(a)=g′(f(a))⋅f′(a)(g \circ f)'(a) = g'(f(a)) \cdot f'(a)입니다(위의 예에서 18 = 3 × 6). 이 법칙은 정확히 T가 합성을 지킨다는 말, T(g∘f)=T(g)∘T(f)T(g \circ f) = T(g) \circ T(f)입니다. 항등함수의 기울기가 1이라는 것은 T가 항등을 지킨다는 말입니다. 연쇄법칙은 '미분은 함자다'라는 문장의 다른 이름입니다. 함수 세 개를 골라 확인해 보세요. f1f_1 = , f2f_2 = , f3f_3 = , 출발점 x = .

위 줄은 함수의 세계로, 노란 화살표가 세 함수이고 점 위의 수가 각 단계의 값입니다. 아래 줄은 T로 옮긴 세계로, 점 아래의 쌍이 (값, 지금까지의 기울기)이고 청록 화살표의 '×수'가 그 단계에서 곱하는 국소 기울기입니다. 점선 곡선은 세 단계를 한꺼번에 합성한 화살표이고, 세로 점선은 T가 위 줄의 대상을 아래 줄로 옮긴다는 표시입니다. 화살표와 점에 마우스를 올리면 설명이 나옵니다.

아래 줄은 한 단계마다 국소 기울기를 곱해 넘길 뿐인데, 마지막 쌍의 기울기가 세 함수를 한꺼번에 이어 붙인 함수(점선 곡선)의 기울기와 같습니다. 위 설명의 마지막 문장이 그것을 수치 미분⁠(numerical differentiation)⁠과 맞춰 본 것이고, 함수와 출발점을 바꿔도 두 값은 수치 미분의 오차 안에서 같습니다. 이것이 T(g ∘ f) = T(g) ∘ T(f)를 세 단계로 쓴 모습입니다.

아래 줄의 계산이 자동 미분⁠(automatic differentiation)⁠의 전진 모드입니다. 식을 기호로 미분하지도, 수치로 근사하지도 않고, 값과 기울기의 쌍을 한 단계씩 넘기기만 합니다. 컴퓨터로는 ε² = 0인 가상의 수 ε('엡실론')를 붙인 'a + sε'로 계산하는 이원수(dual number)가 흔히 쓰입니다. f(a + sε) = f(a) + f′(a)sε이 국소 선형성⁠(local linearity)⁠ 그 자체이기 때문입니다. 예를 들어 (3 + ε)² = 9 + 6ε + ε² = 9 + 6ε이고, 앞자리 9가 값, ε의 계수 6이 기울기 f′(3)입니다.

신경망⁠(neural network)⁠을 학습시키는 역전파⁠(backpropagation)⁠는 같은 합성을 반대 방향으로 읽습니다. 변수가 여럿이면 각 단계의 기울기는 수 하나가 아니라 '입력 하나를 조금 움직일 때 출력 하나가 몇 배로 움직이는가'를 모두 적은 수표, 곧 야코비 행렬⁠(Jacobian matrix)⁠ JiJ_i이고, 합성의 기울기는 J3J2J1J_3 J_2 J_1입니다(곱셈 순서는 합성의 순서와 같아서, 먼저 하는 J₁이 오른쪽에 옵니다). 역전파는 이 곱을 전치해 출력 쪽부터 J1TJ2TJ3TJ_1^{\mathsf T} J_2^{\mathsf T} J_3^{\mathsf T}로 계산합니다. 전치는 곱의 순서를 뒤집으니((BA)T=ATBT(BA)^{\mathsf T} = A^{\mathsf T} B^{\mathsf T}) 화살표를 뒤집는 함자이고, 여기에도 1절의 쌍대성이 있습니다. 출력이 하나(손실)이고 입력이 수백만 개(매개변수⁠, parameter⁠)일 때 뒤집은 쪽이 훨씬 싼 까닭이 「배우는 기계」 5절에 있습니다. 코널 엘리엇은 2018년 논문 「자동 미분의 단순한 본질」에서 미분을 이런 함자로 보고, 기울기를 무엇으로 나타내느냐만 바꿔 전진 모드⁠(forward mode)⁠와 후진 모드⁠(reverse mode)⁠를 한 틀에서 끌어냈습니다.

정리하면, 함자는 이어 붙이기와 항등을 지키는 번역이고, 그래서 한쪽의 불가능을 다른 쪽의 불가능으로, 한쪽의 합성을 다른 쪽의 합성으로 옮깁니다. 연쇄법칙은 미분이 그런 번역이라는 말입니다.

범주론이 대수적 위상수학의 편리한 표기에서 수학의 공용어로 바뀐 계기는 한 편의 긴 논문이었습니다. 1955년 무렵 캔자스 대학에 머물던 스물일곱 살의 그로텐디크는, 가군과 층을 따로따로 다루던 호몰로지 대수를 한 틀로 다시 세웠습니다. 가군은 벡터 공간을 닮은 대수 구조이고, 층은 공간의 작은 조각마다 붙인 자료를 겹치는 곳에서 맞춰 이어 붙인 것이며, 호몰로지 대수는 이런 구조에서 '구멍'이나 '어긋남'을 재는 계산 기술입니다. 그 결과가 1957년 일본의 『도호쿠 수학 저널』에 실린 「호몰로지 대수의 몇 가지 문제에 관하여」, 흔히 도호쿠 논문이라 부르는 글입니다. 그는 가군들의 세계와 층들의 세계가 공통으로 가진 성질을 화살표만으로 적어 '아벨 범주⁠(abelian category)⁠'라 부르고, 그 성질만 써서 증명했습니다. 한 번의 증명이 두 세계에서 동시에 일하게 된 것입니다.

함자의 쓸모가 먼저 드러난 곳은 대수적 위상수학이었습니다. 1952년 에일렌베르크와 노먼 스틴로드는 『대수적 위상수학의 기초』에서, 저마다 다르게 정의되던 여러 호몰로지 이론을 '공간의 범주에서 군의 범주로 가는 함자로서 몇 가지 공리⁠(axiom)⁠를 만족하는 것'으로 한꺼번에 정의했습니다. 계산법이 아니라 성질로 이론을 정한 것입니다. 1956년에는 앙리 카르탕과 에일렌베르크의 『호몰로지 대수』가 나왔고, 에일렌베르크의 제자 데이비드 북스바움은 1955년 논문에서 가군이 아닌 대상들에도 그 방법을 쓰려고 '완전 범주⁠(exact category)⁠'라는 추상적인 틀을 제안했습니다. 그로텐디크의 아벨 범주는 이 흐름 위에서, 층까지 한꺼번에 담도록 공리를 다듬은 것입니다.

푸앵카레의 논문 제목 '위치 해석'(Analysis Situs)은 라이프니츠가 1679년에 구상한 분야의 이름이고, 오일러가 쾨니히스베르크 다리 문제를 풀며 '위치의 기하학⁠(geometry of position)⁠'이라 부른 것도 같은 분야입니다(「일곱 다리의 도시」). 크기를 버리고 이어짐만 보는 오일러의 눈이, 공간마다 대수적 대상을 붙이는 함자로 자란 셈입니다.

6 · 1958년수반: 어디에나 있는 짝

이 절의 물음은 이것입니다. 서로 다른 두 세계 사이를 오가는 두 번역이 있을 때, 한쪽의 물음을 다른 쪽의 물음으로 정확히 바꿔 주는 짝은 어떤 모양일까? 이런 짝이 수반 함자이고, 수학 곳곳에 있습니다.

수반의 가장 작은 예는 학교에서 배우는 내림과 올림입니다. 실수 x의 내림 ⌊x⌋는 x 이하인 가장 큰 정수입니다. ⌊2.3⌋ = 2, ⌊−0.25⌋ = −1, ⌊3⌋ = 3입니다. 올림 ⌈x⌉는 x 이상인 가장 작은 정수이고, ⌈2.3⌉ = 3입니다. 그런데 내림의 정의에서 '가장 큰'을 빼고 관계만으로 적을 수도 있습니다. 모든 정수 n에 대해

n≤⌊x⌋  ⟺  n≤x.n \le \lfloor x \rfloor \iff n \le x.

기호 ⟺는 '왼쪽 문장과 오른쪽 문장은 참거짓이 같다'는 뜻입니다. 정수에 대한 물음 'n ≤ x인가'가 정수 ⌊x⌋에 대한 물음으로 정확히 옮겨진다는 뜻입니다. x = 2.3이면 ⌊x⌋ = 2이고, n = 2일 때 두 물음은 모두 참, n = 3일 때 모두 거짓입니다. 이 식이 '가장 큰'을 대신하는 까닭도 보입니다. n = ⌊x⌋를 넣으면 ⌊x⌋ ≤ x이고, n ≤ x인 정수는 모두 n ≤ ⌊x⌋이니 ⌊x⌋가 그 가운데 가장 큽니다. 올림은 반대쪽 짝입니다. 모든 정수 n에 대해 ⌈x⌉≤n  ⟺  x≤n\lceil x \rceil \le n \iff x \le n입니다.

내림과 올림 말고도 실수를 정수로 보내는 방법은 많습니다. 어느 것이 이 조건을 지키는지 표로 시험해 봅시다. 표의 칸 하나는 x 하나와 n 하나의 조합이고, 두 물음의 답이 다르면 빨갛게 칠해집니다. 빨간 칸이 하나라도 있으면 그 r은 조건을 지키지 못한 것입니다. r = , 조건: .

맨 윗줄은 x = −3부터 3까지 0.25 간격에서의 r(x)입니다. 그 아래 일곱 줄은 정수 n = 3, …, −3이고, 칸마다 조건의 두 물음을 따져 답이 같으면 초록(둘 다 참이면 밝게, 둘 다 거짓이면 어둡게), 다르면 빨강으로 칠했습니다. 칸에 마우스를 올리면 두 물음과 답이 나옵니다.

반올림은 x = 2.5에서 3을 내놓는데 2.5는 3보다 작으니 첫째 조건이 깨지고(n = 3이면 3 ≤ 3은 참, 3 ≤ 2.5는 거짓), '0 쪽으로 버림'은 음수에서 −0.25를 0으로 올려 버리니 깨집니다(n = 0이면 0 ≤ 0은 참, 0 ≤ −0.25는 거짓). 내림만이 첫째 조건을, 올림만이 둘째 조건을 모든 칸에서 지킵니다.

게다가 조건이 답을 하나로 정합니다. 4절의 요네다 논법을 정수에서 쓰면, 두 정수 m, m′('엠 프라임')에 대해 'n ≤ m'과 'n ≤ m′'이 모든 정수 n에서 같은 답을 내면 m = m′이기 때문입니다. n = m을 넣으면 m ≤ m이 참이니 m ≤ m′이고, n = m′을 넣으면 m′ ≤ m이기 때문입니다. 4절에서 항등 화살표를 넣어 본 것과 같은 한 수입니다.

이제 이것이 왜 범주론의 말인지 봅시다. 크기 순서도 범주입니다. 수 a, b 사이에 a ≤ b일 때 화살표 a → b가 하나 있다고 보면 됩니다(a ≤ b, b ≤ c이면 a ≤ c이니 이어 붙이기도 됩니다). 그러면 함자는 화살표를 화살표로 보내는 것, 곧 'a ≤ b이면 r(a) ≤ r(b)'를 지키는 함수(단조 함수)입니다. 내림, 올림, 그리고 정수를 그대로 실수로 보는 포함 i가 모두 그렇습니다. 순서를 범주로, 단조 함수를 함자로 보면 이 조건이 수반의 가장 작은 모습입니다. 일반적으로 함자 L과 R 사이의 수반 L⊣RL \dashv R은 화살표들 사이의 자연스러운 일대일 대응입니다('L은 R의 왼쪽 수반'이라 읽습니다).

Hom(LX, Y)  ≅  Hom(X, RY)\mathrm{Hom}(L X,\, Y) \;\cong\; \mathrm{Hom}(X,\, R Y)

말로 읽으면, 'L X에서 Y로 가는 화살표'와 'X에서 R Y로 가는 화살표'가 하나씩 짝지어진다는 것입니다. L은 화살표의 출발점 쪽에, R은 도착점 쪽에 붙습니다. 순서에서는 화살표가 있거나 없거나 둘 중 하나이므로, 이 식은 'L X ≤ Y ⟺ X ≤ R Y'가 됩니다. 정수를 실수로 보는 포함을 i라 하면 올림 ⊣ i ⊣ 내림이고, 순서에서는 이 식이 위의 두 동치로 줄어듭니다. 올림을 L, i를 R로 넣으면 ⌈x⌉ ≤ n ⟺ x ≤ n이고, i를 L, 내림을 R로 넣으면 n ≤ x ⟺ n ≤ ⌊x⌋입니다.

이런 짝을 알아 두면 계산이 짧아집니다. 양의 정수 m에 대해 ⌊⌊x⌋/m⌋=⌊x/m⌋\lfloor \lfloor x \rfloor / m \rfloor = \lfloor x / m \rfloor를 증명해 봅시다. 흔히 이런 식은 x의 소수 부분⁠(fractional part)⁠에 따라 경우를 나눠 증명하지만, 여기서는 두 정수가 '모든 k에서 같은 답을 낸다'는 것만 보이면 됩니다. 아무 정수 k에 대해 k≤⌊⌊x⌋/m⌋  ⟺  km≤⌊x⌋  ⟺  km≤x  ⟺  k≤⌊x/m⌋k \le \lfloor \lfloor x \rfloor / m \rfloor \iff km \le \lfloor x \rfloor \iff km \le x \iff k \le \lfloor x/m \rfloor입니다. 첫째와 셋째 ⟺에는 수반과 함께 '양수 m으로 곱하고 나누어도 부등호가 그대로'라는 것을, 가운데 ⟺에는 km이 정수라는 것과 수반을 썼습니다. 한 걸음씩 풀면 이렇습니다.

  1. k ≤ ⌊⌊x⌋/m⌋ ⟺ k ≤ ⌊x⌋/m. 내림의 수반(k는 정수)입니다.
  2. k ≤ ⌊x⌋/m ⟺ km ≤ ⌊x⌋. 양변에 양수 m을 곱했습니다.
  3. km ≤ ⌊x⌋ ⟺ km ≤ x. km이 정수이니 다시 내림의 수반입니다.
  4. km ≤ x ⟺ k ≤ x/m ⟺ k ≤ ⌊x/m⌋. m으로 나눈 뒤, 마지막으로 내림의 수반을 한 번 더 썼습니다.

모든 k에서 답이 같으니 두 정수는 같습니다. x = 7.5, m = 2로 확인하면 ⌊7/2⌋ = 3, ⌊3.75⌋ = 3입니다. 경우를 나누지 않고, 수반과 요네다만으로 끝났습니다.

같은 모양의 짝이 사이트 곳곳에 있습니다. 어느 것이든 '한쪽의 화살표 = 다른 쪽의 화살표'라는 짝짓기입니다.

매클레인이 1971년 교과서에 적은 대로 "수반 함자는 어디에나 나타납니다". 수반이 쓸모 있는 까닭도 이 목록에 있습니다. 한쪽에서 어려운 물음을 다른 쪽의 쉬운 물음으로 정확히 옮겨 주고, 극한⁠(limit)⁠을 지키는 쪽과 쌍대극한⁠(colimit)⁠을 지키는 쪽을 알려 줍니다. 극한은 곱처럼 '모두가 거쳐 가는 길목'으로 정한 것들을 통틀어 부르는 이름이고, 쌍대극한은 쌍대곱처럼 화살표를 뒤집은 것입니다. 오른쪽 수반은 극한을, 왼쪽 수반은 쌍대극한을 지킵니다. 양화사에서 본 '∃와 또는', '∀와 그리고'가 그 예입니다.

정리하면, 수반은 'L X → Y'라는 물음과 'X → R Y'라는 물음을 정확히 맞바꿔 주는 두 함자의 짝이고, 내림과 올림이 그 가장 작은 예입니다.

'수반'이라는 이름은 1958년에 붙었습니다. 그해 대니얼 칸은 호몰로지 이론의 계산에서 되풀이해 나타나던 이 짝에 수반 함자라는 이름을 붙였습니다. 전하는 이야기로는, 암스테르담에서 태어나 이스라엘로 건너간 칸이 1954년 예루살렘의 히브리 대학을 찾아온 에일렌베르크의 호텔 방 문을 두드려 자기가 찾은 계산법을 설명했습니다. 그리고 에일렌베르크가 낸 숙제를 한 주 만에 풀어 왔고, 이듬해 그의 지도로 박사 학위를 받았습니다. 범주론의 둘째 세대는 이렇게 사람에서 사람으로 이어졌습니다.

내림과 올림의 기호는 생각보다 새것입니다. 가우스가 1808년 이차 상호 법칙(두 소수 사이의 나머지에 관한 정수론의 법칙)의 셋째 증명에서 쓴 대괄호 [x]가 150년 넘게 표준이었고, 지금의 ⌊x⌋와 ⌈x⌉, 그리고 floor와 ceiling이라는 이름은 1962년 케네스 아이버슨이 프로그래밍 언어 APL을 소개한 책 『프로그래밍 언어』에서 만들었습니다.

7 · 1963–1970집합과 논리를 화살표로: 로베어

지금까지는 범주를 수학 여러 곳에 쓰는 도구로 보았습니다. 이 절의 물음은 한 걸음 더 나갑니다. 집합과 논리처럼 수학의 바탕이라 여기던 것까지 화살표만으로 적을 수 있을까?

1963년 컬럼비아 대학에서 에일렌베르크의 지도로 박사 학위를 받은 윌리엄 로베어는 범주를 수학의 도구가 아니라 바탕으로 쓰자고 제안했습니다. 박사 논문 「대수적 이론의 함자 의미론」에서 그는 군이나 환(덧셈과 곱셈이 있는 수 체계) 같은 대수 구조의 이론 자체를 곱이 있는 범주로, 그 구조의 예 하나하나를 곱을 지키는 함자로 보았습니다. 예를 들어 '곱셈'은 두 원소를 받아 하나를 내놓으니 곱 G × G에서 G로 가는 화살표로 적히고, 실제 군 하나는 이 화살표들을 실제 집합과 함수로 번역하는 함자입니다. 1절의 곱이 여기서 이론의 뼈대가 됩니다. 이듬해에는 원소와 '속한다' 대신 함수와 합성만으로 집합론의 공리를 적었습니다. 집합 A의 원소 x는 원소 하나짜리 집합 1에서 A로 가는 화살표 1 → A로 적힙니다. 1의 유일한 원소를 x로 보내는 함수이니, 이런 함수와 A의 원소는 하나씩 대응합니다.

1969년의 두 논문은 논리로 나아갔습니다. 하나는 6절의 ∃와 ∀가 대입의 왼쪽과 오른쪽 수반이라는 관찰입니다. 다른 하나는 칸토어의 대각선 논법⁠(diagonal argument)⁠, 괴델의 불완전성 정리⁠(incompleteness theorem)⁠에 쓰인 대각선 보조정리⁠(diagonal lemma)⁠, 타르스키의 진리 정의 불가능성을 데카르트 닫힌 범주의 고정점⁠(fixed point)⁠ 정리 하나로 묶은 것입니다. 고정점은 함수가 제자리로 보내는 점, 곧 g(p) = p인 p입니다. '아니다'는 참을 거짓으로, 거짓을 참으로 보내니 고정점이 없습니다. 로베어의 정리는 '어떤 집합에서 그 위의 참·거짓 함수 전체로 가는 대응이 모든 함수를 덮는다면, 참·거짓 위의 모든 함수에 고정점이 있다'는 것이고, '아니다'가 그 반례이니 그런 대응은 없습니다. 참·거짓 함수 하나는 '참이 되는 원소들의 부분집합' 하나와 같으니, 이렇게 한 집합에서 그 멱집합(부분집합 전체의 집합)으로 가는 대응은 모든 부분집합을 덮을 수 없다는 칸토어의 정리가 한 줄로 나옵니다. 증명과 그 뒤의 이야기는 「증명은 프로그램이다」 6절에, 대각선 논법 자체는 「무한에도 크기가 있다」와 「기계가 풀 수 없는 문제」에 있습니다.

1970년 로베어는 마일스 티어니와 함께 세운 '기본 토포스'의 이론을 세계 수학자 대회에서 발표했습니다. 그로텐디크가 기하학을 위해 만든 토포스, 곧 국소적인 자료를 이어 붙이는 층들의 세계를, 곱과 지수와 '진릿값⁠(truth value)⁠들의 대상'이 있는 범주라는 몇 개의 공리로 추상한 것입니다. 여기서 지수는 커링에 나온 함수들의 대상 Cᴮ이고, '진릿값들의 대상'은 집합의 세계에서 {참, 거짓}이 하는 일을 맡는 대상입니다. 이런 세계마다 저마다의 논리가 있고, 그 논리는 일반적으로 배중률('p이거나 p가 아니다'가 늘 참이라는 법칙)이 꼭 성립하지는 않는 직관주의 논리⁠(intuitionistic logic)⁠입니다. 1973년에는 거리 공간⁠(metric space)⁠을, 두 점 사이에 화살표 대신 거리를 붙인 범주(풍부화된 범주⁠(enriched category)⁠)로 읽었습니다. 삼각부등식(a에서 c까지의 거리는 a에서 b를 거쳐 c로 가는 거리보다 길지 않다)이 합성의 규칙이 되는데, 이때 쓰는 '더해서 잇고 짧은 것을 고르는' 연산이 「같은 계산, 다른 덧셈」의 (min, +) 반환(덧셈과 곱셈처럼 쓰는 두 연산의 짝, 여기서는 '짧은 것 고르기'와 '더하기')입니다.

로베어의 집합론은 철학의 한 물음에 대한 답으로도 읽힙니다. 1965년 미국의 철학자 폴 베나세라프는 「수가 될 수 없는 것」에서, 자연수⁠(natural number)⁠를 집합으로 정의하는 방법이 여럿이라는 데 주목했습니다. 0을 빈 집합 ∅으로 두고, 체르멜로처럼 n 다음 수를 {n}으로 정할 수도 있고 폰 노이만처럼 n ∪ {n}(n에 n 자신을 원소로 보탠 집합)으로 정할 수도 있습니다. 앞의 방법으로는 2 = {{∅}}이고 뒤의 방법으로는 2 = {∅, {∅}}입니다. 두 방법 모두 산술을 똑같이 잘 해내니, '2는 정말 어느 집합인가'에는 답할 근거가 없습니다. 베나세라프는 수가 낱낱의 대상이라기보다 구조 속의 자리라는 쪽으로 기울었고, 이런 입장을 수학적 구조주의⁠(structuralism)⁠라고 부릅니다. 로베어의 공리에서 원소는 속을 들여다볼 수 없는 화살표 1 → A일 뿐이고 대상은 동형인 것까지만 정해지니, 처음부터 이 물음이 생기지 않습니다. 철학자 콜린 매클라티와 스티브 아우디는 범주론이 구조주의를 적기에 알맞은 언어라고 주장했습니다. 반론도 있습니다. 논리학자 솔로몬 페퍼먼(1977) 등은 범주를 정의하려면 대상과 화살표의 모임이 먼저 있어야 하니, 범주론은 결국 집합 같은 개념을 전제한다고 비판했습니다. 범주론이 수학의 기초가 될 수 있느냐는 지금도 양쪽의 논거가 오가는 물음입니다.

데데킨트의 쌍대군에서 로베어와 티어니의 토포스까지. 사건⁠(event)⁠을 누르면 설명이 나오고, 같은 사건이 다른 글에도 나오면 그 글로 이어집니다.

8 · 1989년 에든버러모나드: 이어 붙일 수 없는 것을 이어 붙이기

이 절의 물음은 이것입니다. 끝과 시작이 맞지 않아 그대로는 이어 붙일 수 없는 함수들을, 어떻게 하면 범주의 화살표처럼 이어 붙일 수 있을까? 프로그래밍에서 날마다 부딪히는 문제입니다.

함수는 이어 붙일 수 있습니다. A → B와 B → C가 있으면 A → C가 됩니다. 그런데 프로그램에는 이어 붙이기가 곤란한 함수가 많습니다. 예를 들어 역수⁠(inverse)⁠ r(x) = 1/x는 x = 0에서 답이 없고, 제곱근 s(y) = √y는 음수에서 답이 없습니다(실수 안에서). 그래서 프로그램에서는 r이 수 대신 '수이거나 실패'를 돌려주게 만듭니다. 이제 r 다음 s를 하려면 규칙이 필요합니다. x = 4이면 r이 0.25를 내놓고 s가 0.5를 내놓습니다. x = −2이면 r은 −0.5를 내놓지만 s에서 실패합니다. x = 0이면 r에서 이미 실패했으니 s는 해 볼 필요도 없이 전체가 실패입니다. 규칙은 '앞에서 실패했으면 실패를 그대로 넘기고, 아니면 안에 든 값에 뒤 함수를 적용한다'입니다.

답이 여럿인 함수도 있습니다. 수 n을 받아 n의 약수의 목록을 돌려주는 함수 d를 생각합시다. d(6) = [1, 2, 3, 6]입니다. d 다음 d를 하려면, 목록 안의 수마다 d를 적용해 목록의 목록 [[1], [1, 2], [1, 3], [1, 2, 3, 6]]을 얻은 뒤, 괄호를 한 겹 벗겨 [1, 1, 2, 1, 3, 1, 2, 3, 6]으로 폅니다. '6의 약수의 약수'를 모두 늘어놓은 목록입니다.

두 예를 한 말로 적어 봅시다. 실패할 수 있는 함수는 B 대신 'B이거나 실패'를, 답이 여럿인 함수는 'B의 목록'을 돌려줍니다. 이렇게 값을 감싸는 상자를 T라 하면, 이런 함수는 A → T B 꼴입니다. 이런 함수 A → T B와 B → T C는 끝과 시작이 맞지 않아 그대로는 이어지지 않습니다. 앞 함수가 내놓은 T B의 '안에 든 B'마다 뒤 함수를 적용하고, 그 결과 생긴 T(T C)(상자 안의 상자, 목록의 목록)를 한 겹으로 펴 T C를 만드는 규칙이 있으면 이어 붙일 수 있습니다. 이 규칙과 '아무 일도 하지 않고 값을 T로 감싸기'(5를 [5]로, 또는 '실패 아님, 5'로)의 짝이 모나드입니다.

모나드의 법칙은, 이렇게 이어 붙이기가 결합법칙을 지키고 감싸기가 항등 화살표 구실을 해야 한다는 요구입니다. 함수 셋을 이을 때 앞의 둘을 먼저 잇든 뒤의 둘을 먼저 잇든 같아야 하고, 감싸기를 앞이나 뒤에 이어도 함수가 바뀌지 않아야 합니다. 정확히 1절에서 본 범주의 두 법칙입니다. 모나드란 '효과가 있는 함수들'(실패하거나 답이 여럿인 함수처럼, 값을 내놓는 것 말고 다른 일도 하는 함수들)을 다시 하나의 범주로 만들어 주는 장치인 셈입니다. 목록으로 하는 한 걸음씩의 그림은 모나드 페이지에 있습니다.

모나드는 수반에서 저절로 나옵니다. 수반 L ⊣ R이 있으면 R ∘ L('L 다음 R')이 늘 모나드입니다. 자유 모노이드 ⊣ 잊는 함자에서는 집합을 '그 원소들의 목록'으로 보내는 목록 모나드가 나옵니다. 집합을 자유 모노이드(문자열들)로 보낸 뒤 곱셈을 잊으면 원소들의 목록만 남기 때문입니다. 올림 ⊣ 포함에서는 실수 x를 ⌈x⌉로 보내는 대응이 나옵니다. 실수를 올림으로 정수로 보낸 뒤 다시 실수로 보는 것입니다.

순서에서 모나드는 x ≤ c(x), c(c(x)) = c(x)를 만족하는 단조 함수, 곧 닫힘 연산입니다. 올림으로 확인하면 2.3 ≤ ⌈2.3⌉ = 3이고, ⌈⌈2.3⌉⌉ = ⌈3⌉ = 3입니다. 이 한 가지 모양이 분야마다 이름을 바꿔 나옵니다. 점들의 볼록 껍질(점들을 고무줄로 둘러쌌을 때 안쪽 전체), 벡터들이 펼치는 공간(더하고 수배 해서 닿는 벡터 전체), 위상수학의 닫힘(도형에 그 경계를 보태는 것), 공리에서 따라 나오는 정리 전체, 문자열 집합의 정규 표현식⁠(regular expression)⁠ 별표(문자열들을 0번 이상 이어 붙여 만든 것 전체)가 모두 닫힘 연산입니다. 두 번 해도 한 번 한 것과 같고, 늘 원래보다 크거나 같습니다.

정리하면, 모나드는 '값을 상자에 감싸기'와 '상자 안의 상자를 한 겹으로 펴기'로 효과가 있는 함수들을 이어 붙이게 해 주는 구조이고, 수반이 있으면 늘 하나 생깁니다.

이 구조는 1950년대 말 로제 고드망이 층의 코호몰로지(층에서 조각들을 맞춰 이어 붙이기가 어디서 막히는지를 재는 값)를 계산하며 '표준 구성'이라는 이름으로 처음 썼고, 오랫동안 순수수학의 도구였습니다. 거꾸로 모든 모나드가 어떤 수반에서 나온다는 것은 1965년 두 곳에서 따로, 서로 다른 방법으로 증명되었습니다. 스위스의 하인리히 클라이슬리가 한 가지 방법을, 에일렌베르크와 존 무어가 다른 방법을 내놓았습니다. 그때까지 이 구조는 '표준 구성', '트리플' 같은 이름으로 불렸고, '모나드'라는 이름은 1960년대 후반 프랑스의 장 베나부가 제안해 매클레인의 1971년 교과서와 함께 자리 잡았습니다.

1989년 에든버러의 에우제니오 모지가 이것으로 실패, 상태, 입출력 같은 계산의 효과를 한 가지 틀로 다룰 수 있음을 보였고, 글래스고의 필립 와들러가 그것을 프로그램 짜는 방법으로 퍼뜨렸습니다. 순수 함수형 언어⁠(functional programming language)⁠ 하스켈은 1990년대 중반부터 입출력을 모나드로 다룹니다. 역사는 「증명은 프로그램이다」 8절에 있습니다.

9 · 언어인가, 이론인가범주론이 해 주는 것과 해 주지 않는 것

여기까지 오면 물음이 생깁니다. 범주론은 새로운 사실을 알려 주는 이론일까, 이미 아는 것을 다시 적는 언어일까? 이 절은 둘 다 조금씩이라고 답하고, 어디까지인지 적어 둡니다.

범주론에는 '일반적 추상적 넌센스'(general abstract nonsense)라는 오래된 별명이 있습니다. 위상수학자 노먼 스틴로드가 지었다고 여겨지는 말로, 매클레인은 에일렌베르크와의 첫 논문이 소개한 범주라는 생각을 당시 사람들이 그렇게 불렀다고 회고했습니다. 반은 농담이고 반은 진담입니다. 이 글에서 본 증명들은 대부분 몇 줄이었습니다. 요네다 보조정리의 증명은 항등 화살표를 넣어 보는 한 수이고, 쌍대성 원리의 증명은 화살표를 뒤집는 것뿐입니다. 일은 정의가 하고, 정리는 정의를 풀어 쓴 것에 가깝습니다. 그래서 범주론이 가장 먼저 주는 것은 새 정리가 아니라 같은 것을 같다고 알아보는 눈입니다.

그 눈이 결정적이었던 곳도 분명히 있습니다. 1949년 앙드레 베유는, 방정식을 소수로 나눈 나머지에서 풀 때 해의 개수가 따르는 법칙에 관한 추측들을 내놓았습니다. 이 추측들은 그로텐디크 학파가 범주의 언어로 지은 에탈 코호몰로지(위상수학에서 구멍을 세는 방법을 나머지 계산의 세계로 옮겨 온 도구) 위에서 풀렸고, 가장 어려운 부분은 1974년 피에르 들리뉴가 증명했습니다. 이 증명은 그 틀에 깊이 기대고 있습니다. 프로그래밍 언어에서는 모나드가 부작용을 다루는 방법을 실제로 바꾸었고, 타입 이론⁠(type theory)⁠의 의미론은 상당 부분 데카르트 닫힌 범주와 토포스의 말로 적힙니다. 로베어의 고정점 정리처럼, 따로 알려져 있던 여러 결과가 사실 한 가지라는 것을 보여 주는 일도 범주론이 잘하는 일입니다.

해 주지 않는 것도 있습니다. 범주론은 최대공약수를 더 빨리 계산해 주지 않고, 어떤 수가 소수인지 알려 주지 않으며, 부등식을 하나하나 추정해야 하는 해석학⁠(mathematical analysis)⁠의 어려운 부분에서는 거의 말이 없습니다. 무엇이 같은 모양인지는 알려 주지만, 그 모양 안에서 구체적으로 무슨 일이 일어나는지는 각 분야의 방법으로 따져야 합니다. 비유도 조심해야 합니다. '낱말의 뜻은 함께 쓰이는 낱말들로 안다'는 언어학의 분포 가설⁠(distributional hypothesis)⁠이나, 단어를 주변 단어들로 학습하는 낱말 벡터를 요네다 보조정리에 빗대는 글이 많습니다. 그러나 이것은 닮은 생각일 뿐 정리의 적용이 아닙니다. 요네다가 보장하는 것은 모든 대상과의 관계와 그 관계들의 자연스러운 맞물림을 알 때의 이야기이고, 유한한 말뭉치⁠(corpus)⁠의 통계⁠(statistics)⁠와는 거리가 멉니다.

2018년 무렵부터는 '응용 범주론'이라는 이름으로 회로, 데이터베이스, 화학 반응망, 확률⁠(probability)⁠ 모형, 기계 학습⁠(machine learning)⁠을 범주의 말로 옮기는 연구가 모임과 학술지를 갖추었습니다. 브렌던 퐁과 데이비드 스피박의 입문서 『응용 범주론 초대』(2019)가 그 흐름을 소개합니다. 두 사람이 레미 튀예라와 함께 쓴 「함자로서의 역전파」는 경사 하강법(오차가 줄어드는 쪽으로 매개변수를 조금씩 고치는 방법)으로 매개변수를 고치는 규칙이 합성을 지키는 대응(함자)이라는 것을 보였습니다. 이런 연구가 복잡한 체계를 부품의 합성으로 나누어 설계하고 검증하는 데 실제로 얼마나 도움이 되는지는 아직 시험되는 중입니다. 지금까지 가장 분명한 성과는 서로 다른 분야의 구조를 같은 말로 적게 해 준 것이고, 다른 방법으로는 얻을 수 없던 공학적 결과를 내놓았다고 말하기는 이릅니다. 흔히 범주론을 '모든 것을 설명하는 이론'으로 소개하지만, 더 정확한 말은 '서로 다른 것들이 언제 같은지를 정확히 말하는 언어'입니다.

범주론이 수학 바깥으로 나간 길. 매클레인의 교과서, 람베크의 대응, 들리뉴의 증명, 모지의 모나드, 그리고 응용 범주론.

10 · 이어지는 길화살표가 닿는 곳

이 글에서 범주론은 한 분야가 아니라 여러 분야를 비추는 조명이었습니다. 따로 배운 것들이 한 모양으로 겹쳐 보인 곳들을 다시 모읍니다.

요약. 범주는 대상과 화살표, 그리고 결합법칙과 항등을 지키는 합성입니다. 대상을 속이 아니라 다른 대상과의 화살표로 정하면(보편 성질), 최대공약수·교집합·'그리고'·순서쌍의 집합이 모두 곱이 되고, 화살표를 뒤집으면 최소공배수·합집합·'또는'·서로소 합집합이 모두 쌍대곱이 됩니다. 곱의 정의를 기호로 적으면 아래와 같습니다(∀는 '모든', ∃!는 '정확히 하나 있다'로 읽습니다).

∀ f:X→A, g:X→B∃! u:X→A×B:π1∘u=f,  π2∘u=g\forall\, f: X \to A,\ g: X \to B \quad \exists!\, u: X \to A \times B: \quad \pi_1 \circ u = f,\ \ \pi_2 \circ u = g

'자연스럽다'는 모든 화살표와 맞물린다는 뜻이고, 어떤 화살표들에 대해서인지가 중요합니다(내적의 짝짓기는 회전에만 맞물리고, V → V**는 모든 선형 사상과 맞물립니다). 대상은 그리로 들어오는 화살표 전체로 정해지고, 그 정보는 항등 화살표 하나에 담겨 있습니다(요네다). 구조를 지키는 번역이 함자이고, 연쇄법칙은 미분이 함자라는 말입니다. Hom(LX, Y) ≅ Hom(X, RY)인 짝이 수반이며, 내림과 올림, 자유와 잊기, 커링, ∃와 ∀가 모두 그 예입니다. 범주론은 계산을 대신해 주지 않지만, 서로 다른 것들이 언제 같은지를 정확히 말해 줍니다.