나는 불멸의 말을 특징으로하는 판매용 티셔츠 가 있다고 맹세합니다 .
어떤 부분
당신은 이해 하지 못 합니까?
제 경우에는 대답은 … 전부일 것입니다!
특히 Haskell 논문에서 이와 같은 표기법을 자주 볼 수 있지만 그 의미가 무엇인지 전혀 알 수 없습니다. 나는 수학의 어느 지점이 될지 모른다.
나는 물론 그리스 알파벳의 글자와 “∉”와 같은 기호를 인식합니다.
다른 한편으로, 나는 전에 “⊢”를 본 적이 없다 ( Wikipedia는 그것이 “파티션”을 의미한다고 주장한다 ). 나는 또한 vinculum의 사용에 익숙하지 않습니다. (일반적으로, 그것은 일부이고,하지만하지 않습니다 나타납니다 여기에 사건을합니다.)
누군가가이 상징의 바다가 무엇을 의미하는지 이해하기 시작하는 곳을 말해 줄 수 있다면 도움이 될 것입니다.
답변
- 수평 막대 “[위의 즉 수단 을 의미한다 [이하]”.
- 이 경우 여러 표현 [위]에서, 그때 그들을 고려 AND로 함께; [아래]를 보장하려면 [위]의 모든 내용이 사실이어야합니다.
:
수단 은 유형이 있습니다∈
의미 는입니다 . (마찬가지로∉
“없음”을 의미합니다.)Γ
일반적으로 환경 이나 상황 을 나타내는 데 사용됩니다 . 이 경우 식별자를 형식과 쌍을 이루는 형식 주석 집합으로 생각할 수 있습니다. 따라서x : σ ∈ Γ
환경에 유형이Γ
있는 사실이 포함됨을 의미합니다 .x
σ
⊢
증명 하거나 결정한 대로 읽을 수 있습니다 .Γ ⊢ x : σ
환경에Γ
따라x
유형이 결정σ
됩니다.,
특정 추가 가정을 환경 에 포함 시키는 방법입니다Γ
.
따라서,Γ, x : τ ⊢ e : τ'
그 환경을 의미Γ
, 추가, 가정하에 무시x
형을 가지고τ
, 그 증명e
타입을 갖는다τ'
.
요청 된대로 : 연산자 우선 순위, 최고에서 최저로 :
- 같은 언어 별 중위와 mixfix 운영자,
λ x . e
,∀ α . σ
,와τ → τ'
,let x = e0 in e1
기능 응용 프로그램 및 공백. :
∈
과∉
,
(왼쪽 연결)⊢
- 여러 제안을 분리하는 공백 (연관)
- 가로 막대
답변
이 구문은 복잡해 보이지만 실제로는 매우 단순합니다. 기본 아이디어는 형식적인 논리에서 비롯됩니다. 전체 표현은 상반부가 가정이고 하반부는 결과입니다. 즉, 상위 표현식이 참임을 알고 있으면 하위 표현식도 사실이라고 결론을 내릴 수 있습니다.
기호
명심해야 할 또 다른 사항은 일부 글자에는 전통적인 의미가 있다는 것입니다. 특히, Γ는 “컨텍스트”를 나타냅니다. 즉, 여러분이 본 다른 것들의 유형입니다. 같은 그래서 Γ ⊢ ...
수단 “표현 ...
당신은 모든 표현의 유형을 알고있을 때 Γ
.
이 ⊢
기호는 본질적으로 무언가를 증명할 수 있음을 의미합니다. 그래서 Γ ⊢ ...
내가 증명할 수있다 “라는 문장이다 ...
맥락에서가 Γ
.이 문은 유형 판단이라고한다.
염두에 두어야 할 또 다른 사항은 ML 및 Scala와 마찬가지로 수학에서 유형이 x : σ
임을 의미합니다 . Haskell ‘s처럼 읽을 수 있습니다 .x
σ
x :: σ
각 규칙의 의미
우리가 알고있는 경우 : 그래서,이를 알고, 첫 번째 표현식은 이해하기 쉽게된다 x : σ ∈ Γ
(즉, x
어떤 종류가 σ
어떤 맥락에서을 Γ
, 우리는 알고) Γ ⊢ x : σ
(에서, 즉 Γ
, x
유형이 있습니다 σ
). 정말, 이것은 당신에게 흥미있는 것을 말하지 않습니다. 컨텍스트 사용 방법 만 알려줍니다.
다른 규칙도 간단합니다. 예를 들어 보자 [App]
. 이 규칙은 두 가지 조건이있다 : e₀
일부 유형의 함수 인 τ
어떤 유형 τ'
및 e₁
종류의 값이다 τ
. 이제 당신은 당신이 어떤 타입을 신청할 수 있는지 알게 e₀
되었습니다 e₁
! 잘만되면 이것은 놀라운 일이 아닙니다 :).
다음 규칙에는 새로운 구문이 더 있습니다. 특히, Γ, x : τ
단지 상황 Γ
과 판단으로 구성된 맥락을 의미합니다 x : τ
. 우리는 변수가 있음을 알고있는 경우에 따라서, x
의 유형이 τ
와 표현 e
형식을 가지고 τ'
, 우리는 또한 취하는 함수의 유형을 알고 x
되돌아갑니다 e
. 이것은 우리가 함수가 취하는 타입과 리턴하는 타입을 알아 낸 경우해야 할 일을 알려주기 때문에 놀라운 일이 아닙니다.
다음은 let
명령문 처리 방법을 알려줍니다 . 당신은 몇 가지 표현이 알고 있다면 e₁
유형을 가지고 τ
만큼이 같은 x
유형이있다 σ
, 그 다음 let
로컬 바인딩 표현 x
유형의 값이 σ
것 e₁
유형이를 τ
. 실제로 이것은 let 문이 본질적으로 새로운 바인딩으로 컨텍스트를 확장 할 수 있음을 알려줍니다 let
.
이 [Inst]
규칙은 하위 유형을 처리합니다. type의 값이 있고이 값이 ( 부분 순서 관계를 나타내는) σ'
하위 유형 인 경우 해당 표현식 도 유형 입니다.σ
⊑
σ
마지막 규칙은 일반화 유형을 다룹니다. 빠른 변수 : 자유 변수는 어떤 표현 안에서 let-statement 또는 lambda에 의해 도입되지 않은 변수입니다. 이 표현은 이제 문맥 에서 자유 변수의 값에 따라 달라집니다. 규칙은 문맥에 어떤 것이라도 “자유” α
가 아닌 변수가 있다면 , 그 유형을 알고있는 어떤 표현이라도 말하는 것이 안전하다고 말하는 것입니다 e : σ
대한 유형해야합니다 어떤 값을 α
.
규칙을 사용하는 방법
이제 심볼을 이해 했으므로이 규칙으로 무엇을합니까? 이 규칙을 사용하여 다양한 값의 유형을 파악할 수 있습니다. 이렇게하려면 표현 (예 f x y
:)을보고 진술과 일치하는 결론 (아래 부분)이있는 규칙을 찾으십시오. “목표”를 찾으려고하는 것을 불러 보자. 이 경우으로 끝나는 규칙을 볼 수 있습니다 e₀ e₁
. 이것을 찾았 으면 이제이 규칙의 선 위에있는 모든 것을 입증하는 규칙을 찾아야합니다. 이러한 것들은 일반적으로 하위 표현식의 유형에 해당하므로 본질적으로 표현식의 일부를 반복합니다. 증명 트리를 완성 할 때까지이 작업을 수행하면 표현식 유형에 대한 증거가 제공됩니다.
따라서 이러한 모든 규칙은 표현의 유형을 파악하는 방법을 정확하게 그리고 일반적인 수학적으로 세부적으로 설명합니다.
이제 프롤로그를 사용한 적이 있다면 친숙하게 들릴 것입니다. 기본적으로 인간 프롤로그 인터프리터처럼 증거 트리를 계산하는 것입니다. 프롤로그를 “논리 프로그래밍”이라고하는 이유가 있습니다! HM 추론 알고리즘을 처음 도입 한 방법은 프롤로그에서 알고리즘을 구현하는 것입니다. 이것은 실제로 놀랍도록 간단하며 진행 상황을 명확하게 만듭니다. 꼭 시도해야합니다.
참고 : 아마도이 설명에서 약간의 실수를했으며 누군가가 지적하면 그것을 좋아할 것입니다. 실제로 몇 주 안에 수업 시간에이 내용을 다룰 것이므로 다음과 같이 확신 할 수 있습니다.
답변
누군가가이 상징의 바다가 무엇을 의미하는지 이해하기 시작하는 곳을 말해 줄 수 있다면
판단과 도출을 통한 논리 스타일에 대해서는 ” 프로그래밍 언어의 실제 기초 “, 2 장 및 3 장을 참조하십시오 . 이제 전체 책 을 Amazon에서 사용할 수 있습니다.
제 2 장
귀납적 정의
귀납적 정의는 프로그래밍 언어 연구에서 없어서는 안될 도구입니다. 이 장에서는 귀납적 정의의 기본 틀을 개발하고 그 사용법에 대한 몇 가지 예를 제시 할 것입니다. 귀납적 정의는 다양한 형태의 판단 또는 주장 을 도출하기위한 일련의 규칙 으로 구성됩니다. 판단은 지정된 종류의 하나 이상의 구문 객체에 대한 진술입니다. 규칙은 판단의 타당성을 위해 필요하고 충분한 조건을 지정하므로 그 의미를 완전히 결정합니다.
2.1 판단
우리 는 구문 개념에 대한 판단 또는 주장 의 개념으로 시작 합니다. 우리는 다음과 같은 예를 포함하여 많은 형태의 판단을 활용할 것입니다.
- n nat — n 은 자연수
- n = n1 + n2 — n 은 n1 과 n2 의 합입니다.
- τ 유형 — τ 는 유형입니다
- e : τ — 식 e 는 유형 τ
- e ⇓ v — 식 e 에는 값 v가 있습니다
판단에 따르면 하나 이상의 구문 객체가 속성을 갖거나 서로 관련이 있습니다. 속성 또는 관계 자체를 판단 양식 이라고하며 , 객체 또는 객체가 해당 속성을 가지고 있거나 해당 관계에 있다고 판단 하는 경우 해당 판단 양식 의 예 라고합니다 . 판단 양식은 술어 라고도하며 인스턴스를 구성하는 객체는 주제 입니다. 우리는 쓰기 J 것을 주장 판단에 대한 J가 의 보유 를 . 판단의 주제를 강조하는 것이 중요하지 않은 경우 (텍스트는 여기서 잘림)
답변
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, 모든 인수 표현식의 유형 ? ? 표현식을 반환합니다.
따라서 ?는 ?이고 ?은 자유 변수가 아니기 때문에 일반적으로 ?는 ?을 반환하는 모든 인수 변수 (?)에 대해 ?로 입력됩니다.
즉, 포함 범위에 아직 바인딩되지 않은 인수 (로컬이 아닌 변수)에 대해 모든 유형을 허용하도록 프로그램을 일반화 할 수 있습니다. 이러한 바운드 변수는 대체 가능합니다.
함께 모아서
특정 가정 (예 : 자유 / 정의되지 않은 변수, 알려진 환경)이있을 경우 다음 유형을 알고 있습니다.
- 프로그램의 원자 요소 (가변)
- 함수가 반환 한 값 (함수 응용 프로그램)
- 기능적 구성 (함수 추상화)
- 바인딩 (변수 선언),
- 부모 유형의 인스턴스 (인스턴스화)
- 모든 표현 (일반화).
결론
이러한 규칙을 결합하면 형식 주석 없이도 가장 일반적인 형태의 주장 된 프로그램을 증명할 수 있습니다.
답변
표기법은 자연 공제 에서 비롯됩니다 .
⊢ 기호를 개찰구 라고 합니다.
6 가지 규칙은 매우 쉽습니다.
Var
규칙은 다소 사소한 규칙입니다. 식별자 유형이 이미 유형 환경에 존재하면 유형을 유추하기 위해 그대로 환경에서 가져옵니다.
App
규칙에 따르면 두 개의 식별자가 e0
있고 e1
해당 유형을 유추 할 수있는 경우 애플리케이션 유형을 유추 할 수 있습니다 e0 e1
. 당신이 알고있는 경우 규칙은 다음과 같이 읽어 e0 :: t0 -> t1
와 e1 :: t0
(같은 T0가!), 다음 응용 프로그램이 잘 입력하고 유형입니다 t1
.
Abs
및 Let
람다 추상화에 대한 유형을 추론하고 렛에하는 규칙이 있습니다.
Inst
규칙은 덜 일반적인 유형으로 유형을 대체 할 수 있다고 말합니다.
답변
e를 생각하는 두 가지 방법이 있습니다 : σ. 하나는 “표현식 e에 유형 σ가 있음”이고 다른 하나는 “표현식 e와 유형 σ의 순서 쌍”입니다.
식의 유형에 대한 지식으로 Γ를보고 식과 유형의 쌍으로 구현하십시오. e : σ.
개찰구 ⊢는 왼쪽에있는 지식에서 오른쪽에있는 것을 추론 할 수 있음을 의미합니다.
따라서 첫 번째 규칙 [Var]을 읽을 수 있습니다.
지식 Γ에 e : σ 쌍이 포함 된 경우 e가 σ 유형 인 e를 Γ에서 추론 할 수 있습니다.
두 번째 규칙 [App]을 읽을 수 있습니다.
만약 Γ에서 e_0의 유형이 τ → τ ‘라고 추론 할 수 있고, Γ에서 e_1의 유형이 τ라고 추론 할 수 있다면, Γ에서 e_0 e_1이 τ ‘를 입력하십시오.
Γ ∪ {e : σ} 대신 Γ, e : σ를 쓰는 것이 일반적입니다.
따라서 세 번째 규칙 [Abs]을 읽을 수 있습니다.
만약 x로 확장 된 Γ에서 : τ가 e가 τ ‘를 가지고 있다고 추론 할 수 있다면, Γ에서 λx.e가 τ → τ’를 가지고 있다고 추론 할 수 있습니다.
네 번째 규칙 [Let]은 연습으로 남겨둔다. 🙂
다섯 번째 규칙 [Inst]을 읽을 수 있습니다.
만약 Γ에서 우리가 e가 σ ‘를 가지고 있다고 추론 할 수 있고, σ’가 σ의 하위 유형이라면, Γ에서 우리는 e가 σ를 가지고 있다고 추론 할 수 있습니다.
여섯 번째 및 마지막 규칙 [Gen]을 읽을 수 있습니다.
만약 Γ에서 e가 σ를 갖는 것으로 추정 할 수 있고 α가 Γ에서 어떤 유형의 자유 유형 변수가 아니라면, Γ에서 우리는 e가 type을 갖는 것으로 추론 할 수 있습니다 ∀α σ.