aboutsummaryrefslogtreecommitdiff
path: root/Data/Circuit
diff options
context:
space:
mode:
authorJacques Comeaux <jacquesrcomeaux@protonmail.com>2025-10-15 13:31:13 -0500
committerJacques Comeaux <jacquesrcomeaux@protonmail.com>2025-10-15 13:31:13 -0500
commit21aa7526f51030be9ffd86be2eabd5d07f64b6f4 (patch)
treef9765e3af0909cfd3f404dd70159902e1f852ad4 /Data/Circuit
parente5ef6bd45cd5fc77e14bea3d2d57b4fc789e6431 (diff)
Strengthen permutation sort theorem
Diffstat (limited to 'Data/Circuit')
-rw-r--r--Data/Circuit/Convert.agda42
1 files changed, 23 insertions, 19 deletions
diff --git a/Data/Circuit/Convert.agda b/Data/Circuit/Convert.agda
index 497b0cd..ce6de69 100644
--- a/Data/Circuit/Convert.agda
+++ b/Data/Circuit/Convert.agda
@@ -5,16 +5,24 @@ module Data.Circuit.Convert where
open import Data.Nat.Base using (ℕ)
open import Data.Circuit.Gate using (Gate; GateLabel; cast-gate; cast-gate-is-id; subst-is-cast-gate)
open import Data.Fin.Base using (Fin)
-open import Function.Bundles using (Equivalence)
open import Data.Hypergraph.Edge GateLabel using (Edge)
-open import Data.Hypergraph.Base GateLabel using (Hypergraph; sortHypergraph)
+open import Data.Hypergraph.Base GateLabel using (Hypergraph; sortHypergraph; mkHypergraph)
open import Data.Hypergraph.Setoid GateLabel using (Hypergraph-Setoid; ≈-Hypergraph)
open import Data.Permutation using (fromList-↭; toList-↭)
open import Data.List using (length)
open import Data.Vec.Functional using (toVec; fromVec; toList; fromList)
-open import Function.Base using (_∘_; id; _$_)
-
+open import Function.Bundles using (Equivalence; _↔_)
+open import Function.Base using (_∘_; id)
+open import Data.List.Relation.Binary.Permutation.Homogeneous using (Permutation)
+open import Data.Product.Base using (proj₁; proj₂; _×_)
+open import Data.Fin.Permutation using (flip; _⟨$⟩ˡ_)
+open import Relation.Binary.PropositionalEquality as ≡ using (_≡_; _≗_)
+
+import Function.Reasoning as →-Reasoning
+import Data.List.Relation.Binary.Permutation.Propositional as L
+import Data.Vec.Functional.Relation.Binary.Permutation as V
import DecorationFunctor.Hypergraph.Labeled as LabeledHypergraph
+
open LabeledHypergraph using (Hypergraph-same) renaming (Hypergraph to Hypergraph′; Hypergraph-setoid to Hypergraph-Setoid′)
to : {v : ℕ} → Hypergraph v → Hypergraph′ v
@@ -37,9 +45,6 @@ from {v} H = record
asEdge : Fin h → Edge v
asEdge e = record { label = l e ; ports = toVec (j e) }
-open import Data.Product.Base using (proj₁; proj₂)
-open import Data.Fin.Permutation using (flip)
-open import Relation.Binary.PropositionalEquality as ≡ using (_≡_)
to-cong : {v : ℕ} {H H′ : Hypergraph v} → ≈-Hypergraph H H′ → Hypergraph-same (to H) (to H′)
to-cong {v} {H} {H′} ≈H = record
{ ↔h = flip ρ
@@ -49,8 +54,6 @@ to-cong {v} {H} {H′} ≈H = record
}
where
open Edge using (arity; ports; label)
- open import Data.List.Relation.Binary.Permutation.Propositional using (_↭_)
- open import Function.Bundles using (_↔_)
open ≈-Hypergraph ≈H
open import Data.Fin.Permutation using (_⟨$⟩ʳ_; _⟨$⟩ˡ_; Permutation′; inverseʳ)
open import Data.Fin.Base using (cast)
@@ -87,11 +90,9 @@ to-cong {v} {H} {H′} ≈H = record
≡.refl
module _ {v : ℕ} where
- open import Data.Hypergraph.Edge GateLabel using (decTotalOrder; ≈-Edge; ≈-Edge⇒≡)
+ open import Data.Hypergraph.Edge GateLabel using (decTotalOrder; ≈-Edge; ≈-Edge-IsEquivalence; ≈-Edge⇒≡)
open import Data.List.Sort (decTotalOrder {v}) using (sort; sort-↭)
open import Data.Permutation.Sort (decTotalOrder {v}) using (sorted-≋)
- open import Data.List.Relation.Binary.Permutation.Propositional using (_↭_)
- open import Data.Vec.Functional.Relation.Binary.Permutation using () renaming (_↭_ to _↭′_)
open import Data.List.Relation.Binary.Pointwise using (Pointwise; Pointwise-≡⇒≡; map)
open import Data.Product.Base using (_,_)
open import Data.Hypergraph.Label using (HypergraphLabel)
@@ -172,21 +173,24 @@ module _ {v : ℕ} where
cast _ (toVec (H′.j e ∘ fincast _)) ≡⟨ cast-toVec (≗a′ e) (H′.j e) ⟩
toVec (H′.j e) ∎
- H∘ρ≗H′ : (e : Fin H′.h) → asEdge H (flip ↔h Data.Fin.Permutation.⟨$⟩ʳ e) ≡ asEdge H′ e
+ H∘ρ≗H′ : (e : Fin H′.h) → asEdge H (↔h ⟨$⟩ˡ e) ≡ asEdge H′ e
H∘ρ≗H′ e = ≈-Edge⇒≡ record
{ ≡arity = ≗a′ e
; ≡label = ≗l′ e
; ≡ports = ≗p′ e
}
+ open Hypergraph using (edges)
+ open →-Reasoning
≡sorted : sortHypergraph (from H) ≡ sortHypergraph (from H′)
≡sorted =
- ≡.cong (λ x → record { edges = x } ) $
- Pointwise-≡⇒≡ $
- map ≈-Edge⇒≡ $
- sorted-≋ $
- toList-↭ $
- flip ↔h , H∘ρ≗H′
+ flip ↔h , H∘ρ≗H′ ∶ asEdge H V.↭ asEdge H′
+ |> toList-↭ ∶ toList (asEdge H) L.↭ toList (asEdge H′)
+ |> L.↭⇒↭ₛ′ ≈-Edge-IsEquivalence ∶ Permutation ≈-Edge (edges (from H)) (edges (from H′))
+ |> sorted-≋ ∶ Pointwise ≈-Edge (sort (edges (from H))) (sort (edges (from H′)))
+ |> map ≈-Edge⇒≡ ∶ Pointwise _≡_ (sort (edges (from H))) (sort (edges (from H′)))
+ |> Pointwise-≡⇒≡ ∶ sort (edges (from H)) ≡ sort (edges (from H′))
+ |> ≡.cong mkHypergraph ∶ sortHypergraph (from H) ≡ sortHypergraph (from H′)
equiv : (v : ℕ) → Equivalence (Hypergraph-Setoid v) (Hypergraph-Setoid′ v)
equiv v = record