기권
요청 한대로 이것은 매우 비공식적입니다.
문법
의존적으로 유형이 지정된 언어에서는 값 수준뿐만 아니라 유형 수준에도 바인더가 있습니다.
Term = * | (∀ (Var : Term). Term) | (Term Term) | (λ Var. Term) | Var
잘 입력 기간이 부착 된 유형의 용어입니다, 우리가 쓸 것 t ∈ σ또는
σ
t
항 t에 유형이 있음을 나타냅니다 σ.
타이핑 규칙
단순하게하기 위해 우리의 그 요구 λ v. t ∈ ∀ (v : σ). τ를 모두 λ하고 ∀(바인드 같은 변수 v이 경우에는).
규칙 :
t ∈ σ is well-formed if σ ∈ * and t is in normal form (0)
* ∈ * (1)
∀ (v : σ). τ ∈ * -: σ ∈ *, τ ∈ * (2)
λ v. t ∈ ∀ (v : σ). τ -: t ∈ τ (3)
f x ∈ SUBS(τ, v, x) -: f ∈ ∀ (v : σ). τ, x ∈ σ (4)
v ∈ σ -: v was introduced by ∀ (v : σ). τ (5)
따라서, *"모든 타입의 타입"(1)이며, ∀타입 2, 람다로부터 추상화 형태 유형 PI-유형 (3)를 가지고있는 경우 v에 의해 도입 ∀ (v : σ). τ후, v형태 갖는다 σ(도 5 참조).
"정상적인 형태"는 축소 규칙을 사용하여 가능한 한 많은 축소를 수행함을 의미합니다.
"감소 규칙"
(λ v. b ∈ ∀ (v : σ). τ) (t ∈ σ) ~> SUBS(b, v, t) ∈ SUBS(τ, v, t)
where `SUBS` replaces all occurrences of `v`
by `t` in `τ` and `b`, avoiding name capture.
또는 2 차원 구문에서
σ
t
의미 t ∈ σ:
(∀ (v : σ). τ) σ SUBS(τ, v, t)
~>
(λ v . b) t SUBS(b, v, t)
항이 관련된 모든 수량 자에있는 변수와 유형이 같은 경우에만 항에 람다 추상화를 적용 할 수 있습니다. 그런 다음 순수한 람다 미적분학에서와 같은 방식으로 람다 추상화와 전체 정량자를 모두 줄입니다. 값 수준 부분을 빼면 (4) 입력 규칙을 얻습니다.
예
함수 응용 연산자는 다음과 같습니다.
∀ (A : *) (B : A -> *) (f : ∀ (y : A). B y) (x : A). B x
λ A B f x . f x
(우리는 축약 ∀ (x : σ). τ에 σ -> τ경우 τ언급하지 않습니다 x)
fB y제공된 모든 y유형에 대해 반환 합니다 A. 우리는 적용 f에 x적합한 유형 인 A및 대체 y에 대한 x에서 ∀후 .따라서 f x ∈ SUBS(B y, y, x)~> f x ∈ B x.
이제 함수 응용 프로그램 연산자를 약어로 사용 app하여 자체에 적용 해 보겠습니다 .
∀ (A : *) (B : A -> *). ?
λ A B . app ? ? (app A B)
?우리가 제공해야 할 용어를 배치 합니다. 먼저 우리는 명시 적으로 소개하고 인스턴스화 A및 B:
∀ (f : ∀ (y : A). B y) (x : A). B x
app A B
이제 우리는 우리가 가진 것을 통합해야합니다
∀ (f : ∀ (y : A). B y) (x : A). B x
이것은 같은
(∀ (y : A). B y) -> ∀ (x : A). B x
무엇을 app ? ?받는가
∀ (x : A'). B' x
결과
A' ~ ∀ (y : A). B y
B' ~ λ _. ∀ (x : A). B x -- B' ignores its argument
( 우선 순위 란 무엇입니까? 참조 )
우리의 표현은 (일부 이름을 바꾼 후)
∀ (A : *) (B : A -> *). ?
λ A B . app (∀ (x : A). B x) (λ _. ∀ (x : A). B x) (app A B)
어떤 사람에 대한 A, B및 f(여기서 f ∈ ∀ (y : A). B y)
∀ (y : A). B y
app A B f
우리는 인스턴스화 A하고 B얻을 수 있습니다 ( f적절한 유형의 모든 것에 대해 )
∀ (y : ∀ (x : A). B x). ∀ (x : A). B x
app (∀ (x : A). B x) (λ _. ∀ (x : A). B x) f
형식 서명은와 같습니다 (∀ (x : A). B x) -> ∀ (x : A). B x.
전체 표현은
∀ (A : *) (B : A -> *). (∀ (x : A). B x) -> ∀ (x : A). B x
λ A B . app (∀ (x : A). B x) (λ _. ∀ (x : A). B x) (app A B)
즉
∀ (A : *) (B : A -> *) (f : ∀ (x : A). B x) (x : A). B x
λ A B f x .
app (∀ (x : A). B x) (λ _. ∀ (x : A). B x) (app A B) f x
가치 수준에서 모든 감소 후에도 같은 결과를 가져 app옵니다.
그것을 얻기 위해 순수 람다 계산법에 몇 가지 단계가 필요합니다 그래서 상태 app에서 app app형식화 된 환경에서, 우리는 통일에 대해 신경 쓸 필요가 사물이 심지어 일부 일치하지 않게 편의 (더 복잡하게 (그리고 특히이 의존적으로 입력) * ∈ *).
타입 검사
- 경우
t이며 *다음 t ∈ *(1)
- 경우
t이다 ∀ (x : σ) τ, σ ∈? *, τ ∈? *(대한 참고 사항을 참조하십시오 ∈?아래를) 다음 t ∈ *(2)에 의해
- 경우가
t있습니다 f x, f ∈ ∀ (v : σ) τ일부 σ하고 τ, x ∈? σ다음 t ∈ SUBS(τ, v, x)으로 (4)
- 경우
t변수이고 v, v도입 된 ∀ (v : σ). τ다음 t ∈ σ으로 (5)
이것들은 모두 추론 규칙이지만 람다에 대해서도 똑같이 할 수는 없습니다 (종속 유추는 종속 유형에 대해 결정할 수 없습니다). 따라서 람다의 t ∈? σ경우 유추하기보다는 ( )를 확인합니다 .
- 경우
t입니다 λ v. b및에 대해 검사 ∀ (v : σ) τ, b ∈? τ다음t ∈ ∀ (v : σ) τ
t다른 것이 있고 확인 된 경우 위의 기능 σ을 t사용하는 유형을 추론하고 그것이 아닌지 확인하십시오σ
유형 검사 평등 그렇게 여부를 결정하기 위해, 정상적인 형태로 할 것을 요구 t입력이 σ우리에게 먼저 확인 σ유형이를 *. 그렇다면 σ정규화 가능 (modulo Girard의 역설)되고 정규화됩니다 (따라서 σ(0)으로 구성됩니다). SUBS또한 식을 정규화하여 (0)을 유지합니다.
이를 양방향 유형 확인이라고합니다. 그것으로 우리는 유형 모든 람다 주석을 달 필요가 없습니다에 경우 f x의 유형 f알려져 있으며, 다음 x인수의 유형에 대해 확인 f하는 대신 유추하고 (도 덜 효율적이다) 지 어떤지를 비교되는 받는다. 그러나 f람다 인 경우 명시 적 유형 주석이 필요합니다 (문법은 문법 및 모든 곳에서 생략되어 생성자를 추가 Ann Term Term하거나 추가 할 수 있음 λ' (σ : Term) (v : Var)).
또한 더 간단하고 쉬워 졌습니다 ! 블로그 게시물.