blob: 0be86f91d25fe68dde8ea3eb6841eba28b4dfe88 (
plain)
| 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
 | {-# OPTIONS --without-K --safe #-}
open import Level using (Level; _⊔_)
module Data.Circuit {c ℓ : Level} where
import Data.List as List
open import Data.Circuit.Gate using (Gates)
open import Data.Fin using (Fin)
open import Data.Hypergraph {c} {ℓ} Gates
  using
    ( Hypergraph
    ; mkHypergraph
    ; Hypergraphₛ
    ; module Edge
    ; normalize
    ; _≈_
    ; mk≈
    )
open import Data.Nat using (ℕ)
open import Relation.Binary using (Rel; Setoid)
open import Function.Bundles using (Func; _⟶ₛ_)
open List using (List)
open Edge using (Edge; ≈-Edge⇒≡)
Circuit : ℕ → Set c
Circuit = Hypergraph
map : {n m : ℕ} → (Fin n → Fin m) → Circuit n → Circuit m
map f (mkHypergraph edges) = mkHypergraph (List.map (Edge.map f) edges)
Circuitₛ : ℕ → Setoid c (c ⊔ ℓ)
Circuitₛ = Hypergraphₛ
open Func
open Edge.Sort using (sort)
open import Relation.Binary.PropositionalEquality as ≡ using (_≡_)
open import Data.List.Relation.Binary.Permutation.Propositional using (_↭_; ↭⇒↭ₛ′)
open import Data.List.Relation.Binary.Permutation.Propositional.Properties using (map⁺)
open import Data.List.Relation.Binary.Pointwise as PW using (Pointwise; Pointwise-≡⇒≡)
open import Data.List.Relation.Binary.Permutation.Homogeneous using (Permutation)
import Data.Permutation.Sort as ↭-Sort
mapₛ : {n m : ℕ} → (Fin n → Fin m) → Circuitₛ n ⟶ₛ Circuitₛ m
mapₛ {n} {m} f .to = map f
mapₛ {n} {m} f .cong {mkHypergraph xs} {mkHypergraph ys} x≈y = mk≈ ≡-norm
  where
    open _≈_ x≈y using (↭-edges)
    open ↭-Sort (Edge.decTotalOrder {m}) using (sorted-≋)
    open import Function.Reasoning
    xs′ ys′ : List (Edge m)
    xs′ = List.map (Edge.map f) xs
    ys′ = List.map (Edge.map f) ys
    ≡-norm : mkHypergraph (sort xs′) ≡ mkHypergraph (sort ys′)
    ≡-norm = ↭-edges                        ∶ xs ↭ ys
        |> map⁺ (Edge.map f)                ∶ xs′ ↭ ys′
        |> ↭⇒↭ₛ′ Edge.≈-Edge-IsEquivalence  ∶ Permutation Edge.≈-Edge xs′ ys′
        |> sorted-≋                         ∶ Pointwise Edge.≈-Edge (sort xs′) (sort ys′)
        |> PW.map ≈-Edge⇒≡                  ∶ Pointwise _≡_ (sort xs′) (sort ys′)
        |> Pointwise-≡⇒≡                    ∶ sort xs′ ≡ sort ys′
        |> ≡.cong mkHypergraph              ∶ mkHypergraph (sort xs′) ≡ mkHypergraph (sort ys′)
 |