これは停止するらしい
module IndHatena where open import Data.Nat import Level open import Induction.Nat using (<-rec) f : (x : ℕ) -> ℕ f zero = zero f x = f x' where postulate x' : ℕ postulate pr : x' < x f改' : (x : ℕ) -> ((y : ℕ) -> y <′ x -> ℕ) -> ℕ f改' zero _ = zero f改' x f改 = f改 x' pr where postulate x' : ℕ postulate pr : x' <′ x f改 : ℕ -> ℕ f改 = <-rec (λ _ -> ℕ) f改' g' : (x : ℕ) -> ((y : ℕ) -> y <′ x -> ℕ) -> ℕ g' x g = g x' pr where postulate x' : ℕ postulate pr : x' <′ x g : ℕ -> ℕ g = <-rec (λ _ → ℕ) g'
まぁコードはどうでも良くて、気分としては、自然数を取る関数fがあり、今xについて定義しようとしている。
どこからか、xより小さいと分かっている数x'が現れて、f x = f x'である。あと、f zero = zero
と定義したいなーと思ったとしても、Agda2でfを上の通りそのまんま定義してもダメデスよ、と言われます。なぜなら、停止するかどうかが分からないから。
そこで、自然数っていうのは小なりな関係でWell-foundedなので、という事を利用して、兎に角停止性を言ってみたのがf改です。
どんどん小さくなって言って、自然数で一番小さいzeroには最終的になって、zeroは明らかに停まるので多分いけそうだ!という雰囲気そのままなのですが(つまり帰納法の基底が存在している)。
ところが、基底が存在していないgでも停止性が言えてしまいます。
こういうのはOKなのかなぁ。