종속형

Dependent type

컴퓨터 공학 및 논리학에서 종속 유형은 정의에 값이 의존하는 유형입니다.그것은 유형 이론과 유형 시스템의 중복된 특징이다.직관적 유형 이론에서, 의존적인 유형은 "모두"와 "존재"와 같은 논리의 수량화자를 인코딩하는 데 사용된다.Agda, ATS, Coq, F*, Epigram 및 Idris와 같은 기능 프로그래밍 언어에서 종속 유형은 프로그래머가 가능한 구현 세트를 더욱 제한하는 유형을 할당할 수 있도록 함으로써 버그를 줄이는 데 도움이 됩니다.

종속 유형의 두 가지 일반적인 예는 종속 함수와 종속 쌍입니다.종속 함수의 반환 유형은 해당 인수 중 하나의 값(유형뿐 아니라)에 따라 달라질 수 있습니다.예를 들어, 정의 n{n}을 사용하는 함수는 n n의 배열을 반환할 수 있습니다.여기서 배열 길이는 배열 유형의 일부입니다.(이는 타입을 인수로 포함하는 다형성 및 범용 프로그래밍과는 다릅니다).종속 쌍은 유형이 첫 번째 값에 따라 달라지는 두 번째 값을 가질 수 있습니다.어레이의 예에 따라 종속쌍을 사용하여 어레이의 길이와 조합하여 타입 세이프하게 사용할 수 있습니다.

종속 유형은 유형 시스템에 복잡성을 가중시킵니다.프로그램에서 종속 유형의 동일성을 결정하기 위해서는 계산이 필요할 수 있습니다.종속형에서 임의의 값이 허용될 경우, 두 개의 임의 프로그램이 동일한 결과를 생성하는지 여부를 결정하는 것이 포함될 수 있습니다. 따라서 유형 검사를 결정할 수 없게 될 수 있습니다.

역사

1934년, 하스켈 커리는 람다 미적분과 그것의 조합 논리학에서 사용되는 유형들이 명제 논리학의 공리와 같은 패턴을 따른다는 것을 알아냈다.더 나아가 로직의 모든 증명에 대해 프로그래밍 언어에는 일치하는 함수(용어)가 있었습니다.Curry의 예 중 하나는 단순 유형화된 람다 미적분과 직관적 [1]논리 사이의 대응관계였다.

술어 로직은 명제 로직의 확장으로, 수식어를 추가합니다.Howard와 de Bruijn은 "모두"에 해당하는 종속 함수와 "존재"[2]에 해당하는 종속 쌍에 대한 유형을 생성함으로써 이 보다 강력한 논리와 일치하도록 람다 미적분을 확장했다.

(하워드의 작품과 다른 작품들 때문에, 유형화된 명제는 Curry-Howard 대응으로 알려져 있습니다.)

형식적 정의

π형

대략적으로 말하면, 종속 유형은 색인화된 집합 집합의 유형과 유사합니다.좀 더 형식적으로 의 우주에서 A이 주어진 경우 (\ B A )의 패밀리를 가질 수 있습니다. 에 A a a B () : \ B ( ) :{\ 유형()a은 a에 따라 다르다고 합니다

반환값의 유형이 인수에 따라 변화하는 함수(즉, 고정 코드메인이 없음)는 종속 함수이며, 이 함수의 유형을 종속 제품 유형, pi-type(δ타입) 또는 [3]종속 함수 유형이라고 한다.B의 패밀리: {\ B{{까지 종속 함수 유형 : B(x ) \ \ : A ( x )。이러한 함수는 : \ a :에서 용어를 a로 반환합니다.이 예에서는 종속 함수 유형은 일반적으로 : B (x "style \x : (x )", "\ \ x : : (x : A )" 또는 "B (x )로 기술됩니다

A {\ B 는 상수 함수이며, 대응하는 종속 제품 유형은 일반 함수 유형과 동일합니다., x : B\ \ _ :x에 의존하지 않는 경우 A}B는 A A\B)와 판별적으로 .

'π-type'이라는 이름은 이들을 데카르트 형식의 곱으로 볼 수 있다는 생각에서 유래했다.δ타입은 범용양자모델로도 이해할 수 있다.

예를 들어 실수의 n배수에 대해 Vec( ,n ) \ \ {} ( \ , n )라고 : N ( ,) \ \ _ : \ : n } } \ Vec } ( n } ( \ )라고 입력합니다.f 사이즈 n.통상적인 함수 공간은 범위 유형이 실제로 입력에 의존하지 않는 특수한 경우에 발생합니다.예:n : R{\은 자연수에서 실수까지의 함수의 종류이며, 유형 람다 미적분에서는 N \ \로 표기된다.

좀 더 구체적인 예로서, A를 0 ~ 255(8비트 또는 1바이트에 맞는 정수)의 a패밀리와 () =로 하면,x : () \ _의 곱으로 나누어집니다. ××정확하게는X255 0에서 255까지의 정수의 유한 집합이 결국 방금 언급한 한계에서 정지하여 종속 함수의 유한한 공역(codomain)을 생성하기 때문이다.

σ형

종속 제품 유형의 이중은 종속 쌍 유형, 종속 총합 유형, 시그마 유형 또는 (혼란하게) 종속 제품 [3]유형입니다.시그마 타입은 실존적 수량화라고도 할 수 있습니다.위의 예에서는 유형(\에 A(\ A와 B Bdisplaystyle B:) 패밀리가 존재하는 경우 다음과 같이 설명합니다.에 종속 쌍 유형: ( _가 있습니다.(대체 표기법은 )타입과 유사합니다.)

종속 쌍 유형은 두 번째 항의 유형이 첫 번째 항의 값에 따라 달라지는 순서 쌍의 개념을 캡처합니다.( ,) :x : B (), \ , ) : \ _ { :} )인 경우 : \ a : B : ( BB가 상수 함수인 경우 종속 쌍 유형은 제품 유형, 즉 일반 데카르트 A × A B[full citation needed]가 됩니다.

좀 더 구체적인 예로, A를 다시 부호 없는 정수 패밀리와 같게 a하고 ()를 다시 256으로 하면, : (x ) \ _는 + + ...의 합으로 분할됩니다. + + +는 종속 함수의 코드메인에 발생한 것과 같은 이유로 사용됩니다.

실존 수량화 예

({\ A {U를 유형으로 하고 B{\ Curry-Howard 대응에 의해 B는 A의 관점에서 논리 술어로 해석될 수 있다. a a 유형()a이 거주하는지 여부는 가 이 술어를 충족하는지 여부를 나타냅니다.대응관계를 실존적 수량화 및 의존적 쌍으로 확장할 수 있습니다.명제 () \ {a} { \ , (a) {가 거주한다.

예를 들어 m: N m은는) + =와 같은 다른 k : {\ k이(가) 존재하는 경우에만 n: { n{N} 보다 작거나 .

이 제안은 종속 쌍 유형에 해당합니다.

즉, m이 n보다 작거나 같다는 문장의 증명은 m과 n의 차이인 음수가 아닌 숫자 k와 등식 + =의 증명을 모두 포함하는 쌍이다.

람다 입방체의 시스템

Henk Barendregt는 세 축을 따라 유형 시스템을 분류하는 수단으로 람다 큐브를 개발했습니다.결과적으로 만들어진 입방체 모양의 다이어그램의 8개 모서리는 각각 가장 표현력이 적은 모서리에 단순하게 타이핑된 람다 미적분, 그리고 가장 표현력이 높은 구성 미적분인 유형 체계에 대응합니다.입방체의 세 축은 단순 유형 람다 미적분의 세 가지 서로 다른 증대에 대응합니다. 즉, 종속 유형의 추가, 다형성의 추가 및 상위 종류의 유형 생성자(예: 유형에서 유형으로 함수)의 추가입니다.람다 입방체는 순수 유형 시스템에 의해 더욱 일반화됩니다.

일차 의존형 이론

논리 프레임워크 LF에 대응하는 순수 1차 의존형 시스템style \ \Pi는 단순형 람다미적분의 함수 공간 유형을 종속 제품 유형으로 일반화하여 구한다.

2차 의존형 이론

2차 의존형 시스템 { \ \ 는 \ \ 에서 type constructor에 대한 정량화를 허용하여 구한다.이 이론에서 종속 제품 연산자는 단순 유형 람다 미적분의 {\과(와) 시스템 F의 {\displaystyle 바인더를 모두 가정합니다.

고차 의존형 다형 람다 미적분

고차 시스템 {\{\ {\ \ \ \ Omega}는 2 \ style \ \ 2를 람다 큐브에서 4가지 추상화 형태로 확장합니다.이 계는 유도 구문의 미적분이 Coq 증명 보조의 기초 계인 구성 미적분에 해당합니다.

동시 프로그래밍 언어와 논리

Curry-Howard 대응은 임의로 복잡한 수학적 특성을 표현하는 유형을 구성할 수 있다는 것을 의미합니다.사용자가 타입에 거주한다는 건설적인 증거를 제공할 수 있는 경우(즉, 그 타입의 값이 존재하는 경우), 컴파일러는 그 증거를 체크하고 그 값을 계산함으로써 그 값을 실행 가능한 컴퓨터 코드로 변환할 수 있다.교정 검사 기능을 통해 신뢰할 수 있는 입력 언어가 교정 보조 도구와 밀접하게 관련됩니다.코드 생성 측면은 코드가 기계적으로 검증된 수학적 증명에서 직접 파생되기 때문에 정식 프로그램 검증 및 증명 수행 코드에 대한 강력한 접근 방식을 제공합니다.

종속형 언어 비교

언어 적극적으로 개발 패러다임[a] 전술 증명 조건 종료 확인 유형은 다음 항목에[b] 따라 다름 유니버스 관련성이 없는 증명 프로그램 추출 추출은 관련 없는 용어를 지웁니다.
아다 2012 네, 그렇습니다[4]. 필수 네, 그렇습니다[5]. 있음(옵션)[6] ? 임의의[c] 용어 ? ? 아다 ?
아그다 네, 그렇습니다[7]. 순수하게 기능하다 소량[d]/한정 네. 있음(옵션) 임의의 용어 있음(옵션)[e] 증명과[9] 무관한 주장 증명과 무관한 제안[10] Haskell, JavaScript 네, 그렇습니다[9].
ATS 네, 그렇습니다[11]. 기능/필수 아니요[12]. 네. 네. 정적[13] 용어 ? 네. 네. 네.
카이엔 아니요. 순수하게 기능하다 아니요. 네. 아니요. 임의의 용어 아니요. 아니요. ? ?
갈리나
(코크)
네, 그렇습니다[14]. 순수하게 기능하다 네. 네. 네. 임의의 용어 네, 그렇습니다[f]. 네, 그렇습니다[15]. Haskell, Scheme 및 OCaml 네.
종속 ML 아니요[g]. ? ? 네. ? 자연수 ? ? ? ?
F* 네, 그렇습니다[16]. 기능 및 필수 네, 그렇습니다[17]. 네. 있음(옵션) 임의의 순수 용어 네. 네. OCaml, F# 및 C 네.
구루 아니요[18]. 순수하게[19] 기능하다 하이조인[20] 네, 그렇습니다[19]. 네. 임의의 용어 아니요. 네. 카라웨이 네.
이드리스 네, 그렇습니다[21]. 순수하게[22] 기능하다 네, 그렇습니다[23]. 네. 있음(옵션) 임의의 용어 네. 아니요. 네. 네, 공격적으로[23]
희박하다 네. 순수하게 기능하다 네. 네. 네. 임의의 용어 네. 네. 네. 네.
마티타 네, 그렇습니다[24]. 순수하게 기능하다 네. 네. 네. 임의의 용어 네. 네. OCaml 네.
NuPRL 네. 순수하게 기능하다 네. 네. 네. 임의의 용어 네. ? 네. ?
PVS 네. ? 네. ? ? ? ? ? ? ?
세이지 아니요[h]. 순수하게 기능하다 아니요. 아니요. 아니요. ? 아니요. ? ? ?
트웰프 네. 논리 프로그래밍 ? 네. 있음(옵션) 임의의 (LF) 용어 아니요. 아니요. ? ?
  1. ^ 이는 핵심 언어를 의미하며, 어떤 전술(테마 증명 절차)이나 코드 생성 하위 언어를 의미하지 않습니다.
  2. ^ 우주 제약과 같은 의미적 제약이 따릅니다.
  3. ^ Static_Predicate는 제한된 용어의 경우, Dynamic_Predicate는 유형 캐스트의 모든 용어의 아사트 유사 체크를 수행합니다.
  4. ^ 링[8] 솔버
  5. ^ 선택적 우주, 선택적 우주 다형성 및 명시적으로 지정된 우주
  6. ^ 우주, 자동으로 추론되는 우주 제약 조건(Agda의 우주 다형성과 동일하지 않음) 및 우주 제약 조건의 명시적 인쇄(옵션)
  7. ^ ATS로 대체되었습니다.
  8. ^ Last Sage 페이퍼와 마지막 코드 스냅샷은 모두 2006년 날짜로 되어 있습니다.

「 」를 참조해 주세요.

레퍼런스

  1. ^ Sørensen, Morten Heine B.; Urzyczyn, Pawel (1998), Lectures on the Curry-Howard Isomorphism, CiteSeerX 10.1.1.17.7385
  2. ^ Bove, Ana; Dybjer, Peter (2008), Dependent Types at Work (PDF), Chalmers University of Technology
  3. ^ a b "ΠΣ: Dependent Types without the Sugar" (PDF).
  4. ^ "GNAT Community download page".
  5. ^ "§3.2.4 Subtype Predicates". Ada Reference Manual (2012 ed.).
  6. ^ SPARK는 Ada의 프로비저닝 가능한 서브셋입니다.
  7. ^ "Agda download page".
  8. ^ "Agda Ring Solver".
  9. ^ a b "Announce: Agda 2.2.8". Archived from the original on 2011-07-18. Retrieved 2010-09-28.
  10. ^ "Agda 2.6.0 changelog".
  11. ^ "ATS2 downloads".
  12. ^ "email from ATS inventor Hongwei Xi".
  13. ^ Xi, Hongwei (March 2017). "Applied Type System: An Approach to Practical Programming with Theorem-Proving" (PDF). arXiv:1703.08683.
  14. ^ "Coq CHANGES in Subversion repository".
  15. ^ "Introduction of SProp in Coq 8.10".
  16. ^ "F* changes on GitHub". GitHub.
  17. ^ "F* v0.9.5.0 release notes on GitHub". GitHub.
  18. ^ "Guru SVN".
  19. ^ a b Aaron Stump (6 April 2009). "Verified Programming in Guru" (PDF). Archived from the original (PDF) on 29 December 2009. Retrieved 28 September 2010.
  20. ^ Petcher, Adam (May 2008). Deciding Joinability Modulo Ground Equations in Operational Type Theory (PDF) (MSc). Washington University. Retrieved 14 October 2010.
  21. ^ "Idris git repository". GitHub. 17 May 2022.
  22. ^ Brady, Edwin. "Idris, a language with dependent types — extended abstract" (PDF). CiteSeerX 10.1.1.150.9442.
  23. ^ a b Brady, Edwin. "How does Idris compare to other dependently-typed programming languages?".
  24. ^ "Matita SVN". Archived from the original on 2006-05-08. Retrieved 2010-09-29.

추가 정보

외부 링크