종속형
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) 용어 | 아니요. | 아니요. | ? | ? |
- ^ 이는 핵심 언어를 의미하며, 어떤 전술(테마 증명 절차)이나 코드 생성 하위 언어를 의미하지 않습니다.
- ^ 우주 제약과 같은 의미적 제약이 따릅니다.
- ^ Static_Predicate는 제한된 용어의 경우, Dynamic_Predicate는 유형 캐스트의 모든 용어의 아사트 유사 체크를 수행합니다.
- ^ 링[8] 솔버
- ^ 선택적 우주, 선택적 우주 다형성 및 명시적으로 지정된 우주
- ^ 우주, 자동으로 추론되는 우주 제약 조건(Agda의 우주 다형성과 동일하지 않음) 및 우주 제약 조건의 명시적 인쇄(옵션)
- ^ ATS로 대체되었습니다.
- ^ Last Sage 페이퍼와 마지막 코드 스냅샷은 모두 2006년 날짜로 되어 있습니다.
「 」를 참조해 주세요.
레퍼런스
- ^ Sørensen, Morten Heine B.; Urzyczyn, Pawel (1998), Lectures on the Curry-Howard Isomorphism, CiteSeerX 10.1.1.17.7385
- ^ Bove, Ana; Dybjer, Peter (2008), Dependent Types at Work (PDF), Chalmers University of Technology
- ^ a b "ΠΣ: Dependent Types without the Sugar" (PDF).
- ^ "GNAT Community download page".
- ^ "§3.2.4 Subtype Predicates". Ada Reference Manual (2012 ed.).
- ^ SPARK는 Ada의 프로비저닝 가능한 서브셋입니다.
- ^ "Agda download page".
- ^ "Agda Ring Solver".
- ^ a b "Announce: Agda 2.2.8". Archived from the original on 2011-07-18. Retrieved 2010-09-28.
- ^ "Agda 2.6.0 changelog".
- ^ "ATS2 downloads".
- ^ "email from ATS inventor Hongwei Xi".
- ^ Xi, Hongwei (March 2017). "Applied Type System: An Approach to Practical Programming with Theorem-Proving" (PDF). arXiv:1703.08683.
- ^ "Coq CHANGES in Subversion repository".
- ^ "Introduction of SProp in Coq 8.10".
- ^ "F* changes on GitHub". GitHub.
- ^ "F* v0.9.5.0 release notes on GitHub". GitHub.
- ^ "Guru SVN".
- ^ 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.
- ^ Petcher, Adam (May 2008). Deciding Joinability Modulo Ground Equations in Operational Type Theory (PDF) (MSc). Washington University. Retrieved 14 October 2010.
- ^ "Idris git repository". GitHub. 17 May 2022.
- ^ Brady, Edwin. "Idris, a language with dependent types — extended abstract" (PDF). CiteSeerX 10.1.1.150.9442.
- ^ a b Brady, Edwin. "How does Idris compare to other dependently-typed programming languages?".
- ^ "Matita SVN". Archived from the original on 2006-05-08. Retrieved 2010-09-29.
추가 정보
- Martin-Löf, Per (1984). Intuitionistic Type Theory (PDF). Bibliopolis.
- Nordström, Bengt; Petersson, Kent; Smith, Jan M. (1990). Programming in Martin-Löf's Type Theory: An Introduction. Oxford University Press. ISBN 9780198538141.
- Barendregt, H. (1992). "Lambda calculi with types". In Abramsky, S.; Gabbay, D.; Maibaum, T. (eds.). Handbook of Logic in Computer Science. Oxford Science Publications.
- McBride, Conor; McKinna, James (January 2004). "The view from the left". Journal of Functional Programming. 14 (1): 69–111. doi:10.1017/s0956796803004829. S2CID 6232997.
- Altenkirch, Thorsten; McBride, Conor; McKinna, James (2006). "Why dependent types matter" (PDF). Proceedings of the 33rd ACM SIGPLAN-SIGACT Symposium on Principles of Programming Languages, POPL 2006, Charleston, South Carolina, USA, January 11-13. ISBN 1-59593-027-2.
- Norell, Ulf (September 2007). Towards a practical programming language based on dependent type theory (PDF) (PhD). Göteborg, Sweden: Department of Computer Science and Engineering, Chalmers University of Technology. ISBN 978-91-7291-996-9.
- Oury, Nicolas; Swierstra, Wouter (2008). "The Power of Pi" (PDF). ICFP '08: Proceedings of the 13th ACM SIGPLAN international conference on Functional programming. pp. 39–50. doi:10.1145/1411204.1411213. ISBN 9781595939197. S2CID 16176901.
- Norell, Ulf (2009). "Dependently Typed Programming in Agda" (PDF). In Koopman, P.; Plasmeijer, R.; Swierstra, D. (eds.). Advanced Functional Programming. AFP 2008. Lecture Notes in Computer Science. Vol. 5832. Springer. pp. 230–266. doi:10.1007/978-3-642-04652-0_5. ISBN 978-3-642-04651-3.
- Sitnikovski, Boro (2018). Gentle Introduction to Dependent Types with Idris. Lean Publishing. ISBN 978-1723139413.
- McBride, Conor; Nordvall-Forsberg, Fredrik (2022). "Type systems for programs respecting dimensions" (PDF). Advanced Mathematical and Computational Tools in Metrology and Testing XII. Advances in Mathematics for Applied Sciences. World Scientific. pp. 331–345. doi:10.1142/9789811242380_0020. ISBN 9789811242380. S2CID 243831207.