기권
요청 한대로 이것은 매우 비공식적입니다.
문법
의존적으로 유형이 지정된 언어에서는 값 수준뿐만 아니라 유형 수준에도 바인더가 있습니다.
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
)
f
B 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)
).
또한 더 간단하고 쉬워 졌습니다 ! 블로그 게시물.