程式與邏輯

08 Apr 2017

Prelude

背景調查

  • 程式 Programming ?
  • 型別 Types ?
  • 遞迴 Recursion ?
  • 集合 Set ?
  • 邏輯 Logic ?

郗昀彥

  • 程式計算與建構
  • 設計型別系統
  • 設計程式語言

我們發展..
保證程式 正確性 之技術

  • 程式
  • 邏輯
  • 能(在)做什麼

電腦 程式

Q: 這個 function 是做什麼的?

-- haskell
func1 :: Int -> Int
func1 n = n +1
// java
int func1(int i){ return (i+1); }
  • 拿一個自然數回傳該數加一
  • func1 :: Int → Int
    • type information

假設 Int 是由 0 開始的所有自然數

-- haskell
func2 :: (Int, Int) -> Int
func2 (m, 0) = 0
func2 (m, n) = (func2 (m, n-1)) + m
// java
int func2(int m, int n){
    if(n == 0){ return 0; }
    else{ return func2(m, n-1) + m; }
}
  • (Int, Int) → Int
  • Int → Int → Int

假設 input 不能是空的 list

-- haskell
func3 :: [Int] -> Int
func3 [x] = x
func3 (head : tail) = let m = func3 tail in
    if (head >= m) then head else m
// java
Integer func3(ArrayList<Integer> list){
    T head = list.get(0);
    if(list.size() == 1){
        return head;
    }else{
        T m = func3(list.remove(0));
        if(head >= m){ return head; }
        else{ return m; }
    }
}
  • List<Int> → Int

型別資訊 (type information)

  • 型別 告訴我們?
    • 輸入和輸出的 資料種類
  • 型別 可以用來?
    • 確保語法被 正確地使用
      • ✓ isEven( 11 );
      • × isEven( false );
  • 所以,型別重要嗎?

簡單 邏輯

Logic

符號 意義
p ∧ q p 和 q
p ∨ q p 或 p
p → q 若 p 則 q
¬ p 非 p

牛刀小試

p = 我今天跳祈雨舞; q = 明天會下雨

  • Q1: p ∧ q ?
  • Q2: p → q ?

First-Order Logic

假設: p 裡面有用到 x

符號 意義
∀ x . px 對所有 x, px 都成立
∃ x . px 存在有 x, px 都成立

範例

  • 「有某一學生的身高大於 180 公分」...?
    • ∃ s 是學生 . s 的身高 > 180
  • 「所有奇異果都是綠色的」...?
    • ∀ k 是奇異果 . k 是綠色的

更形式化 (符號化) 一點..

S 表示 所有奇異果的集合 ; px 表示 x 是係金ㄟ

  • 「有某顆奇異果不是係金ㄟ」...?
    • ∃ x ∈ S. ¬ px
  • 「所有的奇異果要嘛就是係金ㄟ,不然就不是」...?
    • ∀ x ∈ S. px ∨¬ px

請問 下述邏輯句子的意思?

ℕ 是所有自然數的集合(包含零)

  • ∀ m, n ∈ℕ . ∃ i ∈ℕ . m × n = 0 ∨ m × n = i + m
  • ∀ 非空自然數集合 S . ∃ m ∈ S . ∀ x ∈ S . m ≥ x

何謂 真實

問題:我們如何 檢驗 某個「邏輯句子」是否為 真 ?

真值表

p q p → q ¬ p ∨ q

T

T

T

T

T

F

F

F

F

T

T

T

F

F

T

T

某個「邏輯句子」為真,如果「句子」中每個部分都為真

真的是這樣嗎?

這顆奇異果係金ㄟ

  • 但是,我們怎麼知道?

  • 相信自己.. 嗎?
  • 直構主義
    • 不再信任自己對於世界的認知 (眼見不為憑)
    • 提供形式化的證據來證明

也就是說..

我們所謂的 True 從

  • 真實 、 存在 、 真理 ...

轉變為

  • 有證明 可以證實

  • 前者稱為 古典 邏輯 (classical)
  • 後者稱為 直構 邏輯 (intuitionistic)

古典 vs 直構

⊥

  • true: 真; false: 假
  • ⊥: 不存在的東西/某種未定之物
  • 爆炸原理: ⊥ → anything

範例 ¬ p

  • [古典] p = false
  • [直構] p → ⊥

範例 ¬ ¬ p 和 p

  • [古典] ¬ ¬ p = p
  • [直構] (p → ⊥) → ⊥

請證明

∀m, n ∈ ℕ . ∃i ∈ ℕ . m × n = 0 ∨ m × n = i + m

  • 若 n = 0, 顯然 m × 0 = 0
  • 假設 n = k + 1
    • 根據 MI, 已知 n = k 時存在一個 j 使得 m × k = 0 ∨ m × k = j + m
      • [case 1]: m × (k + 1) = (m × k) + m = 0 + m
      • [case 2]: m × (k + 1) = (m × k) + m = (j + m) + m

請證明

∀ 非空自然數集合 S . ∃m ∈ S . ∀x ∈ S . m ≥ x

  • 若 S ≡ {x}, 顯然 x ≥ x
  • 假設 S ≡ {x} ∪ T
    • 根據歸納法, 已知存在一個 m ∈ T 且 ∀ t ∈ T . m ≥ t
      • 若 x ≥ m 則 ∀ xi ∈ {x} ∪ T . x ≥ xi
      • 若 x < m 則 ∀ xi ∈ {x} ∪ T . m ≥ xi

邏輯與程式

回到程式..

  • 自然數乘法的程式
    • m × n 要嘛是 0 不然就是 m + 某個自然數
    • ∀m, n ∈ ℕ . ∃i ∈ ℕ . m × n = 0 ∨ m × n = i + m
  • 從一堆資料中找最大值的程式
    • 最大值 m 必定大於等於其他所有數值
    • ∀ 非空自然數集合 S . ∃m ∈ S . ∀x ∈ S . m ≥ x
  • 用「邏輯句子」描述我們想要做的事情的「性質」

∀m, n ∈ ℕ . ∃i ∈ ℕ . m × n = 0 ∨ m × n = i + m

  • 若 n = 0, 顯然 m × 0 = 0
  • 假設 n = k + 1
    • 已知存在 j 使得 m × k = 0 ∨ m × k = j + m
      • [case 1]: m × (k + 1) = (m × k) + m = 0 + m
      • [case 2]: m × (k + 1) = (m × k) + m = (j + m) + m
// java
int func2(int m, int n){
    if(n == 0){ return 0; }
    else{ return times(m, n-1) + m; }
}

∀ 非空自然數集合 S . ∃m ∈ S . ∀x ∈ S . m ≥ x

  • 若 S ≡ {x}, 顯然 x ≥ x
  • 假設 S ≡ {x} ∪ T
    • 根據歸納法, 已知存在一個 m ∈ T 且 ∀ t ∈ T . m ≥ t
      • 若 x ≥ m 則 ∀ xi ∈ {x} ∪ T . x ≥ xi
      • 若 x < m 則 ∀ xi ∈ {x} ∪ T . m ≥ xi
// java
Integer func3(ArrayList<Integer> list){
    T head = list.get(0);
    if(list.size() == 1){ return head; }
    else{
        T m = func3(list.remove(0));
        if(head >= m){ return head; }
        else{ return m; }
    }
}

Curry-Howard 對應

  • 「邏輯系統」 ⇔ 「型別系統」
  • 「邏輯句子/性質」 ⇔ 「型別資訊」
  • 「證明」 ⇔ 「程式」

邏輯系統百百種

  • 一階直構邏輯 ⇔ 簡單型別系統 (Martin-Löf type theory)
    • 描述 簡單資料 性質
  • 二階直構邏輯 ⇔ 多型型別 (System-F)
    • 描述 抽象資料 與 計算 相關的性質
  • 古典線性邏輯 ⇔ 會議型別 (session types)
    • 描述 不同程序 之間如何 傳遞訊息
  • 直構線性邏輯 ⇔ 線性型別 (linear types)
    • 描述系統 資源 被 使用的次數

  1. 有「程式」 也 有「型別(性質)」
    • 檢查 這個「程式」能否作為該性質的「證明」
    • 產生 一個更好(執行更快)的「證明」
  2. 有「型別(性質)」 但是 沒有「程式」
    • 自動化地 產生 「證明」
    • 利用我們對數學的理解去讓這個「證明」
      更容易被想出來

寫 程式 就是寫 證明 !

  • [有獎徵答] ⊥ 的意義? ⊥ 在程式上的意義?