Documentation

Cslib.Computability.Circuit.Wire

Circuit wires and renamings #

A Wire inputCount gateCount refers to an original input or an internal gate. A valuation of wires is assembled with Wire.elim from values for the inputs and values for the gates.

Wire.Renaming fixes the original inputs and maps each gate to an input or gate in the target namespace. This file provides identity and composition, extension by a gate, replacement of the last gate, and renaming by a permutation.

inductive Cslib.Circuits.Wire (inputCount gateCount : ℕ) :

A wire is either an original input or the output of an earlier gate.

  • input {inputCount gateCount : ℕ} (input : Fin inputCount) : Wire inputCount gateCount

    An original input.

  • gate {inputCount gateCount : ℕ} (gate : Fin gateCount) : Wire inputCount gateCount

    The output of an internal gate.

Instances For
    @[instance_reducible]
    instance Cslib.Circuits.instDecidableEqWire {inputCount✝ gateCount✝ : ℕ} :
    DecidableEq (Wire inputCount✝ gateCount✝)
    def Cslib.Circuits.instDecidableEqWire.decEq {inputCount✝ gateCount✝ : ℕ} (x✝ x✝¹ : Wire inputCount✝ gateCount✝) :
    Decidable (x✝ = x✝¹)
    Instances For
      def Cslib.Circuits.Wire.elim {inputCount gateCount : ℕ} {α : Sort u_1} (inputs : Fin inputCount → α) (gates : Fin gateCount → α) :
      Wire inputCount gateCount → α

      Define a function on wires from its values on inputs and on gates.

      Instances For
        @[simp]
        theorem Cslib.Circuits.Wire.elim_input {inputCount gateCount : ℕ} {α : Sort u_1} (inputs : Fin inputCount → α) (gates : Fin gateCount → α) (i : Fin inputCount) :
        elim inputs gates (input i) = inputs i
        @[simp]
        theorem Cslib.Circuits.Wire.elim_gate {inputCount gateCount : ℕ} {α : Sort u_1} (inputs : Fin inputCount → α) (gates : Fin gateCount → α) (j : Fin gateCount) :
        elim inputs gates (gate j) = gates j
        def Cslib.Circuits.Wire.equiv (inputCount gateCount : ℕ) :
        Wire inputCount gateCount ≃ Fin inputCount ⊕ Fin gateCount

        A wire is an input or a gate.

        Instances For
          @[instance_reducible]
          instance Cslib.Circuits.Wire.instFintype {inputCount gateCount : ℕ} :
          Fintype (Wire inputCount gateCount)
          @[simp]
          theorem Cslib.Circuits.Wire.card {inputCount gateCount : ℕ} :
          Fintype.card (Wire inputCount gateCount) = inputCount + gateCount
          def Cslib.Circuits.Wire.castSucc {inputCount gateCount : ℕ} :
          Wire inputCount gateCount → Wire inputCount (gateCount + 1)

          Regard a wire as a wire in a namespace with one additional gate.

          Instances For
            @[simp]
            theorem Cslib.Circuits.Wire.castSucc_input {inputCount gateCount : ℕ} (i : Fin inputCount) :
            @[simp]
            theorem Cslib.Circuits.Wire.castSucc_gate {inputCount gateCount : ℕ} (j : Fin gateCount) :
            def Cslib.Circuits.Wire.castAdd {inputCount gateCount : ℕ} (extra : ℕ) :
            Wire inputCount gateCount → Wire inputCount (gateCount + extra)

            Regard a wire as a wire of the same program continued by extra further gates.

            Instances For
              @[simp]
              theorem Cslib.Circuits.Wire.castAdd_input {inputCount gateCount : ℕ} (extra : ℕ) (i : Fin inputCount) :
              castAdd extra (input i) = input i
              @[simp]
              theorem Cslib.Circuits.Wire.castAdd_gate {inputCount gateCount : ℕ} (extra : ℕ) (j : Fin gateCount) :
              castAdd extra (gate j) = gate (Fin.castAdd extra j)
              def Cslib.Circuits.Wire.lastCases {inputCount gateCount : ℕ} {motive : Wire inputCount (gateCount + 1) → Sort u_2} (last : motive (gate (Fin.last gateCount))) (castSucc : (wire : Wire inputCount gateCount) → motive wire.castSucc) (wire : Wire inputCount (gateCount + 1)) :
              motive wire

              A wire in a namespace with one additional gate is either the new last gate or an earlier wire.

              Instances For
                structure Cslib.Circuits.Wire.Renaming (inputCount sourceGateCount targetGateCount : ℕ) :

                A renaming of gate wires that fixes every original input. Gate wires may be sent to either inputs or gates in the target namespace.

                • gates : Fin sourceGateCount → Wire inputCount targetGateCount

                  The target wire representing each source gate.

                Instances For
                  def Cslib.Circuits.Wire.Renaming.apply {inputCount sourceGateCount targetGateCount : ℕ} (ρ : Renaming inputCount sourceGateCount targetGateCount) :
                  Wire inputCount sourceGateCount → Wire inputCount targetGateCount

                  Apply an input-fixing wire renaming.

                  Instances For
                    @[instance_reducible]
                    instance Cslib.Circuits.Wire.Renaming.instCoeFunForall {inputCount sourceGateCount targetGateCount : ℕ} :
                    CoeFun (Renaming inputCount sourceGateCount targetGateCount) fun (x : Renaming inputCount sourceGateCount targetGateCount) => Wire inputCount sourceGateCount → Wire inputCount targetGateCount
                    @[simp]
                    theorem Cslib.Circuits.Wire.Renaming.apply_input {inputCount sourceGateCount targetGateCount : ℕ} (ρ : Renaming inputCount sourceGateCount targetGateCount) (input : Fin inputCount) :
                    ρ.apply (Wire.input input) = Wire.input input
                    @[simp]
                    theorem Cslib.Circuits.Wire.Renaming.apply_gate {inputCount sourceGateCount targetGateCount : ℕ} (ρ : Renaming inputCount sourceGateCount targetGateCount) (gate : Fin sourceGateCount) :
                    ρ.apply (Wire.gate gate) = ρ.gates gate
                    def Cslib.Circuits.Wire.Renaming.id {inputCount gateCount : ℕ} :
                    Renaming inputCount gateCount gateCount

                    The identity wire renaming.

                    Instances For
                      @[simp]
                      theorem Cslib.Circuits.Wire.Renaming.id_apply {inputCount gateCount : ℕ} (wire : Wire inputCount gateCount) :
                      id.apply wire = wire
                      def Cslib.Circuits.Wire.Renaming.comp {inputCount sourceGateCount middleGateCount targetGateCount : ℕ} (outer : Renaming inputCount middleGateCount targetGateCount) (inner : Renaming inputCount sourceGateCount middleGateCount) :
                      Renaming inputCount sourceGateCount targetGateCount

                      Compose input-fixing wire renamings.

                      Instances For
                        @[simp]
                        theorem Cslib.Circuits.Wire.Renaming.comp_apply {inputCount sourceGateCount middleGateCount targetGateCount : ℕ} (outer : Renaming inputCount middleGateCount targetGateCount) (inner : Renaming inputCount sourceGateCount middleGateCount) (wire : Wire inputCount sourceGateCount) :
                        (outer.comp inner).apply wire = outer.apply (inner.apply wire)
                        def Cslib.Circuits.Wire.Renaming.castSucc {inputCount gateCount : ℕ} :
                        Renaming inputCount gateCount (gateCount + 1)

                        Include all wires into a namespace with one additional gate.

                        Instances For
                          @[simp]
                          theorem Cslib.Circuits.Wire.Renaming.castSucc_apply {inputCount gateCount : ℕ} (wire : Wire inputCount gateCount) :
                          def Cslib.Circuits.Wire.Renaming.skipLast {inputCount sourceGateCount targetGateCount : ℕ} (prior : Renaming inputCount sourceGateCount targetGateCount) (replacement : Wire inputCount targetGateCount) :
                          Renaming inputCount (sourceGateCount + 1) targetGateCount

                          Extend a renaming while replacing the new last gate by an existing wire.

                          Instances For
                            @[simp]
                            theorem Cslib.Circuits.Wire.Renaming.skipLast_gates_last {inputCount sourceGateCount targetGateCount : ℕ} (prior : Renaming inputCount sourceGateCount targetGateCount) (replacement : Wire inputCount targetGateCount) :
                            (prior.skipLast replacement).gates (Fin.last sourceGateCount) = replacement
                            @[simp]
                            theorem Cslib.Circuits.Wire.Renaming.skipLast_castSucc {inputCount sourceGateCount targetGateCount : ℕ} (prior : Renaming inputCount sourceGateCount targetGateCount) (replacement : Wire inputCount targetGateCount) (wire : Wire inputCount sourceGateCount) :
                            (prior.skipLast replacement).apply wire.castSucc = prior.apply wire
                            def Cslib.Circuits.Wire.Renaming.appendLast {inputCount sourceGateCount targetGateCount : ℕ} (prior : Renaming inputCount sourceGateCount targetGateCount) :
                            Renaming inputCount (sourceGateCount + 1) (targetGateCount + 1)

                            Extend a renaming and retain the new last gate as a fresh target gate.

                            Instances For
                              @[simp]
                              theorem Cslib.Circuits.Wire.Renaming.appendLast_gates_last {inputCount sourceGateCount targetGateCount : ℕ} (prior : Renaming inputCount sourceGateCount targetGateCount) :
                              prior.appendLast.gates (Fin.last sourceGateCount) = gate (Fin.last targetGateCount)
                              @[simp]
                              theorem Cslib.Circuits.Wire.Renaming.appendLast_castSucc {inputCount sourceGateCount targetGateCount : ℕ} (prior : Renaming inputCount sourceGateCount targetGateCount) (wire : Wire inputCount sourceGateCount) :
                              prior.appendLast.apply wire.castSucc = (prior.apply wire).castSucc
                              def Cslib.Circuits.Wire.Renaming.ofPermutation {inputCount gateCount : ℕ} (permutation : Equiv.Perm (Fin gateCount)) :
                              Renaming inputCount gateCount gateCount

                              Rename gate wires by a permutation.

                              Instances For
                                theorem Cslib.Circuits.Wire.Renaming.ofPermutation_gate {inputCount gateCount : ℕ} (permutation : Equiv.Perm (Fin gateCount)) (gate : Fin gateCount) :
                                (ofPermutation permutation).apply (Wire.gate gate) = Wire.gate (permutation gate)
                                theorem Cslib.Circuits.Wire.Renaming.value_apply {inputCount sourceGateCount targetGateCount : ℕ} {U : Type u_1} (ρ : Renaming inputCount sourceGateCount targetGateCount) (inputs : Fin inputCount → U) (oldGates : Fin sourceGateCount → U) (newGates : Fin targetGateCount → U) (preservesGates : ∀ (gate : Fin sourceGateCount), elim inputs newGates (ρ.gates gate) = oldGates gate) (wire : Wire inputCount sourceGateCount) :
                                elim inputs newGates (ρ.apply wire) = elim inputs oldGates wire

                                A source and target gate valuation agree along a renaming when they agree on the image of every source gate. Original inputs agree automatically.