Skip to content

Instantly share code, notes, and snippets.

@therne
Last active March 23, 2018 06:56
Show Gist options
  • Save therne/b36a6bffb782f569b55b to your computer and use it in GitHub Desktop.
Save therne/b36a6bffb782f569b55b to your computer and use it in GitHub Desktop.
20160313 언어론 스터디 자료 (Lecture 4-2)

Type and Type Checking

오늘의 PPT 자료 링크

Type

정의 : 어떠한 항 (Term)에 대해서, 그 항은 타입을 가지고 있고 그 항의 입력과 결과는 그 타입으로 제한된다.
표기 M : A 는, M이 A라는 타입을 가지고 있다는 의미이다.

예를 들어, Integer List라는 타입은 다음과 같이 귀납적으로 정의할 수 있다 : type IntList = Empty | Int ** IntList.

Type Checking

타입 체킹은 크게 두가지 종류로 나눌 수 있다.

  • Static Type Checking : 프로그램이 컴파일되는 시점에서 타입을 체킹한다.
  • Dynamic Type Checking : 프로그램이 실행되는 시점에서 타입을 체킹한다. 잘 안씀.

타입 체킹을 할 땐, Sound한 타입 체킹을 할지 Dynamic한 타입 체킹을 할 지 결정해야 한다.
이를 위해선, 먼저 다음과 같은 이론전산학적 지식이 필요하다.

Turing Equivalence (튜링 동치)
: 시스템 A가 시스템 B를 시뮬레이션할 수 있고, 시스템 B가 시스템 A를 시뮬레이션할 수 있으면 두 시스템은 튜링 동치라고 부른다.
Universal Turing Machine (UTM, 보편적 튜링 머신)
: 임의의 입력과 출력을 가진 튜링 머신을 시뮬레이팅할 수 있는 튜링 머신을 말한다. 프로그램 저장형 컴퓨터의 기초가 된다.
프로그램 저장형 컴퓨터의 시초라고 불린다.
Turing Completeness
: 어떤 시스템 P가 보편적 튜링 머신과 튜링 동치라면, 그 시스템 P는 튜링 완전하다고 한다.

타입 체킹이 Sound할지, Complete할지 결정하는건 해당 언어의 설계 목적에 따라서 정해야 한다.

  • 항상 문제없는 안정성이 필요하면 Sound하게 설계한다던가
  • 뭐 에러 한두번쯤 용인할 수 있고 Sound하게 코딩하는게 너무 빡빡하면 Complete하게 설계한다던가

그럼 동시에 Sound하고 Complete한 Type Checker를 만들면 안되나? A. 안된다.
예시 1) Diophantine Equation (디오판토스 방정식)

  • Q. polynomial한 부정방정식의 정수해를 구할 수 있는가?
  • A. 프로그램으론 짤 수 없다. 심지언 짤 수 있는지 없는지조차 제대로 모른다.

예시 2) Halting Problem (정지 문제)

  • Q. 임의의 프로그램에 대해 이 프로그램이 실행이 끝나는지 끝나지 않는지 판별하는 프로그램이 존재하는가?
  • A. 불가능하다.
    • H(p,x)라는, p(x)가 끝나는지 안끝나는지 판별하는 함수가 있다고 하자.
      • ∀p let H(p,x) = { yes if p(x) terminates, otherwise no }
    • Such H is incomputable.
    • 증명) let f(x) = if H(f,x) then loop() else 1 라고 하자.
      • 해석 : f(x)는, 만약 f(x)가 끝난다면 loop돌리니까 안끝난다. 아니면(안끝나면) 이 프로그램은 끝난다!
      • ?? 모순이네?
  • 한편, 만약 Sound & Complete한 TC(Type Checker)가 있다는 건 정지문제도 해결할 수 있다는거 아닌가?
    • 근데 위에서 정지문제는 해결할 수 없댔잖아?
    • 따라서 그딴 타입체커는 존재하지 않는다.

+ Logic과 Computation

Type Checking Rule에 대해 들어가기 앞서, Type Checking Rule과 Type Checker를 확실히 구분지을 필요성이 있다. TC Rule은 논리적인 영역에 해당하고, TC (혹은 TC Procedure)는 그것이 실체화된 구현의 영역에 해당한다.

이렇게 Logic과 Computation을 구분하는 데는 이 밖에도 다양한 예시가 존재하는데,

Logic Computation
Syntax definition Parser
Semantic definition Interpreter
TC rules TC procedure

문제에 무작정 접근하지 말고 상위적 레벨인 Logic 단에서 논리 시스템을 만든 후, 어떻게 알고리즘을 만들까 생각해봐야 한다. 실제 문제해결(구현의 세계, Computation)과 논리 (Logic)의 세계를 자유자재로 넘나들 수 있도록 하자.

Type Checking Rules Example : 홀수 및 짝수 계산

홀짝 타입 정의
타입 추론규칙 정의 및 soundness
자유타입 x 추론가능?

x + 1 = odd? 문제처럼, 어떤 x가 타입이 없으면 (Free Type)
Assumption에 의해서 E의 타입을 결정한다. (Assumption = 추론규칙)

x: odd ⊢ x + 1 : even  
x: even ⊢ x + 1 : odd  

위와 같은 추론규칙이 있다면,

  X: even ∈ Г
–––––––––––––––
  Г ⊢ X: even

X: even이란 추론규칙이 Г 집합에 포함될 때,
Г를 전제하면 X: even이다. 이게 뭔 이야기인지 정리해보면,

lol

Г 의 의미는 Assumption의 집합 (추론규칙 집합)이다.

해석: 추론규칙들 Г을 전제로, Expression이 Type이란 것을 증명 가능하다.

Inference Rules

어떠한 True인 Formula로부터 True인 Formula를 끄집어 내는 (추론하는), 귀납적 방법이다.

lol

위 설명은 타입 추론규칙임다. 자세한건 아래 논리기호 정리 참조. 예제로 맨 아래의 오른쪽 식만 정리해보자면,

φ(피)라는 Formula가, Г (감마)에서 ψ(프사이)라는 Formula를 만들고, φ가 Г에서 True라면 
Г에서 ψ는 True이다.

Γ에서 φ를 덧붙인 후, ψ가 True라는 Formula라고 할 수 있으면, 
Γ에서 φ를 뺀, Γ에서 φ -> ψ는 True이다.

good
φ와 ψ를 전제로 ⍴가 True이면,
φ를 전제로 ψ -> ⍴도 True이며,
⍴ -> (ψ -> ⍴)도 True이다.
추론규칙을 사용해서 위 식 유도 가능.

More Details : http://www.aistudy.com/logic/inference_rule.htm

논리기호

위키피디아 링크 - 논리 기호

→ : 함의 (A → B 는 "만약 A라면 B이다"로 해석됨, ⊃로도 쓸 수 있음)
⇔ : 동치
¬ : NOT
∧ : AND (논리곱)
∨ : OR (논리합)
⊻, ⊕ : XOR (배타적 논리합, (A ∨ B) ∧ ¬(A ∧ B))
∀ : 임의의 (전칭, for all; for any;)
ex) ∀ n ∈ ℕ: n²  ≥ n 은 자연수집합에 포함되는 임의의 n에 대하여, n² >= n이란 의미이다.
⊤ : TOP (VERUM, 언제나 참)
⊥ : BOTTOM (FALSUM, 언제나 거짓, 모순)
:= : 정의
⊢ : A ⊢ B일 때, A를 전제로 B를 증명가능하다. (provable)
⊨ : A ⊨ B일 때, A가 B를 수반한다. (entails)

예시) Sound & Completeness 증명 글, 자세한건 이 링크 참조

A ⊢B → A ⊨B (Soundness)
A ⊨B → A ⊢B (Completeness)

설명 : 
Given a set of formulas Γ and a formula φ in some logic (e.g., first-order logic), 
Γ ⊨ φ means that every model of Γ is also a model of φ.

On the other hand, fix a proof system (e.g., sequent calculus) for that logic. Then Γ⊢φ 
means that there is a proof using that proof system of φ assuming the formulas in Γ.

The relationship between ⊨ and ⊢ actually describes two important properties of a proof calculus: If 
Γ⊢φ implies Γ⊨φ , the proof system is sound, and if Γ⊨φ implies Γ⊢φ, it is complete.
For propositional and first-order logic, there are proof systems that are both sound and complete; this
is not the case for some other logics. For example, second-order logic does not admit an effective sound
and complete proof system (e.g., the set of rules for a sound and complete proof system would not be decidable).

Edit: Not every proof calculus for propositional or first-order logic is both complete and sound. For example, consider the system with the following rule: 
⊢φ∨¬φ where φ is an arbitrary formula. This is undoubtably correct, but it's also incomplete, since one cannot derive trivially true statements like φ⊢φ.
On the other hand, the system Γ⊢φ for arbitrary formulae φ and formula sets Γ is complete, but obviously incorrect.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment