종속형

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보다 작거나 같다는 문장의 증명은 mn의 차이인 음수가 아닌 숫자 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.

추가 정보

외부 링크