Hindley-Milner 알고리즘이 t1-> t2와 같은 유형을 생성하지 않는 이유는 무엇입니까?


14

나는 약 읽고 있어요 힌들리 - 밀너 입력 알고리즘 구현을 작성하고, 그 볼 동안, 당신은 항상 같은 인수가 최종 형태를 결정하는 하나의 원자 유형 또는 유형, 얻을 것이다 긴 모든 변수가 바인딩되는만큼, t1 -> t1또는 (t1 -> t2) -> (t1 -> t2)어디서 t1그리고 t2유형 변수입니다.

나는 당신이 t1 -> t2또는 간단하게 무언가를 얻는 방법을 생각할 수 없습니다 t1. 실제로 표현의 유형을 결정할 방법이 없기 때문에 알고리즘이 깨 졌음을 의미합니다. 모든 변수가 바인딩되어있는 한 이러한 "파손 된"유형과 같은 유형을 절대 얻지 못한다는 것을 어떻게 알 수 있습니까?

알고리즘에서 변수가있는 유형을 생성한다는 것을 알고 있지만 인수를 함수에 전달하면 항상 해결 t1 -> t2됩니다. 이 유형의 함수에는 해당되지 않습니다 . 그렇기 때문에 알고리즘이 그러한 유형을 생성하지 않는지 어떻게 알고 있는지 알고 싶습니다.

(이 보인다 는 ML에서 이러한 "깨진"유형을 얻을 수 있습니다 ,하지만 난 람다 계산법에 대해 부탁 해요.)

답변:


16

α,β.αβα.ααλ엑스.엑스

α,β.αββββββ

Δ=λx.xx(α.α)(α.α)ΔΔ

A,B,ABα,β.αβ

YY(λx.x)α.αA,B,AB

강력한 정규화를 보장하는 유형 시스템과 유형 시스템 사이에서 미세한 선을 찾는 것은 어렵고 흥미로운 문제입니다. 어떤 논리가 바람직한 지, 즉 어떤 프로그램이 정리의 증거를 구현 하는지를 결정하기 때문에 중요한 문제입니다. 시스템 F보다 훨씬 더 나아갈 수 있지만 규칙이 더 복잡해집니다. 예를 들어, Coq proof assistant 의 기반이되는 유도 구조미적분학 은 강력하게 정규화되었지만 공통 유도 데이터 구조 및 알고리즘 등을 설명 할 수 있습니다.

실제 프로그래밍 언어에 도달하자마자 통신이 고장납니다. 실제 프로그래밍 언어에는 일반 재귀 함수 (종료되지 않을 수 있음), 예외 (항상 예외를 발생시키는 식은 값을 반환하지 않으므로 대부분의 유형 시스템에서 모든 유형을 가질 수 있음), 재귀 유형 (비 종료를 허용하는)과 같은 기능이 있습니다. 등)


"시스템 F가 강력하게 정상화되고 있다는 사실의 결과입니다." HM이 강력하게 정규화되고 있다는 것을 어떻게 나타낼 수 있습니까? 시스템 F가 강력하게 정규화 한 결과입니까?
Rafael Castro

1
@RafaelCastro HM에서 잘 입력 된 모든 용어는 시스템 F에서 잘 입력됩니다. 시스템 F에서 잘 입력 된 모든 용어는 SN입니다. 따라서 HM에 잘 입력 된 모든 용어는 SN입니다.
Gilles 'SO- 악마 그만해'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.