Skip to content

Commit 9daa86c

Browse files
authored
Added a new ≤-Induction (#1798)
1 parent db205ce commit 9daa86c

File tree

3 files changed

+34
-8
lines changed

3 files changed

+34
-8
lines changed

CHANGELOG.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2214,3 +2214,13 @@ This is a full list of proofs that have changed form to use irrelevant instance
22142214
```agda
22152215
↔-fun : A ↔ B → C ↔ D → (A → C) ↔ (B → D)
22162216
```
2217+
2218+
* Added new function to `Data.Fin.Properties`
2219+
```agda
2220+
i≤inject₁[j]⇒i≤1+j : i ≤ inject₁ j → i ≤ suc j
2221+
```
2222+
2223+
* Added new function to `Data.Fin.Induction`
2224+
```agda
2225+
<-weakInduction-startingFrom : P i → (∀ j → P (inject₁ j) → P (suc j)) → ∀ {j} → j ≥ i → P j
2226+
```

src/Data/Fin/Induction.agda

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@
88

99
open import Data.Fin.Base
1010
open import Data.Fin.Properties
11-
open import Data.Nat.Base as ℕ using (ℕ; zero; suc; _∸_)
12-
open import Data.Nat.Properties using (n<1+n)
11+
open import Data.Nat.Base as ℕ using (ℕ; zero; suc; _∸_; s≤s)
12+
open import Data.Nat.Properties using (n<1+n; ≤⇒≯)
1313
import Data.Nat.Induction as ℕ
1414
import Data.Nat.Properties as ℕ
1515
open import Data.Product using (_,_)
@@ -25,6 +25,7 @@ import Relation.Binary.Construct.Converse as Converse
2525
import Relation.Binary.Construct.Flip as Flip
2626
import Relation.Binary.Construct.NonStrictToStrict as ToStrict
2727
import Relation.Binary.Construct.On as On
28+
open import Relation.Binary.Definitions using (Tri; tri<; tri≈; tri>)
2829
open import Relation.Binary.PropositionalEquality
2930
open import Relation.Nullary using (yes; no)
3031
open import Relation.Nullary.Negation using (contradiction)
@@ -48,16 +49,27 @@ open WF public using (Acc; acc)
4849
<-wellFounded : WellFounded {A = Fin n} _<_
4950
<-wellFounded = On.wellFounded toℕ ℕ.<-wellFounded
5051

52+
<-weakInduction-startingFrom : (P : Pred (Fin (suc n)) ℓ)
53+
{i} P i
54+
( j P (inject₁ j) P (suc j))
55+
{j} j ≥ i P j
56+
<-weakInduction-startingFrom P {i} Pi Pᵢ⇒Pᵢ₊₁ {j} j≥i = induct (<-wellFounded _) (<-cmp i j) j≥i
57+
where
58+
induct : {j} Acc _<_ j Tri (i < j) (i ≡ j) (i > j) j ≥ i P j
59+
induct (acc rs) (tri≈ _ refl _) i≤j = Pi
60+
induct (acc rs) (tri> _ _ i>sj) i≤j with () ≤⇒≯ i≤j i>sj
61+
induct {suc j} (acc rs) (tri< (s≤s i≤j) _ _) _ = Pᵢ⇒Pᵢ₊₁ j P[1+j]
62+
where
63+
toℕj≡toℕinjJ = sym $ toℕ-inject₁ j
64+
P[1+j] = induct (rs _ (s≤s (subst (ℕ._≤ toℕ j) toℕj≡toℕinjJ ≤-refl)))
65+
(<-cmp i $ inject₁ j) (subst (toℕ i ℕ.≤_) toℕj≡toℕinjJ i≤j)
66+
5167
<-weakInduction : (P : Pred (Fin (suc n)) ℓ)
5268
P zero
5369
( i P (inject₁ i) P (suc i))
5470
i P i
55-
<-weakInduction P P₀ Pᵢ⇒Pᵢ₊₁ i = induct (<-wellFounded i)
56-
where
57-
induct : {i} Acc _<_ i P i
58-
induct {zero} _ = P₀
59-
induct {suc i} (acc rec) = Pᵢ⇒Pᵢ₊₁ i (induct (rec (inject₁ i) i<i+1))
60-
where i<i+1 = ℕ<⇒inject₁< (i<1+i i)
71+
<-weakInduction P P₀ Pᵢ⇒Pᵢ₊₁ i = <-weakInduction-startingFrom P P₀ Pᵢ⇒Pᵢ₊₁ ℕ.z≤n
72+
6173

6274
------------------------------------------------------------------------
6375
-- Induction over _>_

src/Data/Fin/Properties.agda

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -456,6 +456,10 @@ inject₁ℕ≤ = ℕₚ.<⇒≤ ∘ inject₁ℕ<
456456
ℕ<⇒inject₁< : {i : Fin (ℕ.suc n)} {j : Fin n} j < i inject₁ j < i
457457
ℕ<⇒inject₁< {i = suc i} (s≤s j≤i) = ≤̄⇒inject₁< j≤i
458458

459+
i≤inject₁[j]⇒i≤1+j : i ≤ inject₁ j i ≤ suc j
460+
i≤inject₁[j]⇒i≤1+j {i = zero} i≤j = z≤n
461+
i≤inject₁[j]⇒i≤1+j {i = suc i} {j = suc j} (s≤s i≤j) = s≤s (ℕₚ.≤-step (subst (toℕ i ℕ.≤_) (toℕ-inject₁ j) i≤j))
462+
459463
------------------------------------------------------------------------
460464
-- lower₁
461465
------------------------------------------------------------------------

0 commit comments

Comments
 (0)