Agda大序数(4) 超限递归
交流Q群: 893531731
目录: NonWellFormed.html
本文源码: Recursion.lagda.md
高亮渲染: Recursion.html
从本章开始, 我们会视情况打开 实验性有损合一化 特性, 它可以减少显式标记隐式参数的需要, 而且跟 --safe 是兼容的. 当然它也有一些缺点, 具体这里不会展开.
{-# OPTIONS --without-K --safe --experimental-lossy-unification #-}
module NonWellFormed.Recursion where
前置
本章在内容上延续前三章.
open import NonWellFormed.Ordinal open NonWellFormed.Ordinal.≤-Reasoning open import NonWellFormed.WellFormed using (WellFormed; wrap) open import NonWellFormed.Function
以下标准库依赖在前几章都出现过.
open import Data.Nat as ℕ using (ℕ) open import Data.Sum using (_⊎_; inj₁; inj₂) open import Data.Product using (Σ; _×_; _,_; proj₁; proj₂) open import Relation.Binary.PropositionalEquality as Eq using (_≡_; refl)
超限递归
我们定义超限递归函数 rec F from α₀ by α (读作递归 F 自 α₀ 以 α 次) 如下.
- 若递归以零次, 其值就是初始值 
α₀. - 若递归以 
suc α次, 其值为F作用于α次的值. - 若递归以 
lim f次, 其值为对f n次的值所组成的序列取极限. 
rec_from_by_ : (Ord → Ord) → Ord → Ord → Ord rec F from α₀ by zero = α₀ rec F from α₀ by suc α = F (rec F from α₀ by α) rec F from α₀ by lim f = lim λ n → rec F from α₀ by (f n)
现在给定一个序数函数 F.
private variable
  {F} : Ord → Ord
固定次数
如果固定递归的次数 α, 那么超限递归可以看作是一个高阶函数, 它将序数函数 F 转化成另一个序数函数 rec F from_by α, 它以初始值 α₀ 为自变量.
引理 如果 F 弱增长 (非无穷降链), 那么 rec F from_by α 也弱增长.
rec-from-incr-≤ : ∀ α → ≤-increasing F → ≤-increasing (rec F from_by α)
rec-from-incr-≤     zero    ≤-incr α₀ = ≤-refl
rec-from-incr-≤ {F} (suc α) ≤-incr α₀ = begin
  α₀                                    ≤⟨ rec-from-incr-≤ α ≤-incr α₀ ⟩
  rec F from α₀ by α                    ≤⟨ ≤-incr _ ⟩
  rec F from α₀ by suc α                ∎
rec-from-incr-≤ {F} (lim f) ≤-incr α₀ = begin
  α₀                                    ≤⟨ rec-from-incr-≤ (f 0) ≤-incr α₀ ⟩
  rec F from α₀ by f 0                  ≤⟨ ≤f⇒≤l ≤-refl ⟩
  rec F from α₀ by lim f                ∎
引理 如果 F ≤-单调, 那么 rec F from_by α 也 ≤-单调.
rec-from-mono-≤ : ∀ α → ≤-monotonic F → ≤-monotonic (rec F from_by α) rec-from-mono-≤ zero _ ≤ = ≤ rec-from-mono-≤ (suc γ) ≤-mono ≤ = ≤-mono (rec-from-mono-≤ γ ≤-mono ≤) -- rec F from α by γ ≤ rec F from β by γ rec-from-mono-≤ (lim f) ≤-mono ≤ = l≤ λ n → ≤f⇒≤l (rec-from-mono-≤ (f n) ≤-mono ≤) -- rec F from α by f n ≤ rec F from β by f n
固定初始值
现在我们考察固定初始值 α₀ 的超限递归函数 rec F from α₀ by_.
由定义立即可知 rec F from α₀ by_ 极限连续.
rec-ct : ∀ {F α₀} → continuous (rec F from α₀ by_)
rec-ct _ = ≈-refl
引理 如果 F ≤-单调且强增长, 那么 rec F from α₀ by_ 弱增长.
rec-by-incr-≤ : ∀ {α₀} → ≤-monotonic F → <-increasing F → ≤-increasing (rec F from α₀ by_)
rec-by-incr-≤          ≤-mono <-incr zero    = z≤
rec-by-incr-≤ {F} {α₀} ≤-mono <-incr (suc α) = begin
  suc α                                        ≤⟨ s≤s (rec-by-incr-≤ ≤-mono <-incr α) ⟩
  suc (rec F from α₀ by α)                     ≤⟨ <⇒s≤ (<-incr _) ⟩
  rec F from α₀ by suc α                       ∎
rec-by-incr-≤          ≤-mono <-incr (lim f) = l≤ λ n → ≤f⇒≤l
  (rec-by-incr-≤ ≤-mono <-incr (f n))        -- f n ≤ rec F from α₀ by f n
注意 即使 F 强增长, 我们也只能证明 rec F from α₀ by_ 弱增长. 这里已经可以看出不动点的端倪了, 当递归达到一定次数的时候值可能就不再增长了.
为了证明 rec F from α₀ by_ 的单调性, 我们引入一个辅助概念, 叫做 s∸单调. 它可以看作 F 保持第一章的 s∸≤ 关系.
s∸-monotonic : (Ord → Ord) → Set s∸-monotonic F = ∀ α d → F (suc (α ∸ d)) ≤ F α
引理 如果 F 弱增长, 那么 rec F from α₀ by_ s∸单调.
rec-by-mono-s∸≤ : ∀ {α₀} → ≤-increasing F → s∸-monotonic (rec F from α₀ by_)
rec-by-mono-s∸≤          ≤-incr (suc α) (inj₁ tt) = ≤-refl
rec-by-mono-s∸≤ {F} {α₀} ≤-incr (suc α) (inj₂ d)  = begin
  rec F from α₀ by suc (α ∸ d)                      ≤⟨ rec-by-mono-s∸≤ ≤-incr α d ⟩
  rec F from α₀ by α                                ≤⟨ ≤-incr _ ⟩
  rec F from α₀ by suc α                            ∎
rec-by-mono-s∸≤ {F} {α₀} ≤-incr (lim f) (n , d)   = begin
  rec F from α₀ by suc (f n ∸ d)                    ≤⟨ rec-by-mono-s∸≤ ≤-incr (f n) d ⟩
  rec F from α₀ by f n                              ≤⟨ ≤f⇒≤l ≤-refl ⟩
  rec F from α₀ by lim f                            ∎
引理 如果 F ≤-单调且弱增长, 那么 rec F from α₀ by_ ≤-单调.
rec-by-mono-≤ : ∀ {α₀} → ≤-monotonic F → ≤-increasing F → ≤-monotonic (rec F from α₀ by_)
rec-by-mono-≤          ≤-mono ≤-incr {α} {β} z≤      = rec-from-incr-≤ β ≤-incr _
rec-by-mono-≤ {F} {α₀} ≤-mono ≤-incr {α} {β} (s≤ ≤∸) = begin
  rec F from α₀ by α                                   ≤⟨ ≤-mono (rec-by-mono-≤ ≤-mono ≤-incr ≤∸) ⟩
  rec F from α₀ by suc (β ∸ _)                         ≤⟨ rec-by-mono-s∸≤ ≤-incr β _ ⟩
  rec F from α₀ by β                                   ∎
rec-by-mono-≤ {F} {α₀} ≤-mono ≤-incr {α} {β} (l≤ f≤) = l≤ λ n →
  rec-by-mono-≤ ≤-mono ≤-incr (f≤ n)                 -- rec F from α₀ by f n ≤ rec F from α₀ by β
引理 如果 F ≤-单调且强增长, 那么 rec F from α₀ by_ <-单调.
rec-by-mono-< : ∀ {α₀} → ≤-monotonic F → <-increasing F → <-monotonic (rec F from α₀ by_)
rec-by-mono-< {F} {α₀} ≤-mono <-incr {α} {suc β} < = begin-strict
  rec F from α₀ by α              ≤⟨ rec-by-mono-≤ ≤-mono (<⇒≤-incr <-incr) (<s⇒≤ <) ⟩
  rec F from α₀ by β              <⟨ <-incr _ ⟩
  rec F from α₀ by suc β          ∎
rec-by-mono-< {F} {α₀} ≤-mono <-incr {α} {lim f} ((n , d) , ≤∸) = begin-strict
  rec F from α₀ by α              ≤⟨ rec-by-mono-≤ ≤-mono (<⇒≤-incr <-incr) ≤∸ ⟩
  rec F from α₀ by (f n ∸ d)      <⟨ <-incr _ ⟩
  rec F from α₀ by suc (f n ∸ d)  ≤⟨ rec-by-mono-s∸≤ (<⇒≤-incr <-incr) (f n) d ⟩
  rec F from α₀ by f n            ≤⟨ f≤l ⟩
  rec F from α₀ by lim f          ∎
本章结论
虽然超限递归对递归次数不能保证强增长, 但是对初始值能保证强增长.
定理 如果 F ≤-单调且强增长, 那么 rec F from_by α 也强增长, 只要 α > zero.
rec-from-incr-< : ∀ {α} → α > zero → ≤-monotonic F
  → <-increasing F → <-increasing (rec F from_by α)
rec-from-incr-< {F} {suc α} _ ≤-mono <-incr α₀ = begin-strict
  α₀                      ≤⟨ rec-from-incr-≤ α (<⇒≤-incr <-incr) α₀ ⟩
  rec F from α₀ by α      <⟨ rec-by-mono-< ≤-mono <-incr <s ⟩
  rec F from α₀ by suc α  ∎
rec-from-incr-< {F} {lim f} ((n , d) , ≤∸) ≤-mono <-incr α₀ = <f⇒<l
  (rec-from-incr-< (d , ≤∸) ≤-mono <-incr α₀) -- α₀ < rec F from α₀ by f n
定理 如果 F ≤-单调且强增长, 那么 rec F from α₀ by_ 保良构, 只要初始值良构且 F 保良构.
rec-wfp : ∀ {α₀} → WellFormed α₀ → ≤-monotonic F → <-increasing F
  → wf-preserving F → wf-preserving (rec F from α₀ by_)
rec-wfp wfα₀ ≤-mono <-incr wf-p {zero}  wfα = wfα₀
rec-wfp wfα₀ ≤-mono <-incr wf-p {suc α} wfα = wf-p
  -- WellFormed (rec F from α₀ by α)
  (rec-wfp wfα₀ ≤-mono <-incr wf-p wfα)
rec-wfp wfα₀ ≤-mono <-incr wf-p {lim f} (wfn , wrap mono) =
  -- WellFormed (rec F from α₀ by f n)
  (rec-wfp wfα₀ ≤-mono <-incr wf-p wfn)
  -- rec F from α₀ by f m < rec F from α₀ by f n
  , wrap λ m<n → rec-by-mono-< ≤-mono <-incr (mono m<n)