我們發展..
保證程式 正確性 之技術
Q: 這個 function 是做什麼的?
-- haskell
func1 :: Int -> Int
func1 n = n +1
// java
int func1(int i){ return (i+1); }
假設 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; }
}
假設 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; }
}
}
isEven( 11 );
isEven( false );
符號 | 意義 | |
---|---|---|
p ∧ q | p 和 q | |
p ∨ q | p 或 p | |
p → q | 若 p 則 q | |
¬ p | 非 p |
p = 我今天跳祈雨舞; q = 明天會下雨
假設: p 裡面有用到 x
符號 | 意義 | |
---|---|---|
∀ x . px | 對所有 x, px 都成立 | |
∃ x . px | 存在有 x, px 都成立 |
S 表示 所有奇異果的集合 ; px 表示 x 是係金ㄟ
ℕ 是所有自然數的集合(包含零)
問題:我們如何 檢驗 某個「邏輯句子」是否為 真 ?
p | q | p → q | ¬ p ∨ q |
---|---|---|---|
T |
T |
T |
T |
T |
F |
F |
F |
F |
T |
T |
T |
F |
F |
T |
T |
某個「邏輯句子」為真,如果「句子」中每個部分都為真
我們所謂的 True 從
轉變為
∀m, n ∈ ℕ . ∃i ∈ ℕ . m × n = 0 ∨ m × n = i + m
∀ 非空自然數集合 S . ∃m ∈ S . ∀x ∈ S . m ≥ x
∀m, n ∈ ℕ . ∃i ∈ ℕ . m × n = 0 ∨ m × n = i + 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
// 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; }
}
}
寫 程式 就是寫 證明 !