{-# OPTIONS --cubical-compatible #-}
module Padova2025-zh-TW.ProvingBasics.Termination.Ordering where
自然數上的標準序#
open import Padova2025-zh-TW.ProgrammingBasics.Naturals.Base
open import Padova2025-zh-TW.ProgrammingBasics.Naturals.Arithmetic
open import Padova2025-zh-TW.ProgrammingBasics.Lists
open import Padova2025-zh-TW.ProvingBasics.Negation
open import Padova2025-zh-TW.ProvingBasics.Connectives.Disjunction
open import Padova2025-zh-TW.ProvingBasics.Connectives.More
open import Padova2025-zh-TW.ProvingBasics.Equality.Base
open import Padova2025-zh-TW.ProvingBasics.Equality.General
open import Padova2025-zh-TW.ProvingBasics.Equality.NaturalNumbers
在這個模組中,我們引進自然數上的標準序 _≤_,以及它的變體 _<_、_≥_ 與 _>_,並驗證它們的基本性質。
infix 4 _≤_ _<_ _≥_ _>_
data _≤_ : ℕ → ℕ → Set where
z≤n : {n : ℕ} → zero ≤ n
s≤s : {n m : ℕ} → (n≤m : n ≤ m) → succ n ≤ succ m
_<_ : ℕ → ℕ → Set
n < m = succ n ≤ m
_>_ : ℕ → ℕ → Set
n > m = m < n
_≥_ : ℕ → ℕ → Set
n ≥ m = m ≤ n
習題:自反性、遞移性與反對稱性#
習題 1
≤-refl≤-refl : {a : ℕ} → a ≤ a
≤-refl = {!!}
你的解答
習題 2
≤-trans≤-trans : {a b c : ℕ} → a ≤ b → b ≤ c → a ≤ c
≤-trans = {!!}
你的解答
習題 3
≤-antisymm≤-antisymm : {a b : ℕ} → a ≤ b → b ≤ a → a ≡ b
≤-antisymm = {!!}
你的解答
習題 4
<-irreflexive<-irreflexive : {a : ℕ} → a < a → ⊥
<-irreflexive = {!!}
參考解答用到: s≤s
你的解答
習題 5
<-irreflexive'<-irreflexive' : {a b : ℕ} → a ≤ b → b < a → ⊥
<-irreflexive' = {!!}
參考解答用到: s≤s
你的解答
習題 6
<-irreflexive''<-irreflexive'' : {a b : ℕ} → a < b → b < a → ⊥
<-irreflexive'' = {!!}
參考解答用到: s≤s
你的解答
習題 7
≡⇒≤≡⇒≤ : {a b : ℕ} → a ≡ b → a ≤ b
≡⇒≤ = {!!}
你的解答
習題:決策程序#
習題 8
≤-<-connex≤-<-connex : (a b : ℕ) → a ≤ b ⊎ b < a
≤-<-connex = {!!}
你的解答
也許令人驚訝的是,這個習題與下一個習題都可以靠自動駕駛解決。適當地使用 C-c C-c、C-c C-a 與 with 關鍵字,
對適當的遞迴呼叫的結果做 pattern matching。
習題 9
<-cmp<-cmp : (a b : ℕ) → a ≡ b ⊎ (a < b ⊎ a > b)
<-cmp = {!!}
你的解答
參考解答
<-cmp : (a b : ℕ) → a ≡ b ⊎ (a < b ⊎ a > b)
<-cmp zero zero = left refl
<-cmp zero (succ b) = right (left (s≤s z≤n))
<-cmp (succ a) zero = right (right (s≤s z≤n))
<-cmp (succ a) (succ b) with <-cmp a b
... | left a≡b = left (cong succ a≡b)
... | right (left a<b) = right (left (s≤s a<b))
... | right (right a>b) = right (right (s≤s a>b))
習題 10
dec-≤dec-≤ : (a b : ℕ) → Dec (a ≤ b)
dec-≤ = {!!}
你的解答
習題 11
dec-<dec-< : (a b : ℕ) → Dec (a < b)
dec-< = {!!}
你的解答
習題:幾個函數的序性質#
succ-monotone : {a b : ℕ} → a ≤ b → succ a ≤ succ b
succ-monotone = s≤s
習題 12
pred-monotonepred-monotone : {a b : ℕ} → a ≤ b → pred a ≤ pred b
pred-monotone = {!!}
你的解答
習題 13
succ-inflationarysucc-inflationary : (a : ℕ) → a ≤ succ a
succ-inflationary = {!!}
你的解答
習題 14
twice-inflationarytwice-inflationary : (a : ℕ) → a ≤ twice a
twice-inflationary = {!!}
你的解答
參考解答
twice-inflationary : (a : ℕ) → a ≤ twice a
twice-inflationary zero = z≤n
twice-inflationary (succ a) = ≤-trans (succ-inflationary (succ a)) (succ-monotone (succ-monotone (twice-inflationary a)))
習題 15
max-inflationaryₗmax-inflationaryₗ : (a b : ℕ) → a ≤ max a b
max-inflationaryₗ = {!!}
你的解答
習題 16
max-inflationaryᵣmax-inflationaryᵣ : (a b : ℕ) → b ≤ max a b
max-inflationaryᵣ = {!!}
你的解答
習題 17
+-monotone+-monotone : {a a' b b' : ℕ} → a ≤ b → a' ≤ b' → a + a' ≤ b + b'
+-monotone = {!!}
你的解答
習題 18
+-inflationaryₗ+-inflationaryₗ : (a b : ℕ) → a ≤ a + b
+-inflationaryₗ = {!!}
你的解答
習題 19
+-inflationaryᵣ+-inflationaryᵣ : (a b : ℕ) → b ≤ a + b
+-inflationaryᵣ = {!!}
你的解答
習題:串列的最大值#
maximum : List ℕ → ℕ
maximum [] = zero
maximum (x ∷ xs) = max x (maximum xs)
maximum-≥ : (k : ℕ) (xs : List ℕ) → k ∈ xs → k ≤ maximum xs
maximum-≥ k (x ∷ xs) (here refl) = max-inflationaryₗ x (maximum xs)
maximum-≥ k (x ∷ xs) (there p) = ≤-trans (maximum-≥ k xs p) (max-inflationaryᵣ x (maximum xs))
習題:減半#
習題 20
half-≤half-≤ : (x : ℕ) → half x ≤ x
half-≤ = {!!}
你的解答
習題 21
half-<half-< : (x : ℕ) → half (succ x) < succ x
half-< = {!!}
你的解答
習題:減法會變小#
open import Padova2025-zh-TW.ProvingBasics.EvenOdd
習題 22
monus-≤monus-≤ : (a b : ℕ) → a ≥ b → a ∸ b ≤ a
monus-≤ = {!!}
你的解答
習題 23
monus-<monus-< : (a b : ℕ) → IsPositive b → a ≥ b → a ∸ b < a
monus-< = {!!}
你的解答
偶數有無限多個#
open import Padova2025-zh-TW.ProvingBasics.Connectives.Existential
open import Padova2025-zh-TW.ProvingBasics.Connectives.Conjunction
open import Padova2025-zh-TW.ProvingBasics.EvenOdd
open import Padova2025-zh-TW.ProvingBasics.Equality.NaturalNumbers
要表達偶數有無限多個,一個特別正面的方式是:在每個自然數之後,都還有一個偶數。讓我們在 Agda 中陳述並證明這個事實。
習題 24
Even-infiniteEven-infinite : (x : ℕ) → ∃[ y ] (y ≥ x × Even y)
Even-infinite = {!!}
你的解答
參考解答
Even-infinite : (x : ℕ) → ∃[ y ] (y ≥ x × Even y)
Even-infinite x = twice x , twice-inflationary x , twice-even x
-- 或者,更經濟地,改以 `x` 或 `succ x` 作為見證,
-- 而不是 `twice x`:
-- Even-infinite x with even-or-odd x
-- ... | left xeven = x , ≤-refl , xeven
-- ... | right xodd = succ x , succ-inflationary x , succ-odd xodd
自然數有無限多個#
open import Padova2025-zh-TW.ProvingBasics.Connectives.Existential
要表達自然數有無限多個,有幾種方式,其中一種是:對每個有限的自然數串列,都有一個不在該串列中的自然數。 我們可以這樣形式化並證明這個斷言。
習題 25
ℕ-infiniteℕ-infinite : (xs : List ℕ) → ∃[ x ] x ∉ xs
ℕ-infinite xs = succ (sum xs) , λ p → <-irreflexive (go p)
where
go : {xs : List ℕ} {y : ℕ} → y ∈ xs → y < succ (sum xs)
go (here refl) = {!!}
go (there p) = {!!}
你的解答
參考解答
ℕ-infinite : (xs : List ℕ) → ∃[ x ] x ∉ xs
ℕ-infinite xs = succ (sum xs) , λ p → <-irreflexive (go p)
where
go : {xs : List ℕ} {y : ℕ} → y ∈ xs → y < succ (sum xs)
go (here refl) = succ-monotone (≤-trans (≡⇒≤ (sym (+-zero _))) (+-monotone ≤-refl z≤n))
go (there p) = ≤-trans (go p) (succ-monotone (+-monotone z≤n ≤-refl))
習題:嚴格序關係的另一種定義#
有時候,嚴格小於關係的下列另一種定義會很有用。
data _<'_ : ℕ → ℕ → Set where
base' : {n : ℕ} → n <' succ n
step' : {a b : ℕ} → a <' b → a <' succ b
習題 26
z<'sz<'s : {x : ℕ} → zero <' succ x
z<'s = {!!}
你的解答
習題 27
s<'ss<'s : {x y : ℕ} → x <' y → succ x <' succ y
s<'s = {!!}
你的解答
習題 28
<⇒<'<⇒<' : {x y : ℕ} → x < y → x <' y
<⇒<' = {!!}
你的解答
習題 29
<'⇒<<'⇒< : {x y : ℕ} → x <' y → x < y
<'⇒< = {!!}
你的解答
習題:索引#
習題 30
lookuplookup : {P : ℕ → Set} {n m : ℕ} → All P (downFrom n) → m < n → P m
lookup = {!!}
你的解答