{-# OPTIONS --cubical-compatible #-}
module Padova2025-zh-TW.VerifiedAlgorithms.PostHocVerification where
事後驗證#
open import Padova2025-zh-TW.ProgrammingBasics.Booleans
open import Padova2025-zh-TW.ProgrammingBasics.Naturals.Base
open import Padova2025-zh-TW.ProgrammingBasics.Naturals.DecisionProcedures
open import Padova2025-zh-TW.ProvingBasics.Equality.Base
open import Padova2025-zh-TW.ProvingBasics.Equality.General
open import Padova2025-zh-TW.ProvingBasics.Equality.NaturalNumbers
Beware of bugs in the above code; I have only proved it correct, not tried it.(小心上面程式碼中的錯誤;我只證明了它是正確的,並沒有試過它。)
―Donald Knuth
在事後驗證中,我們運用 Agda 的表達力與強度,來驗證(另外實作的)演算法的正確性。
例如,函數 eq? : ℕ → ℕ → Bool
的目的是判斷它的兩個輸入是否一致。但我們的實作真的達成這個目標了嗎?在沒有依值型別的一般程式語言中,我們可能會用特定的例子
(也許是隨機產生的)來測試這個函數,或是仔細檢視實作,
也許請同事一起審查,……由於 Agda 型別系統的表達力,在 Agda 中我們可以改為形式化地證明其正確性。
待補:擴充。
習題 1
eq?-correct₁eq?-correct₁ : (x y : ℕ) → eq? x y ≡ true → x ≡ y
eq?-correct₁ = {!!}
你的解答
習題 2
eq?-correct₂eq?-correct₂ : (x y : ℕ) → x ≡ y → eq? x y ≡ true
eq?-correct₂ = {!!}
你的解答
習題:不等的決策程序之正確性#
open import Padova2025-zh-TW.ProvingBasics.Termination.Ordering
習題 3
≤?-correct₁≤?-correct₁ : (x y : ℕ) → ≤? x y ≡ true → x ≤ y
≤?-correct₁ = {!!}
你的解答
習題 4
≤?-correct₂≤?-correct₂ : (x y : ℕ) → x ≤ y → ≤? x y ≡ true
≤?-correct₂ = {!!}
你的解答
習題:判定偶數的決策程序之正確性#
open import Padova2025-zh-TW.ProvingBasics.EvenOdd
習題 5
even?-correct₁even?-correct₁ : (x : ℕ) → even? x ≡ true → Even x
even?-correct₁ = {!!}
你的解答
習題 6
even?-correct₂even?-correct₂ : {x : ℕ} → Even x → even? x ≡ true
even?-correct₂ = {!!}
你的解答
習題:減法函數之正確性#
open import Padova2025-zh-TW.ProgrammingBasics.Naturals.Arithmetic
習題 7
∸-correct∸-correct : (x y : ℕ) → x ≥ y → y + (x ∸ y) ≡ x
∸-correct = {!!}
你的解答