程式與邏輯

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

範例 ¬ ¬ pp

  • [古典] ¬ ¬ 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. 有「型別(性質)」 但是 沒有「程式」
    • 自動化地 產生 「證明」
    • 利用我們對數學的理解去讓這個「證明」
      更容易被想出來

程式 就是寫 證明

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