유형 이론

Type theory

수학, 논리학, 컴퓨터 과학에서, 유형 이론은 특정 유형 시스템의 공식적인 표현이고, 일반 유형 이론은 유형 시스템의 학문적 연구입니다.어떤 유형 이론은 이론을 수학의 기초로서 설정하기 위한 대안으로 작용한다.알론조 처치의 유형 δ-calculusPer Martin-Löf직관적 유형 이론 두 가지가 기초가 되었다.대부분의 컴퓨터화된 교정 시스템은 그 기초에 활자 이론을 사용한다.일반적인 것은 티에리 코캉귀납적 구성 미적분이다.

역사

유형 이론은 순진한 집합론형식 논리에 기초한 수학적 기초에서의 역설을 피하기 위해 만들어졌다.버트런드 러셀이 발견한 러셀의 역설은 자신을 포함한 "모든 가능한 집합"을 사용하여 집합을 정의할 수 있었기 때문에 존재했다.1902년과 1908년 사이에 버트랜드 러셀은 이 문제를 해결하기 위해 다양한 "유형 이론"을 제안했다.1908년까지 러셀은 1910년에서 1913년 사이에 출판된 화이트헤드러셀프린키피아 매스매티카에서 두드러지게 특징지어진 "환원성의 축"과 함께 "미화된" 유형 이론에 도달했습니다.이 시스템은 유형의 계층을 만들고 각각의 구체적인 수학적 실체를 유형에 할당함으로써 러셀의 역설을 피했다.특정 유형의 엔티티는 해당 [a]유형의 하위 유형으로만 구축되므로 엔티티가 자체를 사용하여 정의되는 것을 방지합니다.러셀의 유형 이론은 집합이 그 자체의 구성원이 될 가능성을 배제했다.

타입이 항상 논리적으로 사용되는 것은 아니다.러셀의 [3]역설을 피할 수 있는 다른 기술들이 있었다.알론조 교회람다 미적분이라는 특정 논리와 함께 사용했을 때 타입은 확실히 인기를 얻었다.

가장 유명한 초기 예는 처치의 단순형 람다 미적분이다.처치의 유형 이론은[4] 형식 체계가 원래의 비정형 람다 미적분을 괴롭힌 클린-로저 역설을 피하는 데 도움을 주었다.처치는 그것이 수학의 기초가 될 수 있다는 것을 증명했고 그것은 고차 논리로 언급되었다.

"유형 이론"이라는 말은 일반적으로 람다 미적분학을 기반으로 한 유형 체계를 가리킨다.영향력 있는 시스템 중 하나는 건설적 수학의 기초로서 제안된 페르 마르틴-뢰프직관적 유형 이론이다. 다른 하나는 티에리 코캉구성 미적분학으로 Coq, Lean, 그리고 다른 "증명서 작성 프로그램"에 의해 기초가 된다.유형 이론은 호모토피 유형 이론에서 입증되었듯이 활발한 연구 분야이다.

서론

많은 유형 이론이 있어 포괄적인 분류법을 제시하기가 어렵다. 이 논문은 완전한 분류법이 아니다.다음은 주요 접근법 중 몇 가지를 다루는 유형 이론에 익숙하지 않은 사람들을 위한 소개입니다.

기본

용어와 종류

유형 이론에서는 모든 용어에 유형이 있습니다.용어와 그 유형은 종종 "term: type"으로 함께 쓰여집니다.형식 이론에 포함되는 일반적인 유형은 자연수이며, 종종 " 또는 "nat"로 표기됩니다.다른 하나는 부울 로직 값입니다.그 종류에는 다음과 같은 매우 간단한 용어가 있습니다.

  • 0 : nat
  • 42 : nat
  • true : bool

함수 호출을 사용하여 다른 용어로 용어를 작성할 수 있습니다.유형 이론에서 함수 호출은 "함수 응용 프로그램"이라고 불립니다.함수 어플리케이션은 특정 유형의 용어를 사용하고 다른 유형의 용어를 생성합니다.함수 어플리케이션은 기존의 "function(argument, argument, ...)" 대신 "function argument ..."로 표기된다.자연수의 경우 두 개의 자연수를 사용하는 "더하기"라는 함수를 정의할 수 있습니다.따라서 그 유형에 대한 몇 가지 용어가 더 있습니다.

  • add 0 0 : nat
  • add 2 3 : nat
  • add 1 (add 1 (add 1 (add 1 0)): nat

마지막 용어에서는 작업 순서를 나타내기 위해 괄호가 추가되었습니다.기술적으로, 대부분의 유형 이론은 괄호가 모든 작업에 존재해야 하지만, 실제로 괄호는 쓰여지지 않고, 저자들은 독자들이 그들이 어디에 있는지 알기 위해 우선 순위와 연관성을 사용할 수 있다고 가정합니다.마찬가지로 "x { x { y 대신 " {x+로 표기하는 것이 일반적입니다.따라서 위의 용어는 다음과 같이 고쳐 쓸 수 있습니다.

  • 0 + 0 : nat
  • 2 + 3 : nat
  • 1 + (1 + (1 + 0 ) : nat

항에 변수가 포함될 수도 있습니다.변수에는 항상 유형이 있습니다.따라서 "x"와 "y"가 유형 "nat"의 변수라고 가정하면 다음 용어도 유효합니다.

  • x : nat
  • x + 2 : nat
  • x + (x + y) : nat

"nat"과 "bool"보다 더 많은 종류가 있습니다."add"라는 용어는 "nat"가 아니라 두 "nat"에 적용하면 "nat"에 계산되는 함수입니다."추가" 유형은 나중에 설명하겠습니다.우선, 「컴퓨터의 대상」에 대해 설명할 필요가 있습니다.

계산

유형 이론은 내장된 계산 표기법을 가지고 있다.다음 용어는 모두 다릅니다.

  • 1 + 4 : nat
  • 3 + 2 : nat
  • 0 + 5 : nat

그러나 모두 "5: nat"라는 용어로 계산됩니다.유형 이론에서, 우리는 계산을 언급하기 위해 "축소"와 "축소"라는 단어를 사용합니다.따라서 "0 + 5 : nat"은 "5 : nat"로 감소합니다."0 + 5 : nat{\ {\ ( \ \ right arrow} 5 : nat" 이라고 쓸 수 있습니다.계산은 기계적인 것으로, 용어의 구문을 고쳐 쓰는 것에 의해서 행해집니다.

변수를 포함하는 항도 줄일 수 있습니다.따라서 "x + (1 + 4) : nat"이라는 용어는 "x + 5 : nat"으로 감소한다. (Church-Rosser 정리 덕분에 한 기간 내의 모든 하위 항을 줄일 수 있다.)

더 이상 줄일 수 없는 변수가 없는 항은 "표준 항"입니다.위의 모든 용어는 정규 용어인 "5 : nat"로 축소됩니다.자연수의 표준항은 다음과 같습니다.

  • 0 : nat
  • 1 : nat
  • 2 : nat
  • 기타.

분명히 같은 항으로 계산되는 항은 동일합니다.따라서 "x : nat"을 가정하면 "x + (1 + 4 ) : nat" 및 "x + (4 + 1) : nat"은 둘 다 "x + 5 : nat"로 감소하기 때문에 동일합니다.두 항이 같으면 서로 대체할 수 있습니다.평등은 유형 이론에서 복잡한 주제이고 많은 종류의 평등들이 있다.두 개의 항이 같은 항으로 계산되는 이러한 종류의 평등을 "판결 평등"이라고 합니다.

기능들

유형 이론에서 함수는 용어이다.함수는 람다 항이거나 "규칙에 따라" 정의될 수 있습니다.

람다항

람다 용어는 "(변수 이름: type1 . term)"과 비슷하며 "type1 { \ type2"를 가집니다.유형 1 {\ type2 람다 항이 유형 "type1"의 매개변수를 취하고 유형 "type2"의 항으로 계산하는 함수임을 나타냅니다.람다 항 내부의 항은 변수의 유형이 "type1"이라고 가정할 때 "type2" 값이어야 합니다.

람다 항의 예로는 인수를 두 배로 하는 이 함수가 있습니다.

  • (x: nat . (x 추가) : nat \ nat

변수 이름은 "x"이고 변수 유형은 "nat"입니다.용어(x 추가)는 "x : nat"로 가정할 때 "nat" 유형입니다.따라서 람다 용어의 유형은 "nat nat"입니다. 즉, "nat"을 인수로 지정하면 "nat"로 계산됩니다.람다 항에 대해 감소(일명 계산)가 정의됩니다.함수를 적용(호출)하면 파라미터 대신 인수가 사용됩니다.

앞에서 함수 적용은 함수 용어 뒤에 매개변수를 넣어 작성하는 것을 보았습니다.따라서 "nat" 유형의 파라미터 "5"를 사용하여 위의 함수를 호출하려면 다음과 같이 입력합니다.

  • (x : nat . (x x 추가) 5 : nat

lamda 용어는 type "nat {\ \to} nat"로, "nat"을 인수로 지정하면 type "nat"의 항이 생성됩니다.인수 "5"를 지정했으므로 위의 용어는 유형 "nat"를 가집니다.축소는 변수 "x"의 인수 "5"를 용어 "(추가 x")의 "x"로 대체함으로써 작동하므로, 이 용어는 다음과 같이 계산됩니다.

  • (5 5 추가): nat

분명히 계산하면

  • 10 : nat

람다 항에는 이름이 없기 때문에 종종 "익명 함수"라고 합니다.읽기 쉽게 하기 위해 람다 용어에 이름을 붙이는 경우가 많습니다.이것은 단지 표기법일 뿐 수학적 의미는 없다.몇몇 작가들은 이것을 "국가적 평등"이라고 부른다.위의 함수에 다음 표기를 사용하여 이름을 지정할 수 있습니다.

  • double : nat \} nat : : = (x : nat . (x 추가))

이것은 위와 같은 기능으로, 단지 다른 방법으로 쓸 수 있습니다.그래서 이 용어는

  • double 5 : nat

아직도 계산하다

  • 10 : nat

종속 유형

종속 유형은 함수에 의해 반환되는 유형이 인수 값에 따라 달라지는 경우입니다.예를 들어, 유형 이론이 유형 "bool"을 정의하는 규칙을 가지고 있는 경우, 함수 "if"도 정의합니다.함수 "if"는 3개의 인수를 사용하고 "if true b c"는 "b"로 계산되며 "if false b c"는 "c"로 계산됩니다.하지만 "if a b c"의 유형은 무엇일까요?

"b"와 "c"가 같은 유형일 경우, "b c"가 "b" 및 "c"와 같은 유형일 경우 명백합니다.따라서 "a: bool"을 가정하면,

  • a 2 4의 경우 : nat
  • 거짓일 경우: bool

그러나 "b"와 "c"의 유형이 다를 경우 "if a b c"의 유형은 "a"의 값에 따라 달라집니다.기호는 인수를 사용하여 유형을 반환하는 함수를 나타낼 때 사용합니다."B"와 "C"와 "a: bool", "b: B"와 "c: C"의 유형이 있다고 가정하면,

  • a c의 경우 : (ol a : bool . B { \} C { \to} B C의 경우)

즉, "if" 용어의 유형은 첫 번째 인수의 값에 따라 두 번째 또는 세 번째 인수의 유형입니다.실제로는 "if"를 사용하여 "if"를 정의하지 않지만, 이 소개에서는 너무 복잡합니다.

이 타입은 연산을 포함할 수 있기 때문에 의존형 타입은 놀라울 정도로 강력합니다.수학자가 "x{\ x가 소수인 x {\ x 존재한다" 또는 "x{\ P 되는 숫자 {\x}가 존재한다"라고 하면 종속형이라고 표현할 수 있습니다.즉, 이 특성은 특정 "에 대해 입증되었으며 결과 유형으로 볼 수 있습니다.

종속 입력에는 많은 세부 사항이 있습니다.이 서론에서는 너무 길고 복잡합니다.자세한 내용은 종속 유형 및 람다 큐브에 대한 문서를 참조하십시오.

유니버스

δ-terms는 유형을 반환합니다.그렇다면 수익률의 유형은 무엇일까요?글쎄요, 활자가 들어 있는 활자가 있을 거예요.다른 유형을 포함하는 유형을 "유니버스"라고 합니다.흔히 U 스타일 U라는 기호로 쓰입니다.때로는 U U_ : 1( 스타일1}), 1(}): U 2( 스타일2}} 등 우주 계층이 존재합니다.

우주는 복잡해만약 우주가 자신을 포함한다면, 그것은 지라드의 패러독스 같은 역설로 이어질 수 있다.이 도입부에는 우주의 세부사항들이 너무 길고 복잡하다.

일반적인 "규칙에 따른" 유형 및 용어

유형 이론은 추론 규칙에 의해 정의된다.위에서 설명한 "기능 코어" 규칙과 유형 및 용어를 작성하는 규칙이 있습니다.다음은 일반적인 유형 및 관련 용어 목록입니다.

목록은 "유도적 유형"으로 끝납니다. 이는 목록의 다른 모든 유형을 구성할 수 있는 강력한 기술입니다.증명 보조자 "Coq"와 "Lean"이 사용하는 수학적 기초는 "귀납적 구성 계산"에 기초한다. "귀납적 구성 계산"(그 "기능적 핵심")은 귀납적 유형의 "구성 계산"이다.

빈 타입

형식에는 항이 없습니다.이 타입은 보통 \bot "displaystyle {으로 표기됩니다.

그것은 무엇인가를 계산할 수 없다는 것을 보여주기 위해 사용된다.유형 "A"의 경우 유형 "A 의 함수를 만들 수 있습니다. "A"에는 항이 없습니다.유형 "A"의 예로는"x)가 짝수이고 xx)가 홀수인 x(\ x 있다"가 있습니다(예 "A"의 구성에 대해서는 아래의 "제품 유형"을 참조하십시오).어떤 타입에 용어가 없는 경우는, 「무인」이라고 합니다.

유닛 타입

단위 유형에는 정확히 1개의 표준 항이 있습니다.유형은 또는 "{\로 표기되며, 단일 표준 용어는 "*"로 표기됩니다.

단위 유형은 무언가가 존재하거나 계산할 수 있음을 나타내기 위해 사용됩니다.유형 "A"의 경우 유형 " \\to A"의 함수를 만들 수 있습니다. "A"에는 하나 이상의 항이 있습니다.어떤 타입에 적어도1개의 항이 있는 경우는, 「인재」라고 합니다.

부울형

Boolean 유형에는 정확히 2개의 표준 항이 있습니다.이 유형은 보통 "bool" 또는 " 또는 "로 표기됩니다.표준 용어는 보통 "참"과 "거짓"입니다.

부울 유형은 다음과 같이 제거기 함수 "if"로 정의됩니다.

  • true b c c { \ right arrow} b의 경우
  • false b c c { \ right arrow} c의 경우

제품 종류

제품 유형에는 순서가 매겨진 쌍이 있습니다.유형 "A" 및 "B"의 경우 제품 유형은 "A× \ B"로 표기됩니다.표준 항은 생성자 함수 "쌍"에 의해 생성됩니다.조건은 "쌍 a b"입니다. 여기서 "a"는 유형 "A"의 용어이고, "b"는 유형 "B"의 용어입니다.제품 유형은 다음과 같이 제거기 기능 "첫 번째" 및 "두 번째"로 정의됩니다.

  • first (a) (a) { style \ right arrow}a
  • second (a를 참조) { style \ right arrow} b

순서쌍 외에 이 타입은 논리연산자 "and"에 사용됩니다.이는 "A"와 "B"를 포함하기 때문입니다.두 가지 유형 중 하나를 수용하기 때문에 교차로에도 사용됩니다.

유형 이론이 종속적 유형을 갖는 경우 종속적 쌍을 가집니다.종속 쌍에서 두 번째 유형은 첫 번째 항의 값에 따라 달라집니다.따라서 "\ a:A . B(a)"로 표기되며, "B"의 유형은 "A \ U"이다.속성 "B(a)"를 가진 "a"의 존재를 나타낼 때 유용합니다.

합계형

합계 유형은 "태그 부착 유니언"입니다.즉, 유형 "A"와 "B"의 경우 유형 "A + B"는 유형 "A" 또는 유형 "B"의 항을 가지며 어느 항을 보유하는지 알고 있다.이 유형은 생성자 "injectionLeft" 및 "injectionRight"와 함께 제공됩니다.호출 "injectionLeft a"는 "a : A"를 사용하여 "A + B" 유형의 정규 용어를 반환합니다.마찬가지로 injectionRight b는 "b : B"를 사용하고 "A + B" 유형의 정규 용어를 반환합니다.유형은 유형 "C"에 대해 제거기 함수 "일치"로 정의되며, "f : A \displaystyle to } 및 "g : B \displaystyle \to } C":

  • match (injection Left a) C f g { \ right arrow (f a )
  • match (injection Right b) C f g { \ right arrow (g b )

합계 유형은 논리 또는 합계에 사용됩니다.

자연수

자연수는 보통 페아노 산술 형식으로 구현됩니다.0을 가리키는 표준 용어 "0 : nat"가 있습니다.0보다 큰 표준 값은 생성자 함수 "S : nat \ nat"을 사용합니다.즉, "S 0"은 1이고, "S (S 0)"는 2이다."S(S(S 0)"는 3이다.기타. 10진수는 단지 그 용어와 공적으로 동일하다.

  • 1 : nat ::= S 0
  • 2 : nat ::= S (S 0)
  • 3 : nat ::= S (S (S 0))
  • ...

자연수는 재귀를 사용하여 모든 nat에 대한 함수를 정의하는 제거기 함수 "R"로 정의됩니다.정의할 함수의 유형인 "P : nat \ U" 함수를 사용합니다.또한 0의 값인 "PZ : P 0"과 "n"의 값을 "n + 1"의 값으로 변환하는 방법을 나타내는 함수 "PS : P n { P (S n)"가 필요합니다.따라서 계산 규칙은 다음과 같습니다.

  • R PZ PS 0 ( \ \ right arrow )PZ
  • R PZ PS ( n \ n) {\ ( \ \ right arrow PS ( R PZ n \ n)

앞서 사용한 함수 "add"는 "R"을 사용하여 정의할 수 있습니다.

  • add : nat {\} nat {\ nat : = {\displaystyle \to } nat ( n:nat {} nat ) ( n:nat ) ) 。

아이덴티티 타입

동일 유형은 유형 이론에서 평등에 대한 세 번째 개념입니다.첫 번째는 "notational equality"로, "2 : nat : = (S 0)"와 같이 수학적 의미는 없지만 독자들에게 유용한 정의를 말한다.두 번째는 "판정 평등"으로, 두 항이 "x + (1 + 4)"와 "x + (4 + 1)"과 같이 같은 항으로 계산될 때, 둘 다 "x + 5"로 계산됩니다.그러나 유형 이론은 "정체성 유형" 또는 "제안적 평등"으로 알려진 다른 형태의 평등을 필요로 합니다.

ID 유형이 필요한 이유는 일부 동일한 항이 동일한 항으로 계산되지 않기 때문입니다."x : nat"을 가정하면 "x + 1"과 "1 + x"라는 용어는 같은 항으로 계산되지 않습니다."+"는 "추가" 함수의 표기법이며, "R" 함수의 표기법입니다.「x」의 값이 지정될 때까지 「R」로 계산할 수 없습니다.이 값이 지정될 때까지, 「R」에 대한 2개의 다른 콜은 같은 용어로 계산되지 않습니다.

동일 유형에는 동일한 유형의 두 개의 용어 "a"와 "b"가 필요하며 "a = b"로 표기됩니다.따라서 "x + 1" 및 "1 + x"의 경우 유형은 "x+1 = 1+x"가 됩니다.표준 항은 생성자 "반사성"을 사용하여 생성됩니다.호출 "a"는 "a"라는 용어를 사용하며 "a = a" 유형의 표준 용어를 반환합니다.

아이덴티티 타입을 사용한 연산은 엘리미네이터 함수 "J"를 사용하여 이루어집니다.함수 "J"는 "a", "b" 및 유형 "a = b"의 항에 의존하는 항을 "b"가 "a"로 대체되도록 다시 쓸 수 있도록 한다."J"는 "b"를 "a"로 대체할 수 있는 한 방향이지만, 동일 유형은 반사적이고 대칭적이며 전이적이라는 것을 증명할 수 있다.

표준 항이 항상 "a=a"이고 "x+1"이 "1+x"와 같은 항으로 계산되지 않는다면, 어떻게 "x+1 = 1+x"의 항을 만들 수 있을까요?우리는 "R" 함수를 사용합니다.(위의 '내추럴 넘버'를 참조해 주세요."R" 함수의 인수 "P"는 "(x:nat . x+1 = 1+x)로 정의됩니다.다른 인수는 유도 증명의 일부와 같이 작용하며, 여기서 "PZ : P 0"은 베이스 케이스 "0+1 = 1+0"이 되고 "PS : P n {\to } P (S n)"는 유도 증명이 됩니다.기본적으로, 이것은 "x+1 = 1+x"가 "x"를 표준값으로 치환했을 때, 식은 "x+1"과 동일할 것이라고 말한다.이 함수 "R"의 적용 유형은 "x : nat {\