From c199e9616f7bd392eb11a4294e920ab1feb20f5d Mon Sep 17 00:00:00 2001 From: Danila Fedorin Date: Fri, 28 Nov 2025 16:22:17 -0800 Subject: [PATCH] Factor some code out into Utils Signed-off-by: Danila Fedorin --- Language/Graphs.agda | 28 +++------------------------- Utils.agda | 25 ++++++++++++++++++++++++- 2 files changed, 27 insertions(+), 26 deletions(-) diff --git a/Language/Graphs.agda b/Language/Graphs.agda index 6dd07c3..69be333 100644 --- a/Language/Graphs.agda +++ b/Language/Graphs.agda @@ -124,28 +124,6 @@ buildCfg (s₁ then s₂) = buildCfg s₁ ↦ buildCfg s₂ buildCfg (if _ then s₁ else s₂) = buildCfg s₁ ∙ buildCfg s₂ buildCfg (while _ repeat s) = loop (buildCfg s) -private - z≢sf : ∀ {n : ℕ} (f : Fin n) → ¬ (zero ≡ suc f) - z≢sf f () - - z≢mapsfs : ∀ {n : ℕ} (fs : List (Fin n)) → All (λ sf → ¬ zero ≡ sf) (List.map suc fs) - z≢mapsfs [] = [] - z≢mapsfs (f ∷ fs') = z≢sf f ∷ z≢mapsfs fs' - - finValues : ∀ (n : ℕ) → Σ (List (Fin n)) Unique - finValues 0 = ([] , Utils.empty) - finValues (suc n') = - let - (inds' , unids') = finValues n' - in - ( zero ∷ List.map suc inds' - , push (z≢mapsfs inds') (Unique-map suc suc-injective unids') - ) - - finValues-complete : ∀ (n : ℕ) (f : Fin n) → f ListMem.∈ (proj₁ (finValues n)) - finValues-complete (suc n') zero = RelAny.here refl - finValues-complete (suc n') (suc f') = RelAny.there (x∈xs⇒fx∈fxs suc (finValues-complete n' f')) - module _ (g : Graph) where open import Data.Product.Properties as ProdProp using () private _≟_ = ProdProp.≡-dec (FinProp._≟_ {Graph.size g}) @@ -154,13 +132,13 @@ module _ (g : Graph) where open import Data.List.Membership.DecPropositional (_≟_) using (_∈?_) indices : List (Graph.Index g) - indices = proj₁ (finValues (Graph.size g)) + indices = proj₁ (fins (Graph.size g)) indices-complete : ∀ (idx : (Graph.Index g)) → idx ListMem.∈ indices - indices-complete = finValues-complete (Graph.size g) + indices-complete = fins-complete (Graph.size g) indices-Unique : Unique indices - indices-Unique = proj₂ (finValues (Graph.size g)) + indices-Unique = proj₂ (fins (Graph.size g)) predecessors : (Graph.Index g) → List (Graph.Index g) predecessors idx = List.filter (λ idx' → (idx' , idx) ∈? (Graph.edges g)) indices diff --git a/Utils.agda b/Utils.agda index 33f8045..0a0ce3a 100644 --- a/Utils.agda +++ b/Utils.agda @@ -1,8 +1,10 @@ module Utils where open import Agda.Primitive using () renaming (_⊔_ to _⊔ℓ_) -open import Data.Product as Prod using (_×_) +open import Data.Product as Prod using (Σ; _×_; _,_; proj₁; proj₂) open import Data.Nat using (ℕ; suc) +open import Data.Fin as Fin using (Fin; suc; zero) +open import Data.Fin.Properties using (suc-injective) open import Data.List using (List; cartesianProduct; []; _∷_; _++_; foldr; filter) renaming (map to mapˡ) open import Data.List.Membership.Propositional using (_∈_) open import Data.List.Membership.Propositional.Properties as ListMemProp using () @@ -106,3 +108,24 @@ _∧_ P Q a = P a × Q a it : ∀ {a} {A : Set a} {{_ : A}} → A it {{x}} = x + +z≢sf : ∀ {n : ℕ} (f : Fin n) → ¬ (Fin.zero ≡ Fin.suc f) +z≢sf f () + +z≢mapsfs : ∀ {n : ℕ} (fs : List (Fin n)) → All (λ sf → ¬ zero ≡ sf) (mapˡ suc fs) +z≢mapsfs [] = [] +z≢mapsfs (f ∷ fs') = z≢sf f ∷ z≢mapsfs fs' + +fins : ∀ (n : ℕ) → Σ (List (Fin n)) Unique +fins 0 = ([] , empty) +fins (suc n') = + let + (inds' , unids') = fins n' + in + ( zero ∷ mapˡ suc inds' + , push (z≢mapsfs inds') (Unique-map suc suc-injective unids') + ) + +fins-complete : ∀ (n : ℕ) (f : Fin n) → f ∈ (proj₁ (fins n)) +fins-complete (suc n') zero = here refl +fins-complete (suc n') (suc f') = there (x∈xs⇒fx∈fxs suc (fins-complete n' f'))