답변:
선형 경계 오토마타가 C ++ 프로그램인지 여부를 확인하는 것은 불가능하며 LBA가 SML 프로그램의 유형이 올바른지 여부를 확인하는 것은 불가능합니다. C ++에는 임의의 프로그램을 템플릿 메타 프로그램으로 코딩 할 수 있으므로 Turing-complete 유형 시스템이 있습니다.
SML이 더 흥미 롭습니다. 결정 가능한 유형 검사가 있지만 문제는 EXPTIME 완료입니다. 따라서 복잡성 계층 구조에서 매우 놀라운 붕괴가 없다면 LBA가이를 확인하지는 못할 것입니다. 그 이유는 SML에 형식 유추가 필요하고 유형이 프로그램의 크기보다 훨씬 빠르게 증가하는 프로그램 계열이 있기 때문입니다. 예를 들어 다음 프로그램을 고려하십시오.
fun delta x = (x, x) (* this has type 'a -> ('a * 'a), so its return value
has a type double the size of its argument *)
fun f1 x = delta (delta x) (* Now we use functions to iterate this process *)
fun f2 x = f1 (f1 x)
fun f3 x = f2 (f2 x) (* This function has a HUGE type *)
C 또는 Pascal과 같은 더 간단한 유형의 시스템의 경우 LBA가이를 확인할 수 있다고 생각합니다.
프로그래밍 언어 연구 초기에 사람들은 종종 van Wingaarden 문법 (일명 2 단계 문법)을 사용하여 프로그래밍 언어의 유형 시스템을 지정했습니다. Algol 68이 이런 식으로 지정되었다고 생각합니다. 그러나 나는이 기법이 실질적으로 실용적인 이유로 포기되었다고 들었습니다. (일반적으로 사람들이 쓴 문법은 의도 한 것보다 더 큰 언어를 생성했습니다.)
요즘 사람들은 개략적 인 추론 규칙을 사용하여 유형 시스템을 지정합니다. 이는 기본적으로 술어를 Horn 절 컬렉션의 최소 고정 소수점으로 지정하는 방법입니다. 1 차 혼 이론에 대한 만족도는 일반적으로 결정하기 어렵 기 때문에, 유형 이론가들이하는 모든 것을 포착하고자한다면, 선택한 문법 형식이 실제로 편리한 것보다 강할 것입니다.
속성 문법 을 사용하여 유형 시스템을 구현 하는 작업 이 있다는 것을 알고 있습니다. 그들은이 선택에 대한 몇 가지 소프트웨어 엔지니어링 이점이 있다고 주장합니다. 즉, 속성 문법은 정보 흐름을 매우 엄격하게 제어하므로 프로그램 이해가 쉬워집니다.
내가 아는 한 흥미로운 경우에는 유형 정확성이 결정하기 어려운 경향이 있으므로 공식 문법은 생각할 수있는 모든 유형 시스템을 포착 할 수 없습니다.
나는 주요 컴파일러 발전기는 술어가되지 않는 경우 실행되는 규칙을 방지 규칙에 대한 임의의 술어가 평가 할 수 있음을 알고 true
예를 들어,
{ type(e1) == type(e2) } (expression e1) '+' (expression e2)
. 이 개념은 쉽게 공식화 될 수 있습니다. 허용 된 술어에 대한 적절한 제한은 LBA에 의한 결정 가능성을 산출 할 수 있습니다.