Skip to content

Stanford CS103 Lecture 6:函數 I,從定義到單射與滿射證明

2026年8月22日 1 分鐘
TL;DR 函數不只是一條公式:定義域、陪域、全域有定義與確定性缺一不可,而 involution、單射與滿射的量詞正好決定證明怎麼寫。
目錄
  1. 1. 證明技巧表再次登場
  2. 2. 函數是確定性的對應
  3. 3. 定義域與陪域是函數身份的一部分
  4. 4. 函數的兩條正式規則
  5. 5. 定義函數需要三個部件
  6. 6. 分段定義的接縫要同時檢查
  7. 7. Involution:做兩次回到原點
  8. 8. 用分類討論證明分段 involution
  9. 9. 反例如何推翻 involution
  10. 10. 單射的兩個等價讀法
  11. 11. 證明線性函數是單射
  12. 12. 否定單射就是找 collision
  13. 13. 滿射要求陪域每點都有原像
  14. 14. 滿射與非滿射的 witness 策略
  15. 15. 從定義直接生成證明流程
  16. 16. 常見錯誤與自我練習
  17. 材料缺口與閱讀界線
  18. 更新紀錄
  19. 參考資料

🌏 English version

這是 Stanford CS103 導讀的第 8 篇,對應 Spring 2026 官方 Lecture 6(2026-04-13)。課程團隊是 Cynthia Bailey Lee 與 Alex Aiken;公開頁面沒有逐堂標示實際講者,因此本文不猜講者。講次頁面完整投影片公開,錄影與逐字稿只在 Canvas/Panopto,本文沒有使用。

本講的官方題目是 Functions, Part I。它把大家早已會算的函數,重新拆成可由集合與一階邏輯檢查的物件。「是不是函數」「是不是單射」「是不是滿射」因而不再靠圖形直覺,而能轉成量詞、否定,再轉成正式證明。

1. 證明技巧表再次登場

投影片先重放證明技巧表。要證明 ∀x. A,讓讀者任取一個 x,再證明該選擇滿足 A;要證明 ∃x. A,自己提出 witness 並驗證;要證明 A → B,假設 A 後推出 B;合取分別證明兩邊,雙條件則證明兩個方向。否定題先把否定化簡,再對結果使用相應方法。

這張表不是前幾講用完即丟的工具。函數的特殊性質會用一階邏輯定義,因此證明外形早已藏在定義裡。看到全稱量詞,就知道讀者要任取元素;看到存在量詞,就知道作者要給 witness。後面每個證明都示範「先讀公式,再安排文字」。

2. 函數是確定性的對應

高中課本常把函數呈現成 f(x)=x⁴-5x²+4,程式設計則把它想成接收參數並回傳結果的程序。兩種直覺都抓到輸入與輸出,但 CS103 還要求確定性:同一輸入必須永遠得到同一輸出。因此使用隨機數的 C++ 程序雖然可以合法執行,卻不符合本講採用的數學函數定義。

確定性不是說不同輸入一定產生不同輸出。f(1)=0f(2)=0 完全可能;禁止的是同一個輸入在同一函數中同時被指定兩個不相等的值。守住這條界線,稍後才不會把一般函數的要求和單射混在一起。

3. 定義域與陪域是函數身份的一部分

每個函數都帶著兩個集合:定義域是允許輸入的集合,陪域是輸出被要求落入的集合。若 f 的定義域為 A、陪域為 B,寫成 f : A → B。函數必須對 A 的每個元素都有輸出,每個輸出都屬於 B;但 B 的每個元素不一定真的被產生。

因此陪域不等於實際輸出集合。例如絕對值可宣告為 f : ℝ → ℝ。它的輸出都是實數,但負實數從未被命中。若只看公式而省略 ℝ → ℝ,便看不出未命中的負值究竟是陪域的一部分,還是根本不在討論範圍。公式相同但定義域或陪域不同,數學上可能是不同函數,也可能具有不同的單射或滿射性質。

4. 函數的兩條正式規則

投影片把 f : A → B 拆成兩條一階邏輯規則:

∀a ∈ A. ∃b ∈ B. f(a) = b
∀a₁,a₂ ∈ A. (a₁ = a₂ → f(a₁) = f(a₂))

第一條說每個合法輸入都對應某個合法輸出;第二條說相等輸入必須產生相等輸出。它們也是判斷候選規則是否真為函數的檢查表。空定義域不破壞規則:沒有元素可成為反例,所以全稱敘述 vacuously true。一旦定義域有元素,每一個都要能代入並得到陪域內唯一確定的值。

第二條雖然寫了兩個變數,重點不是比較不同輸入,而是保證同一輸入不會分裂成不同答案。後面的單射會使用方向相反的 implication;現在先把「相等輸入推出相等輸出」讀準。

5. 定義函數需要三個部件

完整定義函數必須提供定義域、陪域與求值規則,三者缺一不可。圖示可用兩個橢圓表示集合,再用箭頭指定每個輸入去向;代數寫法則先寫 f : ℤ → ℤ,再寫 f(x)=x²+3x-15。前一行不是裝飾,而是交代公式能接收什麼、答案必須落在哪裡。

圖示題要逐個檢查定義域元素。若某個左側元素沒有箭頭,函數未在整個定義域上定義;若一個左側元素指向兩個不同右側元素,確定性失敗。多個左側元素指向同一右側元素仍是函數,只是未必單射。右側有元素沒被命中,也不妨礙它成為函數,只是未必滿射。

6. 分段定義的接縫要同時檢查

分段函數仍要遵守三部件契約。投影片以絕對值型規則為例:非負時回傳 n,非正時回傳 -n。因為 0 同時滿足兩個條件,必須確認兩支在 0 給出相同答案;若重疊區給出不同值,確定性就壞了。也要確認定義域中每個元素至少落入一支,否則規則不完整。

另一個 quick check 是 f(x)=(x+2)/(x+1)。宣告為 f : ℕ → ℝ 時,每個自然數輸入都有實數輸出,因此可以是函數;宣告為 f : ℝ → ℝ 時,x=-1 讓分母為零,無法在完整定義域上求值,因此不是這個型別的函數。修正方式是把定義域改成 ℝ \ {-1},或另外一致地定義 -1 的值,而不是假裝例外不存在。

7. Involution:做兩次回到原點

f : A → A∀x ∈ A. f(f(x))=x,便稱 f 為 involution。定義域和陪域必須相同,因為第一次輸出的 f(x) 還要合法地送入第二次。直覺是操作自行抵消:開關翻兩次、雙重否定、-(-x)=x,以及集合的 symmetric difference (A △ B) △ B=A 都呈現這種結構。

投影片的候選包括恆等函數、取負、倒數與交換相鄰自然數的分段函數。恆等與取負是 involution。1/x 若宣告為 ℝ → ℝ,在零點甚至不是函數;改為 ℝ\{0} → ℝ\{0} 才是 involution。最後一例把偶數 n 送到 n+1、奇數送到 n-1,每對相鄰自然數彼此交換,做兩次正好回原數。

8. 用分類討論證明分段 involution

要證明交換相鄰整數的 f : ℤ → ℤ 是 involution,全稱量詞要求先任取 n ∈ ℤ,證明 f(f(n))=n。因為規則依奇偶分支,中段自然是窮盡的分類討論。

n 偶,f(n)=n+1,而 n+1 奇,所以第二次套用奇數分支:f(f(n))=f(n+1)=(n+1)-1=n。若 n 奇,f(n)=n-1,而 n-1 偶,所以 f(f(n))=f(n-1)=(n-1)+1=n。兩種情況涵蓋所有整數。投影片以 lemma 標記「偶數加一是奇數」與「奇數減一是偶數」;lemma 是服務主要定理的輔助定理,不是可以默默略過的跳躍。

9. 反例如何推翻 involution

證明函數不是 involution,要先否定定義:

¬∀x ∈ A. f(f(x)) = x ≡ ∃x ∈ A. f(f(x)) ≠ x.

因此不必描述所有輸入,只要提出一個失敗 witness。投影片用 f : ℕ → ℕ, f(n)=n²:取 n=2,有 f(f(2))=f(4)=16≠2。這個短證明的力量來自量詞完全對準,而不是計算複雜。

反例也提醒我們不能用幾個成功樣本證明全稱命題。01 的確反覆平方後不變,但這只能說兩個點通過,無法推出所有自然數都通過。證明 involution 必須從任意輸入推導;否定它,一個經驗證的失敗輸入就夠。

10. 單射的兩個等價讀法

函數 f : A → B 是 injective(one-to-one),意思是不同輸入產生不同輸出:

∀x₁,x₂ ∈ A. (x₁ ≠ x₂ → f(x₁) ≠ f(x₂)).

其逆否命題是常用等價形式:∀x₁,x₂ ∈ A. (f(x₁)=f(x₂) → x₁=x₂)。第二式常比較好算,因為可以從兩個函數值相等直接代數消去。注意它比一般函數的確定性更強:函數規則說「輸入相等則輸出相等」;單射把可推理方向反過來,說「輸出相等則輸入相等」。交換這兩句,是本講最常見的定義錯誤之一。

11. 證明線性函數是單射

f : ℕ → ℕf(n)=2n+7。任取 x₁,x₂ ∈ ℕ 並假設 f(x₁)=f(x₂)。依定義展開得 2x₁+7=2x₂+7,兩側減七再除以二,得到 x₁=x₂。這正好完成等值輸出版本的 implication。

寫作時應明說任取兩個定義域元素、假設 antecedent、最後指出 consequent 已成立。正文不需要塞入 符號;形式式用來設計證明,成品仍以清楚文字呈現。若硬走「輸入不同推出輸出不同」也能成功,但常需處理不等式或反證,等值版本在代數函數上通常更直接。

12. 否定單射就是找 collision

f : ℤ → ℕf(x)=x⁴。單射定義的否定是:存在 x₁,x₂ ∈ ℤ,兩者不同但函數值相等。選 x₁=1x₂=-1,有 1≠-1,卻有 f(1)=1=f(-1),便完成反例。

這種不同輸入撞到同一輸出的現象叫 collision。證明「不是單射」必須同時驗證兩件事:witness 確實不同,輸出確實相同。只展示 f(1)=f(-1) 而未說明輸入不同,形式上少了一半;只展示不同輸入,卻沒有相等輸出,也沒有觸及單射的否定。

13. 滿射要求陪域每點都有原像

函數 f : A → B 是 surjective(onto),若 ∀b ∈ B. ∃a ∈ A. f(a)=b,也就是陪域每個目標都有至少一個原像。量詞順序很重要:先由讀者任取目標 b,作者才依這個 b 建構輸入 a。若改成先找一個固定 a 再覆蓋所有 b,就要求單一輸入同時產生所有輸出,是完全不同而通常不可能的命題。

滿射高度依賴陪域。f(n)=2n 若從自然數到自然數,所有奇數都漏掉;若把陪域改成偶自然數集合,它便可能滿射。圖示上,滿射要求右側每點至少收到一支箭頭;左側多個元素可以指向同一點,所以滿射不自動代表單射。

14. 滿射與非滿射的 witness 策略

f : ℝ → ℝf(x)=2x。任取目標 y ∈ ℝ,選 x=y/2。這個 x 是合法實數,而且 f(x)=2(y/2)=y,所以每個陪域元素都有原像。滿射證明的核心不是「看起來都有」,而是提供能依任意目標產生合法輸入的公式。

再看 g : ℕ → ℕg(n)=2n。否定滿射定義得到 ∃b ∈ ℕ. ∀a ∈ ℕ. g(a)≠b。投影片選 b=137。任取 a ∈ ℕg(a)=2a 為偶數,而 137 為奇數,因此永不相等。先找一個陪域漏點,再證明所有定義域輸入都無法命中,正好對應「存在—全稱」順序。

15. 從定義直接生成證明流程

本講三類性質可濃縮成流程。證明 involution:任取輸入,計算兩次並證明回原點;否定它:找一個回不去的輸入。證明 injective:任取兩輸入,假設輸出相等後推出輸入相等;否定它:找一組 collision。證明 surjective:任取陪域目標,依目標建構原像;否定它:找一個漏掉的目標,再證明沒有任何輸入能命中。

每次動筆前做四步自查:寫出完整型別 A → B;抄出性質的量詞定義;若題目是否定,先把否定推到原子敘述;最後按最外層量詞決定誰選物件。這套方法把「不知道怎麼起手」改造成機械但可靠的 proof planning,也把先前邏輯單元和後續函數單元接在一起。

16. 常見錯誤與自我練習

常見錯誤包括:只寫公式不寫定義域與陪域;把陪域誤當實際輸出集合;漏查分段規則的空隙與重疊;把確定性誤寫成單射;證明滿射時先固定一個與目標無關的輸入;用有限幾個成功樣本證明全稱命題;把形式邏輯原封不動塞進證明,卻沒有翻成可讀推理。

可以用四題檢查自己。第一,判斷 x ↦ 1/xℝ → ℝℝ\{0} → ℝ\{0} 的差異。第二,證明 x ↦ x+5ℤ → ℤ 同時單射且滿射。第三,找出 x ↦ x²ℤ → ℕ 不是單射的 collision,並思考它是否滿射。第四,設計有限集合上的 involution,畫箭頭後用 f(f(x))=x 逐點驗證。每題都先寫量詞,再寫 prose proof;若兩者選擇順序不一致,先回頭找問題。

材料缺口與閱讀界線

完整投影片足以核對函數正式規則、定義方式、分段函數、involution、單射、滿射及五個主要證明例子,因此本文依 deck 重建 agenda。投影片不是錄影,不保存所有口頭轉折、學生問題或臨場補充;本文不把作者銜接包裝成講師原話,也未使用受限的作業解答。

更新紀錄

  • 2026-08-22:從官方 Functions, Part I 完整投影片逐節重建正文、metadata、證明例子與材料界線。

參考資料