Documentation

CsdLean4.RecordLayer.JoinArena

SigmaLayer/JoinArena: the projective join — Liouville-preserving degenerate Lüders #

Category: 7-SigmaLayer (dynamical measurement — the degenerate-Lüders construction, brick 3: the Liouville half).

The identification that makes brick 3 cheap #

PhaseSlot.lean realised the degenerate Lüders update on phase-enriched vector pairs. This module observes that the phase-enriched pair arena is the projective join: a point of ℙ(ℂᴺ ⊕ ℂᴺ) = ℙ(ℂ^{N+N}) is a system-and-slot pair quotiented only by the global phase — so the relative phase, the coordinate the sharpened wall demanded, survives in the point itself. On this arena:

The three-brick arc, closed at the state level #

  1. BlockCollapse.lean: the target is a relocation; the mechanism exists on vectors; the wall is the relative phase.
  2. PhaseSlot.lean: keep the phase → the update works with fixed calibration (measure form).
  3. Here: the phase-kept arena is ℙ(ℂ^{N+N}), the dynamics is unitary — Liouville-preserving by FS invariance, Lüders pointwise.

⚠️ What remains for full protocol integration (recorded, mechanical) #

The register/sector plumbing: a MeasurementProtocol on ℙ(ℂ^{N+N}) × T²_R whose record trigger fires joinSwap, mirroring SwapWitness, and the conditioned-marginal bookkeeping tying join_block_luders to a BlockLudersObligation instance. Both consume only theorems proved here and machinery that already exists (specs/BACKLOG.md, effort M); neither requires new mathematics. Until that lands, swap_not_blockLuders remains the recorded boundary for the ray-pair SwapArena — the join arena is where degenerate measurements live.

References #

SigmaLayer/BlockCollapse.lean (componentSwap, brick 1); SigmaLayer/PhaseSlot.lean (brick 2 — the measure form); SigmaLayer/DegenerateLuders.lean (swap_not_blockLuders, blockProj); Mathlib/LinearAlgebra/Projectivization/FubiniStudy.lean (fubiniStudyMeasure_smul_invariant — the Liouville driver); specs/BACKLOG.md.

componentSwap, entrywise #

theorem CSD.RecordLayer.componentSwap_fst_apply {N K : } (b : Fin NFin K) (i : Fin K) (p : EuclideanSpace (Fin N) × EuclideanSpace (Fin N)) (j : Fin N) :
(componentSwap b i p).1.ofLp j = if b j = i then p.1.ofLp j else p.2.ofLp j
theorem CSD.RecordLayer.componentSwap_snd_apply {N K : } (b : Fin NFin K) (i : Fin K) (p : EuclideanSpace (Fin N) × EuclideanSpace (Fin N)) (j : Fin N) :
(componentSwap b i p).2.ofLp j = if b j = i then p.2.ofLp j else p.1.ofLp j

The join permutation and its unitary #

def CSD.RecordLayer.swpSum {N K : } (b : Fin NFin K) (i : Fin K) :
Fin N Fin NFin N Fin N

The block-complement swap on the doubled index set: fix the block-i coordinates of both copies, exchange the complements.

Equations
Instances For
    theorem CSD.RecordLayer.swpSum_involutive {N K : } (b : Fin NFin K) (i : Fin K) :
    def CSD.RecordLayer.joinPerm {N K : } (b : Fin NFin K) (i : Fin K) :
    Fin (N + N)Fin (N + N)

    The join permutation on Fin (N + N).

    Equations
    Instances For
      def CSD.RecordLayer.joinMat {N K : } (b : Fin NFin K) (i : Fin K) :
      Matrix (Fin (N + N)) (Fin (N + N))

      The permutation matrix of the join swap.

      Equations
      Instances For
        theorem CSD.RecordLayer.joinMat_mulVec {N K : } (b : Fin NFin K) (i : Fin K) (w : Fin (N + N)) :
        (joinMat b i).mulVec w = fun (j : Fin (N + N)) => w (joinPerm b i j)
        theorem CSD.RecordLayer.joinMat_mem_unitaryGroup {N K : } (b : Fin NFin K) (i : Fin K) :

        The join swap is a unitary — a permutation matrix.

        noncomputable def CSD.RecordLayer.joinU {N K : } (b : Fin NFin K) (i : Fin K) :

        The join unitary.

        Equations
        Instances For

          The doubled vectors #

          noncomputable def CSD.RecordLayer.dblVec {N : } (v α : EuclideanSpace (Fin N)) :

          The doubled vector: system in the first copy, slot in the second.

          Equations
          Instances For
            @[simp]
            theorem CSD.RecordLayer.dblVec_inl {N : } (v α : EuclideanSpace (Fin N)) (k : Fin N) :
            @[simp]
            theorem CSD.RecordLayer.dblVec_inr {N : } (v α : EuclideanSpace (Fin N)) (k : Fin N) :
            theorem CSD.RecordLayer.dblVec_ne_zero {N : } {v : EuclideanSpace (Fin N)} (hv : v 0) (α : EuclideanSpace (Fin N)) :
            dblVec v α 0
            theorem CSD.RecordLayer.toEuclideanLin_joinMat_dblVec {N K : } (b : Fin NFin K) (i : Fin K) (ψ α : EuclideanSpace (Fin N)) :
            (Matrix.toEuclideanLin (joinMat b i)) (dblVec ψ α) = dblVec (componentSwap b i (ψ, α)).1 (componentSwap b i (ψ, α)).2

            The action of the join unitary on a doubled vector is exactly the component swap.

            The join dynamics #

            noncomputable def CSD.RecordLayer.joinSwap {N K : } (b : Fin NFin K) (i : Fin K) :
            LF4.CPN (N + N)LF4.CPN (N + N)

            The join swap on rays: the unitary action of the permutation on ℙ(ℂ^{N+N}).

            Equations
            Instances For

              ★★ Liouville preservation, discharged. The join swap is a unitary, so it preserves the Fubini–Study measure — the obligation recorded as brick 3's hard half, closed by fubiniStudyMeasure_smul_invariant.

              The system readout #

              The first-copy projection, as a linear map.

              Equations
              Instances For
                @[simp]
                noncomputable def CSD.RecordLayer.joinFstAux {N : } [NeZero N] (v : { w : EuclideanSpace (Fin (N + N)) // w 0 }) :

                The vector-level readout representative: first copy where nonzero, junk vertex otherwise.

                Equations
                Instances For
                  theorem CSD.RecordLayer.joinFstAux_coe_of_ne {N : } [NeZero N] {v : { w : EuclideanSpace (Fin (N + N)) // w 0 }} (h : fstPart v 0) :
                  (joinFstAux v) = fstPart v

                  On the physical branch (nonzero system component), the readout representative IS the first copy (interface lemma, §9.1 — the case split its unfold sites re-derive).

                  theorem CSD.RecordLayer.joinFstAux_coe_of_eq {N : } [NeZero N] {v : { w : EuclideanSpace (Fin (N + N)) // w 0 }} (h : fstPart v = 0) :

                  On the junk branch (vanishing system component), the readout representative is the documented junk vertex (interface lemma, §9.1).

                  noncomputable def CSD.RecordLayer.joinFst {N : } [NeZero N] :
                  LF4.CPN (N + N)LF4.CPN N

                  The system readout from the join: project a join microstate to its system ray (junk vertex where the system component vanishes — documented, off the physical set).

                  Equations
                  Instances For

                    The readout is measurable — same coinduced-Borel route as blockCollapse.

                    The pointwise Lüders update #

                    theorem CSD.RecordLayer.join_block_luders {N K : } [NeZero N] (b : Fin NFin K) (i : Fin K) {ψ α : EuclideanSpace (Fin N)} (hψ0 : ψ 0) (hPi : (blockProj b i) ψ 0) ( : (blockProj b i) α = α) :

                    ★★ Degenerate Lüders on the join arena, pointwise. For every join microstate [ψ ⊕ α] with nonvanishing block-i component and block-calibrated slot, the post-swap system readout is exactly the Lüders-collapsed ray [Πᵢψ]. Deterministic at every microstate; combined with joinSwap_measurePreserving, the update is a Liouville-preserving unitary dynamics whose readout is the Lüders update — the construction swap_not_blockLuders proved impossible on the ray-pair arena, delivered on the join.