Hindley-Milner 규칙을 어떻게 이해합니까?
Hindley-Milner는 일련의 미적분학 (자연적인 추론이 아님) 형태의 규칙 집합 으로, 명시 적 형식 선언없이 프로그램의 구성에서 (가장 일반적인) 형식의 프로그램을 추론 할 수 있음을 보여줍니다.
기호와 표기법
먼저 기호를 설명하고 연산자 우선 순위에 대해 설명하겠습니다.
- 𝑥 는 식별자 ( 공식적 으로 변수 이름)입니다.
- : means는 (비공식적으로, 인스턴스 또는 "is-a") 유형입니다.
- 𝜎 (시그마)는 변수 또는 함수 인 표현식입니다.
- 따라서 𝑥 : 𝜎 는 " 𝑥 is-a 𝜎 "
- ∈는 "의 요소"를 의미
- Ga (감마)는 환경입니다.
- ⊦ (어설 션 부호)는 어설 션을 의미 합니다 (또는 증명하지만 상황에 따라 "어설 션"이 더 잘 읽습니다).
- 𝚪 ⊦ 𝑥 : 𝜎 따라서 "𝚪는 𝑥, is-a 𝜎 "
- 𝑒 는 𝜎 유형의 실제 인스턴스 (요소)입니다 .
- 𝜏 (tau)는 기본, 변수 ( 𝛼 ), 기능적 𝜏 → 𝜏 ' 또는 제품 𝜏 × 𝜏' (여기서는 사용되지 않음)의 유형입니다.
- 𝜏 → 𝜏 ' 는 𝜏 와 𝜏' 이 다른 유형일 수 있는 기능 유형입니다.
𝜆𝑥.𝑒 은 𝜆 (람다)가 인수 𝑥 를 취하고 표현식 𝑒을 리턴하는 익명 함수임을 의미 합니다.
하자 𝑥 = 𝑒₀ 에서 𝑒₁ 표현의 수단 𝑒₁ , 대체 𝑒₀ 곳이 𝑥 나타납니다.
⊑ 는 이전 요소가 후자 요소의 하위 유형 (비공식-하위 클래스) 임을 의미합니다.
- 𝛼 는 유형 변수입니다.
- ∀ 𝛼.𝜎 는 유형, ∀ (모두에 대한) 인수 변수 𝛼 , 𝜎 표현식 반환
- ∉ free (𝚪) 는 외부 문맥에서 정의 된 𝚪의 자유 유형 변수의 요소가 아님을 의미합니다. 바운드 변수는 대체 가능합니다.
선 위의 모든 것이 전제이며 아래의 모든 것이 결론입니다 ( Per Martin-Löf )
우선 순위
규칙에서 더 복잡한 예제를 가져 와서 우선 순위를 나타내는 중복 괄호를 삽입했습니다.
- 𝑥 : 𝜎 ∈ 𝚪를 쓸 수 있음 (𝑥 : 𝜎) ∈ 𝚪
𝚪 ⊦ 𝑥 : 𝜎 쓸 수 있음 𝚪 ⊦ ( 𝑥 : 𝜎 )
Γ는 ⊦ 하자 𝑥 = 𝑒₀ 에서 𝑒₁ : τ는
((⊦ 동등 Γ이다 하자 ( 𝑥 = 𝑒₀ ) 에서 𝑒₁ ) : τ )
𝚪 ⊦ 𝜆𝑥.𝑒 : 𝜏 → 𝜏 ' 는 𝚪 ⊦ (( 𝜆𝑥.𝑒 ) : ( 𝜏 → 𝜏' ))
그런 다음 어설 션 문과 다른 전제 조건을 구분하는 큰 공간은 이러한 전제 조건 집합을 나타내며, 결론에서 전제를 분리하는 수평선은 우선 순위의 끝을 가져옵니다.
규칙
다음은 규칙에 대한 영어 해석과 느슨한 설명 및 설명입니다.
변하기 쉬운
𝑥가 𝜎 (감마)의 한 요소 인 𝜎 (시그마)의 유형이라고 가정하면,
𝚪는 𝑥가 𝜎이라고 주장한다.
다시 말해서, 𝚪에서 type는 𝜎 유형이 𝜎이므로 𝑥 유형은 𝜎 유형이라는 것을 알고 있습니다.
이것은 기본적으로 팽팽한 기술입니다. 식별자 이름은 변수 또는 함수입니다.
기능 적용
주어진 𝚪 주장 𝑒₀은 기능적 유형이고 𝚪 주장 𝑒₁는 𝜏
결론 𝚪 기능 적용을 주장하는 주장 𝑒₁에 𝑒₁는 유형 𝜏 '
규칙을 다시 말하면 함수 응용 프로그램에 𝜏 → 𝜏 '유형이 있고 𝜏 유형의 인수를 가져 오기 때문에 함수 응용 프로그램이 𝜏'유형을 반환한다는 것을 알고 있습니다.
즉, 함수가 형식을 반환한다는 것을 알고 인수에 적용하면 결과가 반환하는 형식의 인스턴스가됩니다.
함수 추상화
𝜏 유형의 𝚪 및 𝑥이 𝑒이라고 가정하면 𝑒는 유형이며, 𝜏 '
𝚪는 익명 함수, 𝑥 리턴 식의 𝜆는 𝜆, 𝑒 → 𝜏'유형입니다.
다시, takes를 취하고 takes 표현식을 반환하는 함수를 볼 때 when (a 𝜏)가 𝑒가 𝜏 '라고 주장하기 때문에 𝜏 → 𝜏'유형임을 알 수 있습니다.
𝑥가 𝜏 유형이고 따라서 𝑒 표현식이 𝜏 '유형이라는 것을 알고 있다면, 𝑥 표현식 𝑒을 반환하는 𝑥의 함수는 𝜏 → 𝜏'유형입니다.
변수 선언하자
감안 Γ는 σ의 유형, 𝑒₀를 어서, 및 타입의 σ와 Γ 𝑥, 어서 τ 형 𝑒₁
Γ 결론은 어서 let
𝑥 = 𝑒₀ in
𝑒₁ 형 τ의
𝑒₀는 𝜎이므로 𝑥는 𝑒₁ (a 𝜏)에서 𝑒₀에 바인딩되고 𝑥는 𝑒₁를 𝜏라고 주장하는 𝜎입니다.
즉, 𝑒₀ (변수 또는 함수 인) 표현식 and과 이름 𝑥, 𝜎 및 𝜏 유형의 표현식 name이있는 경우 inside 대신 𝑒₀을 can로 대체 할 수 있습니다. 𝑒₁.
인스턴스화
𝚪 유형의 𝚪 주장 𝑒 '및 𝜎'은 𝜎의 하위 유형이며
𝚪 주장 𝑒 유형은 𝜎
표현식 𝑒는 하위 유형 sub '이고 𝜎는 𝜎'의 상위 유형이므로 표현식 parent는 상위 유형 𝜎입니다.
인스턴스가 다른 유형의 하위 유형 인 유형 인 경우 더 일반적인 유형 인 해당 수퍼 유형의 인스턴스이기도합니다.
일반화
𝚪 주장은 𝑒가 𝜎 이고 𝛼는 𝚪의 자유 변수의 요소가 아니며,
𝚪 주장은 argument, 모든 인수 표현식의 유형 𝛼 𝜎 표현식을 반환합니다.
따라서 𝑒는 𝜎이고 𝛼은 자유 변수가 아니기 때문에 일반적으로 𝜎는 𝜎을 반환하는 모든 인수 변수 (𝜎)에 대해 𝜎로 입력됩니다.
즉, 포함 범위에 아직 바인딩되지 않은 인수 (로컬이 아닌 변수)에 대해 모든 유형을 허용하도록 프로그램을 일반화 할 수 있습니다. 이러한 바운드 변수는 대체 가능합니다.
함께 모아서
특정 가정 (예 : 자유 / 정의되지 않은 변수, 알려진 환경)이있을 경우 다음 유형을 알고 있습니다.
- 프로그램의 원자 요소 (가변)
- 함수가 반환 한 값 (함수 응용 프로그램)
- 기능적 구성 (함수 추상화)
- 바인딩 (변수 선언),
- 부모 유형의 인스턴스 (인스턴스화)
- 모든 표현 (일반화).
결론
이러한 규칙을 결합하면 형식 주석 없이도 가장 일반적인 형태의 주장 된 프로그램을 증명할 수 있습니다.