본문으로 건너뛰기

다치 논리: 참과 거짓을 넘어

📍 현재 위치: 1부 · 퍼지·다치 논리 — 1장. 3권은 정직한 평결로 마무리되었습니다: 임베딩은 순위를 매기고 검색하지만, 연역하지는 않습니다. 4권은 경사가 도달할 수 있도록 논리 자체를 다시 짓는 것으로 문을 열며, 그 재건은 가장 밑바닥, 진리값에서부터 시작됩니다.

이 시리즈가 지금까지 사용한 모든 논리, 즉 1권의 혼 규칙, 2권의 EL++ 추론기, 3권의 함의 골드 스탠다드는 정확히 두 개의 진리값 위에서 돌아갔습니다. 어떤 사실은 성립하거나 성립하지 않았습니다. 어떤 포섭 관계는 함의되거나 함의되지 않았습니다. 이 권의 과제는 논리를 미분 가능하게 만드는 것이며, 두 점으로 이루어진 집합 위의 함수에는 쓸모 있는 도함수가 없습니다. 움직일 곳이 어디에도 없기 때문입니다. 그래서 첫 번째의, 피할 수 없는 단계는 진리값의 집합을 넓히는 것이며, 이 장은 정직하게 가능한 가장 작은 걸음을 내딛습니다. 값을 하나 더하고, 즉 ½로 쓰이는 중간값을 더하고, 결합자를 정의한 다음, 무엇이 깨지는지 아주 주의 깊게 지켜봅니다. 답은 이렇습니다: 여러분이 짐작하는 것보다 훨씬 더 많이 깨지며, 그 깨짐은 진리표의 단 한 칸으로 결정되고, 이 장의 모든 것은 단언되는 것이 아니라 계산됩니다. 동반 모듈 examples/integration/many_valued.py는 두 고전적인 3치 논리 모두를 그 정의로부터 지어 올리고, 계산된 표를 독립적으로 하드코딩된 교과서 표와 항목 하나하나 대조해 검사하며, 모든 항진명제 주장을 전수 열거로 판정하고, 단위 구간으로의 마지막 다리를 오차 허용치가 아니라 등식 단언으로 정확하게 검증합니다.

쉽게 말하면

법정이 유죄와 무죄, 딱 두 가지 평결만 허용한다고 상상해 봅시다. 어떤 사건은 진정으로 둘 중 어느 쪽에도 들어맞지 않습니다. 증거가 빈약하고, 증인이 나타나지 않았으며, 진실이 어느 쪽으로도 확정되지 않은 경우입니다. 스코틀랜드 법원은 역사적으로 바로 이런 상황을 위한 세 번째 평결, "증명되지 않음(not proven)"을 유지해 왔습니다. 이제 법정이 평결을 조합해야 하는 상황도 상상해 봅시다. 만약 혐의 A가 증명되고 혐의 B가 증명되지 않았다면, "A 그리고 B"에 대한 평결은 무엇일까요? 두 개가 아니라 세 개의 평결을 조합하는 규칙이 필요하며, 알고 보면 합리적인 규칙집이 하나만 있는 것이 아닙니다. 이 장에 나오는 두 규칙집은 "그리고", "또는", "아니다"에 대해서는 의견이 일치하고, "만약... 이라면..." 규칙의 정확히 한 줄에서 의견이 갈립니다. 바로 그 한 줄이 법정에 법이라는 것이 조금이라도 있는지, 즉 증거가 무엇이든 반드시 받아들여야 하는 진술이 있는지를 결정합니다. 그리고 일단 평결이 숫자가 될 수 있다는 것, 즉 "70퍼센트 확정됨"을 허용하는 순간, 규칙집은 공식이 되고, 공식은 미분될 수 있습니다. 그것이 바로 이 권 전체가 통과하는 문입니다.

이 장이 다루는 내용

  • 범람: 왜 두 개의 진리값이 이미 두 번이나 우리를 실패시켰는지, 즉 2권의 열린 세계(모른다는 거짓이 아닙니다)와 2권의 주석 달린 사실(신뢰도 0.5를 지닌 인용 엣지는 참도 거짓도 아닙니다)에서 각각 어떻게 실패했는지, 그리고 정직한 해법이 왜 중간값을 반올림해 없애는 것이 아니라 진리 집합을 넓히는 것인지를 다룹니다.
  • 세 개의 값, 하나의 설계 결정: 부정을 1x1-x로, 논리곱을 최솟값으로, 논리합을 최댓값으로 두는 것을, 진리 순서 위의 만남(meet)과 이음(join)으로 질서론적으로 읽습니다. 전체 3×3 표는 동반 코드가 계산하며 하드코딩된 교과서 표와 대조해 검사됩니다.
  • 함의의 갈림길: 클레이니의 실질 함의 독법 max(1x,y)\max(1-x,\,y) 대 우카시에비치의 잉여 독법 min(1,1x+y)\min(1,\,1-x+y)을 다룹니다. 두 표는 정확히 한 칸에서만 다르며, 그 한 칸이 그 논리에 항진명제가 있는지를 결정합니다.
  • 지정값, 풀어보기: 값이 세 개가 된 뒤 "항진명제"가 대체 무엇을 뜻하는지, 어떤 값들이 단언된 것으로 세느냐 하는 선택이 왜 표와는 별개의 다이얼인지, 그리고 각 판정을 결정하는 전수 열거 기계 장치를 다룹니다.
  • 표류표, 서술이 아니라 실행: 고전 논리, K3(클레이니의 강한 3치 논리), Ł3(우카시에비치의 3치 논리)에 걸쳐 채점되는 일곱 개의 고전적 법칙을 다룹니다. K3는 하나도 지키지 못하고 Ł3는 네 개를 지키며, 각 실패에는 그것을 가라앉히는 정확한 값매김이 딸려 옵니다.
  • 구간으로의 다리: 동일한 세 정의를 [0,1][0,1] 전체 위에서 읽는 것, Ł3의 화살표가 세 점에서 제한된 우카시에비치 잉여임을 보여 주는 계산된 증명, 그리고 진리의 정도를 확률과 구분 짓는 진리함수성의 경고를 다룹니다.
  • 이것이 설정하는 의제: 진리값이 [0,1][0,1] 안에 살게 되는 순간, 모든 결합자는 단위 정사각형 위의 실숫값 함수가 되고, "이 논리에 쓸모 있는 경사가 있는가"가 잘 정의된 수학적 질문이 됩니다. 이것이 바로 다음 두 장의 본업입니다.

두 개의 진리값이 바닥나는 이유

2권은 열린 세계의 교훈을 어렵게 가르쳤습니다: 열린 세계 가정(open-world assumption) 아래에서는, 지식 베이스에 없는 사실은 거짓이 아니라 그저 진술되지 않은 것일 뿐입니다. 학계 세계의 지식 베이스가 Dave가 누군가를 지도하는지를 기록하지 않았을 때, "Dave는 누군가를 지도하는가?"에 대한 정직한 답은 "아니오"가 아니라 "모른다"였습니다. 고전적인 이치 논리에는 그 답을 담을 방법이 없습니다. 모든 명제는 0이거나 1이어야 하므로, "모른다"는 조용히 둘 중 하나로 반올림되고, 그 반올림은 어느 한쪽으로의 거짓말이 됩니다.

두 번째 범람은 2권의 주석 달린 추론기에서 왔으며, 이번에는 인식론적이라기보다 양적입니다. 주석 달린 지식 베이스는 모든 사실에 신뢰도(confidence), 즉 단위 구간 [0,1][0,1](0부터 1까지, 양 끝을 모두 포함하는 모든 실수) 안의 숫자를 붙입니다: 인용 엣지 cites(p3, p2)는 0.9를, cites(p2, p1)은 0.8을 지니며, 직접 엣지 cites(p3, p1)은 정확히 0.5를 지닙니다. 이 마지막 값이 완벽한 도발입니다: 그 자신의 지식 베이스로부터 거짓보다 더 참하지도 않다고 평가받는 사실인 것입니다. 동반 모듈은 이 예시를 다시 타이핑하기를 거부합니다. 2권의 코드로부터 엣지 목록을 그대로 임포트하고(many_valued.py 51번째 줄) 0.5를 다시 읽어 냅니다(many_valued.py 258–264번째 줄). 커밋된 실행은 이렇게 문을 엽니다:

[1] the third truth value is already in the running example
Volume 2's CONFIDENCE semiring ([0,1], max, min) labels the
direct edge cites(p3, p1) with 0.5 — neither true nor false.
excluded middle on it: max(0.5, 1-0.5) = 0.5 (a classical LAW, now half-true)

두 범람은 같은 방향을 가리킵니다: 진리 집합이 너무 작다는 것입니다. 가능한 가장 작은 확장은 둘 사이의 정중앙에 값을 하나 더하여 세 원소짜리 진리 집합 V3={0,12,1}V_3 = \lbrace 0, \tfrac{1}{2}, 1 \rbrace을 만듭니다(many_valued.py 57번째 줄). ½은 무엇을 뜻해야 할까요? 역사는 두 개의 답을 내놓으며, 그 둘의 차이가 이 장 전체의 줄거리가 됩니다. 1920년, 우연적인 미래에 대한 진술("내일 해전이 벌어질 것이다")을 위해 제안된 더 오래된 독법은 ½을 가능하다로 받아들입니다: 아직 어느 쪽으로도 확정되지 않았지만, 명제가 차지할 수 있는 진정한 세 번째 상태라는 것입니다. 이 독법 위에 지어진 체계는 오늘날 Ł3, 즉 우카시에비치의 3치 논리라 불립니다 [1]. 그로부터 20년 뒤, 부분 계산 가능 함수 이론을 위해 지어지고 1952년에 교과서적 형태를 갖춘 두 번째 독법은 ½을 정의되지 않음 또는 모름으로 받아들입니다: 그 명제는 실제로 참이거나 실제로 거짓이지만, 다만 우리가 알 수 없을 뿐이며, 어쩌면 그것을 결정할 계산이 결코 멈추지 않기 때문일 수도 있습니다. 이 독법의 체계가 바로 K3, 클레이니의 강한 3치 논리입니다 [2]. 그리고 2권의 신뢰도는 어느 체계도 의도하지 않은 세 번째 독법을 암시합니다: ½을 정도(degree)로, 즉 등급이 매겨진 참의 양으로 보는 것이며, 이는 퍼지 집합론이 훗날 구간 전체로 확장하게 될 독법입니다 [3]. 이 세 가지 독법을 마음속에서 서로 떼어 놓으십시오. 이들은 산술을 공유하지만 철학은 공유하지 않으며, 이 장을 마무리하는 경고는 바로 그 구분에 달려 있습니다.

세 개의 값, 하나의 설계 결정

이제 결합자 차례입니다. 세 개의 새로운 진리표를 일일이 입법하는 대신, 두 역사적 체계 모두 단 하나의 설계 결정으로부터 모든 것을 유도합니다: 순서를 존중하라는 것입니다. 0<12<10 \lt \tfrac{1}{2} \lt 1을 진리의 순서, 즉 "거짓은 미정 아래, 미정은 참 아래"로 읽으십시오. 순서 집합 위에서는, 존재하기만 한다면 두 개의 정준 연산이 정의됩니다: 두 원소의 만남(meet), 즉 그 최대하계와, 이음(join), 즉 그 최소상계입니다(일반적인 부분 순서(partial order), 즉 일부 쌍을 비교하지 않은 채 남겨 둘 수 있는 순서에서는 두 원소에 이 둘이 모두 없을 수도 있습니다. 모든 쌍이 둘 다 가지는 순서는 격자(lattice)라 부릅니다). V3V_3처럼 임의의 두 원소가 서로 비교 가능한 전순서(totally ordered) 집합 위에서는 이들이 언제나 존재하며 그저 최솟값과 최댓값일 뿐입니다. 논리곱을 만남으로, 논리합을 이음으로 정의하십시오: 논리곱은 그것을 이루는 더 약한 논리곱 항만큼만 참이고, 논리합은 그것을 이루는 더 강한 논리합 항만큼 참입니다. 부정에 대해서는, 중점을 고정한 채 순서를 끝에서 끝으로 뒤집는 사상을 취하십시오. 이는 숫자 위에서 x1xx \mapsto 1-x입니다(기호 \mapsto는 "~로 사상된다"라고 읽습니다). 두 체계 모두 세 정의를 변경 없이 그대로 채택합니다. 동반 코드는 이를 한 줄짜리 함수 세 개로 구현한 다음, 그 옆에 서로 경쟁하는 두 함의를 정의합니다(many_valued.py 60–82행):

def neg(x: float) -> float:
# ¬x = 1 - x (strong negation; shared by K3 and Ł3)
return 1.0 - x


def conj(x: float, y: float) -> float:
# x ∧ y = min(x, y) (shared by K3 and Ł3)
return min(x, y)


def disj(x: float, y: float) -> float:
# x ∨ y = max(x, y) (shared by K3 and Ł3)
return max(x, y)


def imp_k3(x: float, y: float) -> float:
# K3 implication: x → y = ¬x ∨ y = max(1 - x, y) (material implication)
return max(1.0 - x, y)


def imp_l3(x: float, y: float) -> float:
# Ł3 implication: x → y = min(1, 1 - x + y) (Łukasiewicz residuum)
return min(1.0, 1.0 - x + y)

그러면 전체 진리표는 암기해야 할 공리가 아니라 실행해야 할 산술이 됩니다. 함수 truth_table(many_valued.py 98–100번째 줄)은 아홉 개의 입력 쌍 전부에서 각 결합자를 평가하고, run()은 계산된 모든 항목을 교과서 표를 하드코딩으로 옮겨 적은 것과 대조해 단언합니다(many_valued.py 90–95번째 줄과 194–198번째 줄). 이는 진짜 두 출처 간 비교입니다: 만약 한 줄짜리 정의와 출판된 표가 어디선가 어긋난다면, 이 모듈은 실행을 거부할 것입니다. 다음은 커밋된 실행이 출력하는 두 공유 표이며, 행은 xx로, 열은 yy로 색인됩니다:

x ∧ y = min(x, y) (both logics)
x\y | 0 ½ 1
----+------------
0 | 0 0 0
½ | 0 ½ ½
1 | 0 ½ 1
x ∨ y = max(x, y) (both logics)
x\y | 0 ½ 1
----+------------
0 | 0 ½ 1
½ | ½ ½ 1
1 | 1 1 1

모든 항목은 최솟값/최댓값 산술의 한 사례입니다. 논리곱 표의 가운데 칸은 1212=min(12,12)=12\tfrac{1}{2} \wedge \tfrac{1}{2} = \min(\tfrac{1}{2}, \tfrac{1}{2}) = \tfrac{1}{2}입니다: 절반쯤 확립된 두 주장이 결합하여 절반쯤 확립된 주장이 됩니다. 모서리 칸들은 고전 논리를 정확히 재현하는데, 부분집합 {0,1}\lbrace 0, 1 \rbrace 위에서는 최솟값이 불(Boolean) AND이고 최댓값이 불 OR이기 때문입니다. 이 포함 관계는 잠시 멈추어 생각할 가치가 있습니다: 두 3치 체계 모두 결합자 수준에서 고전 표를 보수적으로 확장합니다. 즉 어떤 결합자든 고전적 입력으로 제한하면 고전적 출력을 돌려준다는 뜻입니다. (이는 표의 성질이지 이론으로서의 논리의 성질은 아닙니다. 어떤 법칙이 살아남는지는 아래 표류표가 보여 주듯 전혀 다른 문제입니다.) 3치 논리에서 무언가가 깨진다면, 그것은 옛 경우들이 바뀌어서가 아니라, 새로운 값 ½이 이치 추론이 결코 견뎌 낼 필요가 없었던 방식으로 옛 법칙들을 관통해 흐르기 때문에 깨질 것입니다.

부정이 중간값에 무엇을 하는지도 눈여겨보십시오: ¬12=112=12\neg \tfrac{1}{2} = 1 - \tfrac{1}{2} = \tfrac{1}{2}입니다. 중점은 부정의 고정점(fixed point), 즉 자기 자신의 반대이기도 한 유일한 진리값입니다. 바로 이 하나의 항등식이 실행의 첫 줄에 나온 그 유명한 실패 뒤에 있는 엔진입니다: 고전적으로 항진명제인 배중률(law of the excluded middle) p¬pp \vee \neg p(문자 pp명제 변수(propositional variable), 즉 진리값을 자유롭게 정할 수 있는 아무 명제에나 붙이는 이름입니다)는 p=12p = \tfrac{1}{2}에서 다음과 같이 평가됩니다.

12¬12  =  max ⁣(12,  112)  =  max ⁣(12,12)  =  12,\tfrac{1}{2} \vee \neg\tfrac{1}{2} \;=\; \max\!\big(\tfrac{1}{2},\; 1 - \tfrac{1}{2}\big) \;=\; \max\!\big(\tfrac{1}{2}, \tfrac{1}{2}\big) \;=\; \tfrac{1}{2},

이는 정확히 예시의 절반-신뢰도 인용 엣지에 대해 출력되는 "excluded middle on it: 0.5" 줄입니다. 고전적 법칙이 이제 절반만 참이 된 것입니다. 이 결과가 스캔들인지 아니면 그저 정직한 회계인지는 ½이 무엇을 뜻하는지에, 그리고 우리가 아직 내리지 않은 정의 하나, 즉 어떤 진리값이 단언된 것으로 세이는지에 달려 있습니다. 두 물음 모두 함의에서 정점에 이릅니다.

함의에서 두 체계가 갈라선다

고전적으로 pqp \rightarrow q(qq는 두 번째 명제 변수입니다)는 ¬pq\neg p \vee q로 정의해 없앨 수 있습니다: 함의는 전건이 참이고 후건이 거짓인 경우를 제외하면 참입니다. K3는 그 실질적 독법(material reading)을 그대로 유지하되 3치 결합자로 치환합니다(아래 식에서 기호 :=:=는 "~로 정의된다"라고 읽습니다) [2]:

xK3y  :=  ¬xy  =  max(1x,  y).x \rightarrow_{K3} y \;:=\; \neg x \vee y \;=\; \max(1 - x,\; y).

Ł3는 대신 화살표를 직접 정의합니다. 그 더 깊은 정당화(그것이 잉여(residuum), 즉 이 장의 끝에서 우리가 계산할 정밀한 의미에서 논리곱의 "역"이라는 것)는 그것을 이름 붙일 대수적 기계 장치가 나오기까지 수십 년을 기다려야 했습니다 [1]:

xŁ3y  :=  min(1,  1x+y).x \rightarrow_{Ł3} y \;:=\; \min(1,\; 1 - x + y).

둘은 얼마나 다를까요? 동반 코드는 두 3×3 표를 모두 계산한 다음 아홉 개 입력 쌍 전부에서 불일치를 찾습니다. 단언은 서로 다른 항목의 목록이 정확히 한 쌍 길이여야 한다고 요구합니다(many_valued.py 199–202번째 줄). 커밋된 실행은 두 표를 모두 출력하며 불일치 항목에 별표를 붙입니다:

x → y = max(1-x, y) (K3)
x\y | 0 ½ 1
----+------------
0 | 1 1 1
½ | ½ ½* 1
1 | 0 ½ 1
x → y = min(1, 1-x+y) (Ł3)
x\y | 0 ½ 1
----+------------
0 | 1 1 1
½ | ½ 1* 1
1 | 0 ½ 1
disagreement entries: (½, ½) → K3 gives ½, Ł3 gives 1

아홉 항목 중 여덟은 일치합니다. 유일한 발산은 (x,y)=(12,12)(x, y) = (\tfrac{1}{2}, \tfrac{1}{2})에 있으며, 이를 양쪽 모두 손으로 계산해 볼 가치가 있습니다. 이후에 이어지는 항진명제 이야기 전체가 바로 이 한 칸에 달려 있기 때문입니다. K3 아래에서는:

12K312  =  max ⁣(112,  12)  =  max ⁣(12,  12)  =  12.\tfrac{1}{2} \rightarrow_{K3} \tfrac{1}{2} \;=\; \max\!\big(1 - \tfrac{1}{2},\; \tfrac{1}{2}\big) \;=\; \max\!\big(\tfrac{1}{2},\; \tfrac{1}{2}\big) \;=\; \tfrac{1}{2}.

Ł3 아래에서는:

12Ł312  =  min ⁣(1,  112+12)  =  min(1,  1)  =  1.\tfrac{1}{2} \rightarrow_{Ł3} \tfrac{1}{2} \;=\; \min\!\big(1,\; 1 - \tfrac{1}{2} + \tfrac{1}{2}\big) \;=\; \min(1,\; 1) \;=\; 1.

두 판정을 각자 의도된 독법을 통해 읽으면 둘 다 말이 됩니다. K3의 ½은 "모른다"를 뜻하며, 그 판정의 정직한 옹호는 인식론적이라기보다 기계적입니다. K3는 진리함수적(truth-functional)입니다: 구성상, 복합식이 받는 값은 반드시 그 부분들이 받는 값의 함수여야 하므로, 일단 두 부분이 모두 ½에 놓이면 화살표는 논리식의 모양이 무엇이든 그 표가 (½, ½)에서 담고 있는 값만을 돌려줄 수 있습니다. 그것이 표현할 수 없는 것은 "모름의 모든 완성에서 참"이라는 것인데, 여기서는 그 더 강한 주장이 실제로 가능한데도 그렇습니다: 만약 pp가 실제로 0이거나 실제로 1이라면, "pppp를 함의한다"는 어느 쪽이든 참으로 나오며, 모든 완성에 걸쳐 정량화하는 추론기(초평가주의(supervaluationist) 독법)라면 이를 인증할 것입니다. 다만 그 대가로 더 이상 복합식을 그 부분들로부터 계산하지 못하게 됩니다. 무지에 대한 진리함수적 회계는 국소적이고 값싸며, 그 대가는 "pppp를 함의한다"조차 점수를 얻지 못한다는 것입니다. Ł3의 ½은 "가능하다"를 뜻하며, 그 화살표는 전혀 다른 무언가를 측정합니다: 바로 후건이 전건에 얼마나 못 미치는가입니다. 공식 min(1,1x+y)\min(1, 1 - x + y)에서, 양 xyx - y는 부족분(shortfall), 즉 화살표를 건너면서 잃는 참의 양입니다. 함의는 yxy \ge x인 한 완전히 참이고, 그렇지 않을 때는 정확히 그 부족분만큼 깎입니다. y<xy \lt x일 때 값이 1(xy)1 - (x - y)이기 때문입니다. 어떤 주장에서 자기 자신으로 가는 함의는 부족분이 0이므로, 그 주장의 상태가 무엇이든 완벽하게 참입니다. 한쪽 독법은 무지를 보존하고, 다른 쪽 독법은 저하를 측정합니다. 둘 다 정합적입니다. 다만 둘 다 여러분의 논리일 수는 없습니다.

고전적 입력에서는 그 갈림길이 사라집니다: x,y{0,1}x, y \in \lbrace 0, 1 \rbrace에 대해 두 공식은 모든 곳에서 일치하며, 모듈도 이를 단언합니다(many_valued.py 205–207번째 줄). 기호 \in은 "~의 원소이다"라고 읽습니다. 그러므로 이 불일치는 어떤 이치 검사로도 보이지 않으며, ½이 실제로 화살표를 관통해 흐를 때에만 표면으로 드러납니다. 그것이 무엇을 결정하는지 보려면, 이 장의 핵심 정의가 필요합니다.

이 장의 논증을 보여 주는 세 패널짜리 다이어그램입니다. 범람이라는 이름표가 붙은 왼쪽 패널은 학계 세계의 인용 엣지 p3에서 p2로 0.9, p2에서 p1로 0.8, 그리고 직접 엣지 p3에서 p1로 0.5를 보여 주며, 0.5 엣지는 강조되어 참도 거짓도 아니라고 주석이 달려 있고, 그 위에는 0, 이분의 1, 1을 보여 주는 세 점짜리 진리 눈금이 있는데 부정이 눈금을 자기 자신 위로 접어 겹치며 중점이 고정되어 있습니다. 한 칸이 모든 것을 결정한다는 이름표가 붙은 가운데 패널은 K3와 Ł3의 3행 3열 함의 표 두 개를 나란히 보여 주며, 여덟 개의 일치하는 칸은 중립적인 색조이고 이분의 1 행, 이분의 1 열에 있는 단 하나의 발산 칸은 별표가 붙어 강조되어 있습니다: K3는 이분의 1을, Ł3는 1을 줍니다. 항진명제 표류라는 이름표가 붙은 오른쪽 패널은 고전, K3, Ł3라는 세 열에 대한 일곱 개 고전적 법칙의 간결한 격자를 보여 주며, 고전 열은 모두 체크 표시이고, K3 열은 모두 십자 표시이며 모든 논리식을 가라앉히는 전부-이분의 1 값매김이 주석으로 달려 있고, Ł3 열은 동일성, 이중 부정, 약화, 대우에 대한 네 개의 체크 표시와 배중률, 무모순율, 퍼스의 법칙에 대한 세 개의 십자 표시를 보여줍니다. 패널들 아래의 화살표는 세 점짜리 눈금에서 연속적인 단위 구간으로 향하며, 3치 논리는 세 점에서 표본화된 퍼지 논리라는 캡션이 달려 있습니다. 진리표의 항목 하나, 즉 (½, ½)에서의 함의가 항진명제가 하나도 없는 논리와 고전적인 일곱 개 중 네 개를 지닌 논리를 갈라놓습니다. 동일한 세 정의를 구간 전체 위에서 읽으면, 그것이 바로 다음 장의 퍼지 결합자입니다. 저자가 AI의 도움을 받아 직접 제작한 원본 도해.

지정값: 무엇이 단언으로 세는가

진리값이 두 개일 때, 항진명제(tautology)는 모든 할당 아래에서 참인 논리식입니다. 진리값이 세 개가 되면, "참"이라는 말 자체가 풀어헤쳐져야 하며, 그 풀어헤침은 다이얼이 달린 정의입니다. 값매김(valuation)은 각 명제 변수에 V3V_3 안의 값 하나를 배정하는 함수 vv입니다. 결합자 표는 그런 다음 vv를 모든 논리식으로 확장합니다. 이와는 별도로, 논리는 지정값(designated values)의 집합 DV3D \subseteq V_3을 선언합니다(기호 \subseteq는 "~의 부분집합이다"라고 읽습니다). 이는 단언된 것, 즉 그 뒤에 설 만큼 충분히 좋다고 세는 값들입니다. 논리식 φ\varphi가 그 논리의 항진명제인 것은, 모든 값매김 vv에 대해 v(φ)Dv(\varphi) \in D일 때, 그리고 오직 그때뿐입니다. 고전 논리는 이 기계 장치를 감춥니다. 그곳에서는 D={1}D = \lbrace 1 \rbrace이 유일하게 말이 되는 선택이기 때문입니다. 값이 세 개가 되면 다이얼이 진짜로 돌아갑니다. K3와 Ł3 모두 표준형에서는 최상위 값만을 지정합니다: D={1}D = \lbrace 1 \rbrace이며, 어떤 논리식이 법칙이 되려면 어디서나 완전히 참이어야 합니다. 이것이 하예크(Hájek)의 다룸이 1-항진명제(1-tautology)라 부르는 개념입니다 [4] (many_valued.py 55–57번째 줄). 그러나 다이얼은 중요합니다: 동일한 K3 표라도 D={12,1}D = \lbrace \tfrac{1}{2}, 1 \rbrace을 취하여 "적어도 절반은 참"이 단언으로 세이게 하면 다른 논리(역설의 논리, Logic of Paradox)가 정의되며, 그 독법 아래에서는 배중률이 다시 법칙이 됩니다. 그 값이 ½ 아래로 결코 내려가지 않기 때문입니다 [5]. 같은 표, 다른 논리인 것입니다. 표와 지정 집합은 독립적인 구성 요소이며, "어떤 법칙이 성립하는가"는 그 쌍의 성질입니다.

이제 항진명제 여부를 결정하는 것은 유한한 계산이 됩니다: nn개의 명제 변수(그 안에 있는 서로 다른 문자의 개수)를 가진 논리식은 3치 논리에서는 정확히 3n3^n개의 값매김을, 고전 논리에서는 2n2^n개의 값매김을 가지므로, 전수 열거로 모든 주장을 해결할 수 있습니다. 동반 코드의 min_value는 어떤 논리식을 모든 값매김에 걸쳐 실행하고 도달한 최솟값을 그 값을 달성하는 값매김과 함께 보고합니다. 지정 집합 {1}\lbrace 1 \rbrace에 대해, 그 논리식이 항진명제인 것은 정확히 그 최솟값이 1일 때입니다(many_valued.py 134–144번째 줄):

def min_value(fn, arity: int, imp, values: tuple[float, ...]
) -> tuple[float, tuple[float, ...]]:
"""Exhaustively evaluate a formula at every valuation over ``values`` and
return ``(minimum value, a valuation attaining it)``. The formula is a
tautology (for designated value 1) iff the returned minimum is 1.0."""
best_v, best_val = None, None
for v in itertools.product(values, repeat=arity):
val = fn(v, imp)
if best_val is None or val < best_val:
best_val, best_v = val, v
return best_val, best_v

테스트 스위트는 일곱 개의 고전적 항진명제로 이루어지며, 각각은 함의를 매개변수로 받는 람다로 한 번만 저장되므로, 동일한 논리식 객체가 고전 논리, K3, Ł3에서 채점됩니다(many_valued.py 116–131번째 줄). 변수가 하나면 이는 논리당 3개의 값매김이고, 둘이면 9개이며, 고전 논리에서는 각각 2개와 4개입니다. 작은 숫자들이지만, 전수 검사의 논리적 힘은 그 크기에 좌우되지 않습니다: 아래의 각 판정은 모든 경우를 조사함으로써 확립되는, 그 논리에 대한 정리입니다.

표류표: 일곱 법칙, 각각 세 개의 판정

함수 drift_table은 세 설정 모두에서 모든 논리식을 채점합니다. 고전 열은 값매김을 {0,1}\lbrace 0, 1 \rbrace로 제한하여 얻어지며, 그곳에서는 두 함의가 증명 가능하게 일치하므로 어느 쪽을 써도 됩니다(many_valued.py 147–160번째 줄). 다음은 커밋된 출력이며, 각 실패에는 그것을 가라앉히는 정확한 값매김이 딸려 있습니다:

[3] tautology drift (designated value 1; exhaustive over all
valuations: 3^vars per logic, 2^vars classically)
formula classical K3 Ł3
p ∨ ¬p (excluded middle) taut ½ @(½) ½ @(½)
¬(p ∧ ¬p) (non-contradiction) taut ½ @(½) ½ @(½)
p → p (identity) taut ½ @(½) taut
¬¬p → p (double negation) taut ½ @(½) taut
p → (q → p) (weakening) taut ½ @(½,½) taut
(p→q) → (¬q→¬p) (contraposition) taut ½ @(½,0) taut
((p→q)→p) → p (Peirce's law) taut ½ @(½,0) ½ @(½,0)

이 표의 모든 칸은 run() 안의 단언으로 강제됩니다(many_valued.py 209–217번째 줄): 고전 열은 일곱 번 모두 항진명제라고 읽어야 하고, K3 열은 단 한 번도 그러면 안 되며, Ł3 열은 예상되는 표시와 정확히 일치해야 합니다. 실패하는 칸에 출력되는 최솟값과 증인 값매김은 단언되는 것이 아니라 같은 열거로 계산되며, 그중 둘은 추가로 정확한 값에 고정됩니다(many_valued.py 220–223번째 줄): 배중률은 두 논리 모두에서 p=12p = \tfrac{1}{2}일 때 정확히 ½로 평가되어야 하고, 동일성은 K3에서는 ½로, Ł3에서는 1로 평가되어야 합니다. 요약해서 나타내면 이 표류는 이렇게 보입니다:

논리식고전K3Ł3
p¬pp \vee \neg p (배중률)항진명제실패, p=12p = \tfrac{1}{2}에서 ½실패, p=12p = \tfrac{1}{2}에서 ½
¬(p¬p)\neg(p \wedge \neg p) (무모순율)항진명제실패, p=12p = \tfrac{1}{2}에서 ½실패, p=12p = \tfrac{1}{2}에서 ½
ppp \rightarrow p (동일성)항진명제실패, p=12p = \tfrac{1}{2}에서 ½항진명제
¬¬pp\neg\neg p \rightarrow p (이중 부정)항진명제실패, p=12p = \tfrac{1}{2}에서 ½항진명제
p(qp)p \rightarrow (q \rightarrow p) (약화)항진명제실패, (12,12)(\tfrac{1}{2}, \tfrac{1}{2})에서 ½항진명제
(pq)(¬q¬p)(p \rightarrow q) \rightarrow (\neg q \rightarrow \neg p) (대우)항진명제실패, (12,0)(\tfrac{1}{2}, 0)에서 ½항진명제
((pq)p)p((p \rightarrow q) \rightarrow p) \rightarrow p (퍼스의 법칙)항진명제실패, (12,0)(\tfrac{1}{2}, 0)에서 ½실패, (12,0)(\tfrac{1}{2}, 0)에서 ½

이 표에서 세 가지 패턴은 손으로 직접 풀어 볼 가치가 있습니다. 각각이 실패를 특정한 산술로 국소화하기 때문입니다.

패턴 하나: 화살표가 없는 법칙은 두 논리에서 똑같이 실패합니다. 배중률과 무모순율은 함의를 전혀 담고 있지 않고, 두 논리가 공유하는 ¬\neg, \wedge, \vee만을 담고 있습니다. 둘 다 부정의 고정점에 의해 가라앉습니다. 배중률은 이미 계산했습니다. 무모순율도 p=12p = \tfrac{1}{2}에서 같은 방식으로 진행됩니다:

¬(12¬12)  =  ¬(min(12,12))  =  ¬12  =  112  =  12.\neg\big(\tfrac{1}{2} \wedge \neg\tfrac{1}{2}\big) \;=\; \neg\big(\min(\tfrac{1}{2}, \tfrac{1}{2})\big) \;=\; \neg\tfrac{1}{2} \;=\; 1 - \tfrac{1}{2} \;=\; \tfrac{1}{2}.

어떤 함의를 고르든 함의가 결코 손대지 않는 논리식을 구할 수는 없습니다. Ł3의 항진명제는 정확히 그 너그러운 화살표를 통과하는 법칙들입니다.

패턴 둘: 발산하는 칸이 K3가 가라앉히는 곳마다 Ł3를 구해 냅니다. 대우를 증인 값매김 (p,q)=(12,0)(p, q) = (\tfrac{1}{2}, 0)에서 취하여 두 논리를 나란히 평가해 봅시다. 먼저 부분식들입니다. K3에서는 pq=max(112,0)=12p \rightarrow q = \max(1 - \tfrac{1}{2}, 0) = \tfrac{1}{2}이고, ¬q=1\neg q = 1, ¬p=12\neg p = \tfrac{1}{2}이므로 후건은 ¬q¬p=max(11,12)=12\neg q \rightarrow \neg p = \max(1 - 1, \tfrac{1}{2}) = \tfrac{1}{2}입니다. Ł3에서도 동일한 두 부분식이 마찬가지로 min(1,112+0)=12\min(1, 1 - \tfrac{1}{2} + 0) = \tfrac{1}{2}min(1,11+12)=12\min(1, 1 - 1 + \tfrac{1}{2}) = \tfrac{1}{2}로 나옵니다. 그래서 두 논리 모두 동일한 마지막 물음, ½ → ½에 도달하는데, 바로 두 논리가 불일치하는 그 한 칸입니다. K3는 max(112,12)=12\max(1 - \tfrac{1}{2}, \tfrac{1}{2}) = \tfrac{1}{2}라고 답하여 대우가 실패하고, Ł3는 min(1,112+12)=1\min(1, 1 - \tfrac{1}{2} + \tfrac{1}{2}) = 1이라고 답하여 대우가 살아남습니다. 동일성, 이중 부정, 약화도 같은 방식으로 구제됩니다(약화는 (12,12)(\tfrac{1}{2}, \tfrac{1}{2})에서 K3 안에서 1212=12\tfrac{1}{2} \rightarrow \tfrac{1}{2} = \tfrac{1}{2}로 두 번 거듭 축소됩니다). 네 개 대 영, 두 논리의 법칙집 사이의 간극 전체는 그 별표 붙은 한 항목이 거듭거듭 작동한 결과입니다.

패턴 셋: Ł3의 너그러운 화살표조차 퍼스의 법칙은 구하지 못합니다. (p,q)=(12,0)(p, q) = (\tfrac{1}{2}, 0)에서 Ł3 안쪽부터 바깥쪽으로 평가해 봅시다:

pq  =  min ⁣(1,  112+0)  =  12,p \rightarrow q \;=\; \min\!\big(1,\; 1 - \tfrac{1}{2} + 0\big) \;=\; \tfrac{1}{2}, (pq)p  =  1212  =  min ⁣(1,  112+12)  =  1,(p \rightarrow q) \rightarrow p \;=\; \tfrac{1}{2} \rightarrow \tfrac{1}{2} \;=\; \min\!\big(1,\; 1 - \tfrac{1}{2} + \tfrac{1}{2}\big) \;=\; 1, ((pq)p)p  =  112  =  min ⁣(1,  11+12)  =  12.\big((p \rightarrow q) \rightarrow p\big) \rightarrow p \;=\; 1 \rightarrow \tfrac{1}{2} \;=\; \min\!\big(1,\; 1 - 1 + \tfrac{1}{2}\big) \;=\; \tfrac{1}{2}.

가운데 단계는 발산하는 칸이 Ł3를 위해 작동하여 전건을 1까지 끌어올리는 부분이고, 마지막 단계는 부족분 독법이 그것에 맞서 작동하여, 완전히 참인 전건에서 절반만 참인 후건으로 화살표를 정확히 그 잃은 절반만큼 깎아 내리는 부분입니다. 퍼스의 법칙은 순전히 함의로만, 오직 화살표만으로 지어져 있으며, 고전적 함의는 성립시키지만 Ł3의 것과 같은 잉여식 화살표는 성립시키지 못하는 고전적인 논리식입니다: 여기서의 그 실패는 이 값매김의 우연이 아니라, 고전적인 것보다 엄격히 더 약한 화살표의 특징적 서명입니다 [4].

유명한 전시물: K3에는 항진명제가 전혀 없다

표류표의 K3 열은 항진명제가 텅 비어 있으며, 이는 우리가 고른 일곱 논리식이 운이 나빠서가 아닙니다. 그 주장은 전면적입니다: 어떤 논리식도 K3 항진명제가 아니다라는 것이며, 올바른 질문을 던지고 나면 그 증명은 세 줄이면 됩니다. 그 질문은 이렇습니다: 전부-½ 값매김은 무엇을 하는가? 동반 코드가 그 답을 계산하며(many_valued.py 225–233번째 줄), 커밋된 실행은 이를 출력합니다:

[4] K3 has NO tautologies at all — the closure argument, computed:
¬½=½ ½∧½=½ ½∨½=½ ½→½=½ (K3: {½} is closed)
so the all-½ valuation gives EVERY K3 formula the value ½ ≠ 1.
Ł3's escape hatch: ½ → ½ = min(1, 1-½+½) = 1 (designated!)

그 논증을 풀어 써 보겠습니다. 집합 {12}\lbrace \tfrac{1}{2} \rbrace은 K3의 모든 결합자 아래에서 닫혀 있습니다(closed): 위에 계산된 네 값이 보여 주듯, 네 연산 중 무엇에 ½을 넣든 ½이 그대로 나옵니다. 이제 ¬\neg, \wedge, \vee, K3\rightarrow_{K3}로 명제 변수들로부터 지어진 임의의 논리식 φ\varphi를 취하고, 모든 변수에 ½을 배정하는 값매김을 생각해 봅시다. 구조적 귀납(structural induction), 즉 논리식이 어떻게 지어지는지에 대한 귀납을 진행합니다: 기저 경우는 벌거벗은 변수이며, 이는 곧바로 ½을 받습니다. 귀납 단계는 φ\varphi의 모든 부분식이 ½로 평가된다고 가정하고, 모두 ½인 입력에 적용된 가장 바깥쪽 결합자가 닫힘에 의해 ½을 돌려준다는 것을 관찰합니다. 그러므로 모든 논리식 φ\varphi에 대해 v(φ)=12v(\varphi) = \tfrac{1}{2}입니다. 지정 집합이 {1}\lbrace 1 \rbrace이고 121\tfrac{1}{2} \neq 1이므로, 이 값매김 아래에서는 어떤 논리식도 지정되지 않으며, 따라서 어떤 논리식도 항진명제가 아닙니다 [2]. 값매김 하나가 언어 전체를 가라앉힙니다. 이 모듈은 일곱 개의 테스트 논리식 모두에 대해 이 결론을 구체적으로 확인하며, 전부-½ 값매김 아래에서 각각이 정확히 ½로 평가됨을 단언합니다(many_valued.py 231–233번째 줄).

모름-독법 아래에서 이것은 스캔들이 아니라 그 철학을 입은 닫힘 논증입니다: 부분들이 오직 ½만을 내놓을 때, 어떤 K3 결합자도 전체를 1로 승격시킬 수 없으므로, 순수한 무지-전파의 진리함수적 논리는 "pppp를 함의한다"조차 아무것도 인증하지 못합니다. K3의 법칙이라면 그것을 결코 공급하지 않는 부분들로부터 값 1을 얻어 내야 할 텐데, 표 안에는 그러한 승격을 수행하는 연산이 존재하지 않습니다. Ł3는 유일하게 있는 문을 통해 빠져나갑니다: 그것의 ½ → ½ = 1은 {12}\lbrace \tfrac{1}{2} \rbrace의 닫힘을 깨뜨려 논리식들이 중간값으로부터 기어 나오게 하며, Ł3의 살아남은 네 항진명제 하나하나는 모두 정확히 그 칸을 통해 기어 나옵니다.

세 값에서 구간 전체로

다섯 개의 정의 공식을 다시 살펴봅시다: 1x1 - x, min(x,y)\min(x, y), max(x,y)\max(x, y), max(1x,y)\max(1 - x, y), min(1,1x+y)\min(1, 1 - x + y). 이들 중 어느 것도 "셋"을 언급하지 않습니다. 모두 평범한 산술이며, [0,1][0, 1] 안의 어떤 실수 입력에 대해서도 잘 정의되어 있고, 이들을 구간 전체 위에서 읽으면 무한치 우카시에비치 논리(infinite-valued Łukasiewicz logic)를 얻습니다. 이는 명제가 0.73의 정도로 참일 수 있는 체계입니다 [4]. 이는 퍼지 집합론이 소속(membership)에 대해 했던 것과 같은 움직임입니다: 어떤 원소가 집합에 속하는지 아닌지 대신, 그것은 [0,1][0, 1] 안의 어떤 정도로 속하며, 집합 연산은 소속 정도에 대한 점별 min\min, max\max, 1x1 - x가 됩니다 [3]. 방금 읽으신 3치 논리의 장은, 이제 우리가 계산할 수 있는 정밀한 의미에서, 세 점에서 표본화된 구간 이론입니다.

Ł3의 화살표는 구간 위에서 앞서 약속했던 더 깊은 서술을 얻습니다: 그것은 잉여(residuum)입니다. 우카시에비치 t-노름(Łukasiewicz t-norm, t-노름은 삼각노름(triangular norm)의 줄임말이며, 다음 장이 정당한 퍼지 논리곱으로 공리화하는 함수 부류입니다)을 정의합시다:

TŁuk(x,z)  =  max(0,  x+z1),T_{\text{Łuk}}(x, z) \;=\; \max(0,\; x + z - 1),

이는 min\min과 달리 두 개의 부분적 참을 결합하는 데 대가를 청구하는 논리곱입니다: 각각 0.7의 정도로 참인 두 주장은 정도 max(0,0.7+0.71)=0.4\max(0, 0.7 + 0.7 - 1) = 0.4로 결합됩니다. 어떤 논리곱의 잉여는 "내가 얼마나 안전하게 결합할 수 있는가?"라는 물음에 답합니다. 형식적으로, 진리값 xxyy에 대해

R(x,y)  =  sup{z[0,1]  :  TŁuk(x,z)y},R(x, y) \;=\; \sup\,\lbrace\, z \in [0, 1] \;:\; T_{\text{Łuk}}(x, z) \le y \,\rbrace,

여기서 sup\sup상한(supremum), 즉 그 집합의 최소상계이며, 여기서는 단순히 허용 가능한 가장 큰 zz, 즉 결합이 yy를 넘어서지 않으면서 xx와 결합될 수 있는 가장 강한 주장입니다. 이는 xyx \rightarrow yxx와의 결합이 yy를 함의하게 되는 가장 약한 명제라는 고전적 사실을 퍼지적으로 일반화한 것입니다. 이 닫힌 형식은 세 단계로 그 정의로부터 떨어져 나옵니다. 첫째, 제약을 풀어헤칩니다: max(0,x+z1)y\max(0, x + z - 1) \le y0y0 \le y(이는 y[0,1]y \in [0, 1]이므로 언제나 성립합니다)와 x+z1yx + z - 1 \le y 둘 다를 요구합니다. 둘째, 남은 부등식을 zz에 대해 풉니다(아래의 겹화살표 \Longleftrightarrow는 "정확히 ~일 때"라고 읽으며, 각 쪽은 정확히 다른 쪽이 성립할 때 성립합니다):

x+z1    yz    1x+y.x + z - 1 \;\le\; y \quad\Longleftrightarrow\quad z \;\le\; 1 - x + y.

셋째, 허용 가능한 집합에 대해 상한을 취합니다. 허용 가능한 zz는 0부터 1x+y1 - x + y까지의 구간을 [0,1][0, 1]과 교차한 것을 이룹니다. 그 상계 1x+y1 - x + y는 결코 음수가 아니지만(x1x \le 1이고 y0y \ge 0이므로) 1을 넘어설 수 있으므로, 허용 가능한 가장 큰 zz

R(x,y)  =  min(1,  1x+y),R(x, y) \;=\; \min(1,\; 1 - x + y),

이며, 이는 정확히 Ł3의 함의입니다. 이제는 가정된 것이 아니라 유도된 것입니다. 그 화살표는 결코 임의로 고른 표의 항목이 아니었습니다: 그것은 우카시에비치 논리곱의 대수적 역이며, 우리가 앞서 그것에 부여했던 "부족분" 독법이 바로 잉여가 측정하는 것입니다 [4].

동반 코드는 이 유도를 그저 믿고 넘어가지 않습니다. 그것은 상한을 진짜 상한으로서 수치적으로 계산하는데, 0부터 128까지의 각 정수 kk에 대응하는 129개의 이진분수 점 k/128k/128로 이루어진 조밀한 격자 위에서(각각은 정확한 이진 부동소수점이므로, 아래의 모든 비교는 근사가 아니라 정확한 등식입니다), 129×129129 \times 129개의 입력 쌍 전부에 대해 한꺼번에 계산합니다(many_valued.py 174–184번째 줄):

def residuum_numeric() -> np.ndarray:
"""R(x, y) = sup{ z ∈ [0,1] : T_Łuk(x, z) ≤ y }, computed as a genuine
supremum over the fine z-grid for every grid pair (x, y). Exact here:
the true sup min(1, 1-x+y) is itself a grid point whenever x and y are.
Returns the (129, 129) matrix R[i, j] = R(GRID[i], GRID[j])."""
x = GRID[:, None, None] # shape (129, 1, 1)
y = GRID[None, :, None] # shape (1, 129, 1)
z = GRID[None, None, :] # shape (1, 1, 129)
ok = luk_tnorm(x, z) <= y # (129, 129, 129) admissible-z mask
# sup over the admissible z (0 is always admissible: T(x, 0) = 0 ≤ y).
return np.where(ok, z, -1.0).max(axis=2)

이 실행은 그런 다음 이 무차별 상한이 16,641개의 격자 쌍 하나하나에서 닫힌 형식 min(1,1x+y)\min(1, 1 - x + y)과 같음을, 최대 편차가 정확히 0임을 단언하고, 0, ½, 1을 담고 있는 세 격자 인덱스로 제한한 것이 Ł3 함의 표를 항목 하나하나 재현함을 단언합니다(many_valued.py 235–247번째 줄). 커밋된 출력입니다:

[5] the bridge to [0,1]: Ł3's arrow is the Łukasiewicz residuum
R(x,y) = sup{ z : max(0, x+z-1) ≤ y }, sup taken numerically
over the 129-point dyadic grid, all 129×129 pairs (x, y):
max |R_numeric - min(1, 1-x+y)| = 0.0 (exact)
restricted to {0, ½, 1}, R reproduces the Ł3 table above —
three-valued logic is fuzzy logic sampled at three points.

항진명제 이야기는 이 장의 일곱 법칙에 대해 변함없이 구간으로 확장됩니다. 이 실행은 그중 둘을 격자 위에서 검사합니다: 배중률 max(x,1x)\max(x, 1 - x)x=12x = \tfrac{1}{2}에서 달성되는 정확히 ½에서 바닥을 찍고, ppp \rightarrow p는 잉여 아래에서 항등적으로 1이며, 이는 닫힌 형식 행렬의 대각선 전체입니다. K3 독법 max(1x,x)\max(1 - x, x) 아래에서는 다시 ½에서 바닥을 찍습니다(many_valued.py 249–256번째 줄). Ł3의 다른 생존자들도 같은 부족분 산술의 짧은 논증으로 구간 전체에서 성립합니다. 이중 부정은 1(1x)=x1 - (1 - x) = x가 그것을 동일성의 한 사례로 만들기 때문에 성립합니다. 약화는 yxy \rightarrow x가 1이거나 1y+x1 - y + x이고, y1y \le 1이므로 1y+xx1 - y + x \ge x이기 때문에 성립합니다. 어느 쪽이든 yxxy \rightarrow x \ge x이므로 1x+(yx)11 - x + (y \rightarrow x) \ge 1이 되어 바깥쪽 화살표가 1로 잘립니다. 대우는 ¬q¬p=min(1,  1(1q)+(1p))=min(1,  1p+q)\neg q \rightarrow \neg p = \min(1,\; 1 - (1 - q) + (1 - p)) = \min(1,\; 1 - p + q)가 바로 pqp \rightarrow q의 값이기 때문에 성립하며, 이는 그 논리식을 다시 동일성으로 축소시킵니다. 그러므로 무한히 많은 진리값을 더하는 것은 이 일곱 법칙 중 무엇이 살아남는지에 관해서는 아무것도 바꾸지 않았습니다. 그것은 다만 배중률의 실패를 연속적으로 만들었을 뿐입니다. 나쁜 점 하나 대신, ½로 움푹 파인 값들의 골짜기 전체가 된 것입니다.

다만 그 안정성이 정확히 무엇인지는 분명히 해 둘 필요가 있습니다: 이는 일반 정리가 아니라 이 일곱 논리식에 관한 사실입니다. 일반적인 관계는 한 방향으로만 성립합니다. 모든 3치 값매김은 특히 구간 값매김이기도 하며, 표는 결합자가 결코 V3V_3 밖으로 나가지 않음을 보여 주므로, 모든 구간 값매김 아래에서 1에 도달하는 논리식은 모든 3치 값매김 아래에서도 확실히 1에 도달합니다: 모든 구간 항진명제는 Ł3 항진명제입니다. 그 역은 성립하지 않으며, 이 장 자신의 결합자로 지어진 간결한 반례가 이를 보여 줍니다. 강한 논리합(strong disjunction) xy:=¬xy=min(1,  1(1x)+y)=min(1,  x+y)x \oplus y := \neg x \rightarrow y = \min(1,\; 1 - (1 - x) + y) = \min(1,\; x + y)을 줄임말로 쓰고, 쌍조건문 xyx \leftrightarrow y(xy)(yx)(x \rightarrow y) \wedge (y \rightarrow x)로 씁시다: 두 화살표 값은 내부 양 1(xy)1 - (x - y)1+(xy)1 + (x - y)를 가지며, 그중 더 작은 쪽은 1xy1 - \lvert x - y\rvert이고(기호 \lvert\cdot\rvert는 절댓값입니다) 결코 1을 넘지 않으므로, xy=1xyx \leftrightarrow y = 1 - \lvert x - y\rvert입니다. 그러면 pp=min(1,  2p)p \oplus p = \min(1,\; 2p)이고, (pp)p=min(1,  min(1,  2p)+p)=min(1,  3p)(p \oplus p) \oplus p = \min(1,\; \min(1,\; 2p) + p) = \min(1,\; 3p)입니다: 2p12p \ge 1일 때는 안쪽 min이 1로 잘려 양변이 모두 1이 되는데, 그때는 3p>13p \gt 1이기도 하기 때문입니다. 그렇지 않을 때는 잘림이 작동하지 않아 min(1,  2p+p)=min(1,  3p)\min(1,\; 2p + p) = \min(1,\; 3p)입니다. 두 논리식은 V3V_3의 세 점 전부에서 일치하므로(p=0,12,1p = 0, \tfrac{1}{2}, 1에서 둘 다 0, 1, 1을 줍니다), 그 쌍조건문은 Ł3 항진명제입니다. 그러나 p=0.3p = 0.3에서 양변은 0.6과 0.9이고, 쌍조건문은 1이 아니라 10.3=0.71 - 0.3 = 0.7입니다. 진리 집합을 키우는 것은 오직 법칙집을 줄일 수만 있을 뿐 결코 늘릴 수 없습니다. 여기서 표본화된 일곱 개는 그저 우연히 온전하게 이행했을 뿐입니다.

진리의 정도는 확률이 아니다

이 다리가 어떤 무게를 지니기 전에, 혼동 하나를 먼저 해체해야 합니다. 그것이 정확히 이 권의 1부와 2부 사이의 갈림길에 놓여 있기 때문입니다. 예시의 cites(p3, p1)에 붙은 0.5는 확률처럼 보이며, 퍼지의 0.5는 진리값 입니다. 이 둘은 취향의 문제가 아니라 수학적으로 강제되는 방식으로 서로 다르게 행동합니다.

퍼지 논리는 진리함수적입니다. 이는 K3가 자신의 화살표에 대해 내리는 판정을 확정 지었던 바로 그 성질입니다: 복합 논리식의 값은 구성상 그 부분들의 값의 함수입니다. v(A)=0.5v(A) = 0.5이고 v(B)=0.5v(B) = 0.5라면, 논리곱은 확정됩니다: AABB가 무엇이든 v(AB)=min(0.5,0.5)=0.5v(A \wedge B) = \min(0.5, 0.5) = 0.5입니다. 확률은 진리함수적이지 않으며, 두 줄짜리 반례가 확률이 결코 진리함수적일 수 없음을 증명합니다. 공정한 동전을 던지고 AA를 "앞면"이라고 합시다. 그러면 P(A)=0.5P(A) = 0.5이고 P(¬A)=0.5P(\neg A) = 0.5입니다. 이제 논리곱 항이 모두 확률 0.5를 갖는 두 논리곱을 생각해 봅시다: P(AA)=P(A)=0.5P(A \wedge A) = P(A) = 0.5이지만, P(A¬A)=P(불가능)=0P(A \wedge \neg A) = P(\text{불가능}) = 0입니다. 같은 입력 숫자에 다른 출력이 나오므로, 주변 확률만으로 논리곱의 확률을 계산할 수 있는 함수 c(0.5,0.5)c(0.5, 0.5)존재하지 않습니다. 그 답은 사건들이 어떻게 겹치는지에 달려 있으며, 그 정보는 두 숫자가 실어 나르지 않습니다. 따라서 [0,1][0, 1] 위의 어떤 진리함수적 결합자도, 최솟값을 포함해, 확률을 계산하고 있는 것이 아니며, 어떤 결합자를 골라도 이를 고칠 수 없습니다.

그러므로 인용 엣지 위의 0.5는 두 가지 정직한 독법을 허용하며, 그 둘은 서로 다른 수학으로 이어집니다. 그것을 정도(degree)로 읽으면("이 엣지는 절반쯤 인용으로 셈됩니다") 진리함수적 결합자는 정당합니다: 그 길은 이 부와 t-노름 공리, 그리고 실수 논리를 관통합니다. 그것을 확률(probability)로 읽으면("이 엣지가 실재할 확률은 0.5입니다") 가능 세계들에 걸쳐 사실들이 어떻게 함께 일어나는지를 추적하는 진짜 확률적 기계 장치를 위해 진리함수성을 포기해야 합니다: 그 길이 2부, 즉 분포 의미론과 가중 모델 계수입니다. 2권의 신뢰도 세미링은 조용히 첫 번째 길을 택했습니다(그 min\min은 애초부터 진리함수적이었습니다). 2부는 두 번째 길을 택하고 그 지수적인 대가를 치를 것입니다. 어느 독법도 틀리지 않았습니다. 둘을 혼동하는 것이 틀린 것입니다.

진리가 숫자가 되는 순간, 논리는 함수가 된다

한 걸음 물러서서 실제로 무엇을 사들였는지 봅시다. 이 장의 모든 결합자는 이제 실숫값 함수입니다: 부정은 [0,1][0, 1] 위의 함수이고, 논리곱과 논리합, 그리고 두 함의 모두는 단위 정사각형(unit square) [0,1]2[0, 1]^2, 즉 진리값 쌍의 집합 위의 함수입니다. 이들은 구체적이고 기초적인 함수들입니다: 1x1 - x아핀(affine)입니다(일상적인 의미에서의 직선입니다. 엄밀한 선형대수적 의미에서의 "선형"(linear)은 0을 고정하는 사상을 위해 남겨 둡니다). min\min, max\max, K3의 화살표, 우카시에비치의 화살표는 조각별 아핀(piecewise affine)이며, 각각 많아야 두 개의 아핀 조각이 하나의 꺾임을 따라 이어 붙여진 것입니다. 결합자 아래에서 평가된 논리식은 이러한 함수들의 합성이므로, 그 자체로 그것의 원자들의 진리값에 대한 조각별 아핀 함수입니다. 논리식 p¬pp \vee \neg p는 곧 함수 xmax(x,1x)x \mapsto \max(x, 1 - x)이며, 표류표의 증인 값매김은 이러한 함수들의 최소화점입니다. 여기서는 열거로 찾아지고, 구간 위에서는 초등적인 경우 분석으로 찾을 수 있습니다: 최솟값은 두 아핀 조각이 만나는 꺾임(배중률이라면 x=12x = \tfrac{1}{2})에 놓이며, 그곳은 도함수가 존재하지 않는 점이므로, 그것을 찾아내는 것은 0으로 놓인 도함수가 아니라 양쪽에서의 기울기입니다.

이것이 이 권의 논제가 그 첫 번째 구체적인 형태를 취하는 순간입니다. 불(Boolean) 논리에서는 무의미했던 질문들이 이제 잘 정의됩니다: 이 결합자는 어디에서 미분 가능한가, 편도함수 min(x,y)/x\partial\,\min(x, y)/\partial x(1권에서 나온 기호 \partial은 다른 변수들을 고정한 채 한 변수에 대해 취한 도함수를 나타냅니다)는 무엇이며 언제 0이 되는가, 어떤 결합자가 쓸모 있는 그래디언트 신호를 통과시키고 어떤 것이 학습을 정체시키는 죽은 고원을 가지는가. 이제 논리로부터 지어진 손실 함수를 생각할 수 있게 되는데, 논리가 이제 그 입력에 연속적으로 반응하는 숫자로 평가되기 때문입니다. 여전히 빠져 있는 것은 규율입니다: 지금까지 아무것도 단위 정사각형 위의 어떤 함수가 논리곱이라 불릴 자격이 있는지를 말해 주지 않습니다. 우리는 눈에 띄게 다른 성격을 지닌 두 개(min\minTŁukT_{\text{Łuk}})를 만났고, 후보의 공간은 무한합니다. 다음 장이 그 공리를 부과합니다.

아직 풀리지 않은 부분

어떤 3치 함의가 옳은 것일까요? 정직한 답은, 그런 식으로 물으면 그 질문에는 답이 없다는 것입니다. 그것이 표에 의해 미결정으로 남아 있고 오직 ½이 무엇을 뜻하는지에 의해서만 정해지는데, 그 두 가지 의미가 서로 반대 방향으로 끌어당기기 때문입니다. 만약 ½이 모름을 뜻한다면, K3의 화살표가 옳고 그 무법성은 결함이 아니라 특징입니다: 무지를 전파하기 위한 논리는 정보가 전혀 없는 상태에서 ppp \rightarrow p를 인증해서는 안 되며, 그렇게 하는 어떤 화살표든 조용히 지식을 날조하고 있는 것입니다. 만약 ½이 진리의 정도를 뜻한다면, Ł3의 화살표가 옳고 K3의 것은 고장 나 있습니다: 어떤 주장에서 그 자신으로 가는 함의는 어떤 참도 잃지 않으므로, 그것을 ½로 깎는 것은 부족분이 0이라는 사실을 잘못 보고하는 것입니다. 하나의 결합자가 두 주인을 함께 섬길 수는 없습니다. 표류표가 그 영수증이며, 네 개 대 영, 한 칸만 다른 정의로부터 같은 코드가 출력한 것입니다. 그리고 구간 위에서는 문제가 더 커집니다: 무한히 많은 후보 논리곱 함수가 있으며, 각각이 자신만의 잉여, 자신만의 법칙집, 자신만의 그래디언트 거동을 유도하는데, 아직 그중 어느 것도 특별히 우대할 근거가 없습니다. 탈출구는 승자를 고르는 것이 아니라 질문을 바꾸는 것입니다: 어떤 퍼지 논리곱이든 만족해야 할 대수적 법칙(교환법칙, 결합법칙, 단조성, 1에서의 항등원)을 입법하고 그 법칙을 지키는 전체 계열을 한꺼번에 연구하는 것입니다. 그 법칙들이 바로 t-노름 공리이며, 연속성이라는 가정 하나를 더하면 그 공리를 따르는 모든 논리곱은 정확히 세 개의 근본적인 계열로부터 지어짐이 드러납니다. 그 공리와 그 분류 모두가 다음 장의 본업입니다 [4].

왜 중요한가

이 장은 이 시리즈의 두 기둥 사이의 경첩입니다. 기호주의 기둥(1권과 2권)은 두 개의 진리값 위에서 돌아갔으며 자신의 한계에 대해 정직했습니다: 열린 세계는 "모른다"라고 말했고 주석 달린 추론기는 "0.5"라고 말했지만, 고전 논리는 어느 답도 담을 수 없었습니다. 신경 기둥(3권)은 단위 구간 안의 숫자, 즉 논리가 전혀 붙어 있지 않은 점수와 신뢰도만을 내놓았습니다. 진리 집합을 [0,1][0, 1]로 만드는 것이 바로 두 기둥이 서로 말할 수 있게 하는 단 하나의 움직임입니다: 신경망의 출력은 이제 진리값이 수 있고, 그러한 출력에 대한 논리식은 이제 실숫값 함수가 수 있으며, 이는 그것이 손실이 될 수 있음을 뜻하고, 이는 1권의 경사 하강법이 신경망을 그것을 만족시키는 방향으로 밀어붙일 수 있음을 뜻합니다. 이 권의 나머지에 나오는 모든 시스템, 즉 실수 논리를 손실로 컴파일하는 논리 텐서 네트워크, 제약으로 분류기를 정칙화하는 의미 손실, t-노름 산술로 다중 홉 질의를 채점하는 퍼지 질의 응답은 모두 이 장이 실행 가능하게 만든 관찰 위에 서 있습니다: 진리가 숫자가 되는 순간, 논리는 함수가 됩니다.

이 장은 또한 이 권이 계속 지켜야 할 두 가지 경고를 심었습니다. 첫째, 결합자의 선택은 결과를 좌우하며 유일하지 않습니다: 진리표의 한 칸이 무법적인 논리를 법칙 있는 논리로부터 갈라놓았으며, 구간 위에서는 같은 선택이 쓸모 있는 그래디언트를 죽은 그래디언트로부터 갈라놓을 것입니다. 둘째, 정도는 확률이 아닙니다: 진리함수적 산술이 값싼 것은 정확히 그것이 사실들이 어떻게 함께 일어나는지를 무시하기 때문이며, 2부가 존재하는 이유는 몇몇 응용은 그것을 무시할 여유가 없기 때문입니다. 5권의 신뢰와 보정에 관한 질문들은 이 두 경고를 그대로 물려받습니다: 0.73을 보고하는 시스템은 사용자에게 "무엇의 0.73인가"라는 질문에 답할 의무가 있으며, 이 장은 그 질문을 처음으로 물을 수 있게 만든 곳입니다.

핵심 용어

  • 열린 세계 가정(open-world assumption): 지식 베이스에 없는 사실은 거짓이 아니라 진술되지 않은 것이라는 규약입니다. 두 개의 진리값이 담을 수 없는 인식론적 범람입니다.
  • 진리 집합 / V3V_3: 사용 가능한 진리값의 집합입니다. 여기서는 {0,12,1}\lbrace 0, \tfrac{1}{2}, 1 \rbrace이며, 장의 끝에서 구간 [0,1][0, 1]로 확장됩니다.
  • 값매김(valuation): 각 명제 변수에 진리값을 배정하는 것이며, 결합자 표에 의해 모든 논리식으로 확장됩니다.
  • 지정값(designated values): 단언으로 세는 진리값의 부분집합 DD입니다. 논리식은 모든 값매김이 그것에 지정값을 줄 때, 그리고 오직 그때만 항진명제입니다. K3와 Ł3 모두 오직 1만을 지정합니다.
  • 만남과 이음(meet and join): 어떤 순서 안에서의 최대하계와 최소상계입니다. 전순서인 진리 집합 위에서는 이들이 min\minmax\max이며, 이들이 공유되는 논리곱과 논리합을 정의합니다.
  • 강한 부정(strong negation): ¬x=1x\neg x = 1 - x, 순서를 뒤집는 사상이며, ½에서의 그 고정점이 이 장의 모든 논리에서 배중률을 가라앉힙니다.
  • K3(강한 클레이니 논리, strong Kleene logic): ½을 모름으로 읽는 3치 논리이며, 실질적 화살표 max(1x,y)\max(1 - x, y)를 가집니다. 모든 결합자 아래에서의 {12}\lbrace \tfrac{1}{2} \rbrace의 닫힘 때문에 항진명제가 전혀 없습니다.
  • Ł3(3치 우카시에비치 논리, three-valued Łukasiewicz logic): ½을 가능하다로 읽는 3치 논리이며, 화살표 min(1,1x+y)\min(1, 1 - x + y)를 가집니다. 동일성, 이중 부정, 약화, 대우는 지키고 배중률, 무모순율, 퍼스의 법칙은 버립니다.
  • 항진명제 표류(tautology drift): 진리 집합이 커짐에 따라 고전적 법칙이 이행하는 것입니다. 여기서는 논리식마다 모든 3n3^n개의 값매김을 전수 열거하여 결정됩니다.
  • 우카시에비치 t-노름(Łukasiewicz t-norm): TŁuk(x,z)=max(0,x+z1)T_{\text{Łuk}}(x, z) = \max(0, x + z - 1), 그 잉여가 Ł3의 화살표인, [0,1][0, 1] 위의 논리곱입니다.
  • 잉여(residuum): R(x,y)=sup{z:T(x,z)y}R(x, y) = \sup\lbrace z : T(x, z) \le y \rbrace, xx와의 결합이 yy 이내에 머무르게 하는 가장 약한 진리값입니다. 논리곱으로부터 함의를 원칙 있게 유도한 것입니다.
  • 진리함수성(truth-functionality): 복합식의 값이 그 부분들의 값의 함수라는 성질입니다. 퍼지 결합자는 구성상 이 성질을 가지고, 확률은 증명 가능하게 이 성질을 결여하며, 그 차이가 1부와 2부 사이의 갈림길입니다.

이 장이 이어지는 곳

이 장은 단위 구간 위의 두 논리곱, min(x,y)\min(x, y)max(0,x+y1)\max(0, x + y - 1)을 만났으며, 이 둘은 눈에 띄게 다른 성격을 지닙니다: 하나는 멱등적(idempotent, 어떤 주장을 자기 자신과 결합해도 아무것도 바뀌지 않습니다: min(x,x)=x\min(x, x) = x)이고 관대하며, 다른 하나는 엄격하고 벌점을 누적합니다. 이 장은 둘 중 어느 쪽에도 왕관을 씌우기를 거부하고 대신 공리를 약속하며 마무리되었습니다. 다음 장인 t-노름과 t-코노름이 그것을 전달합니다: 단위 정사각형 위의 함수가 논리곱이라는 이름을 얻을 자격을 갖추려면 만족해야 할 네 개의 법칙, 모든 연속 t-노름이 정확히 세 개의 근본적인 계열(괴델, 곱, 우카시에비치)로부터 지어진다는 정리, 각각에 균일하게 적용되는 잉여 구성, 그리고 이 장이 잘 정의된 질문으로 만든 것, 즉 이 결합자들 중 어느 것이 학습기가 실제로 쓸 수 있는 그래디언트를 지니는가에 대한 첫 번째 본격적인 검토입니다.


동반 코드: examples/integration/many_valued.py는 이 장의 모든 것을 구현합니다: 다섯 개의 결합자, 두 출처 진리표 검사, 전수 열거 항진명제-표류 계산, 닫힘 논증, 그리고 격자-정확 잉여 다리이며, 모든 주장은 등식 단언으로 지켜집니다. 위에 인용된 모든 표와 숫자를 재현하려면 python3 examples/integration/many_valued.py를 실행하십시오. 출력되는 [1]부터 [5]까지의 절은 이 장의 절들과 순서대로 대응합니다.