{-# OPTIONS --without-K --exact-split --rewriting --overlapping-instances #-}
open import HoTT hiding (_<_ ; ltS ; ltSR ; _+_ ; _×_)
import lib.types.Nat as N
import lib.types.Sigma as S
open import Pi.UFin.BAut
open import Pi.Common.Misc
open import Pi.Common.Extra
open import Pi.Syntax.Pi+.Indexed as Pi+
open import Pi.Syntax.Pi^ as Pi^
open import Pi.Syntax.Pi^Helpers as Pi^
open import Pi.Syntax.Pi as Pi
open import Pi.Equiv.Translation2
import Pi.Equiv.Equiv1 as Pi+
import Pi.Equiv.Equiv0Hat as Pi^
import Pi.Equiv.Equiv1Hat as Pi^
import Pi.Equiv.Equiv0Norm as Pi^
import Pi.Equiv.Equiv1Norm as Pi^
open import Pi.UFin.UFin
open import Pi.UFin.Monoidal
open import Pi.Common.FinHelpers
open import Pi.Lehmer.FinExcept
module Pi.Examples.Incr where
open import Pi.Examples.Base
open import Pi.Examples.Toffoli
open import Pi.Examples.Reset
fst2last : ∀ n → 𝔹 n Pi.⟷₁ 𝔹 n
fst2last O = id⟷₁
fst2last (S O) = id⟷₁
fst2last (S (S O)) = swap⋆
fst2last (S (S (S n))) = rearrange 𝟚 𝟚 (𝔹 (S n)) ◎ (id⟷₁ ⊗ fst2last (S (S n)))
incr : ∀ n → 𝔹 n Pi.⟷₁ 𝔹 n
incr O = id⟷₁
incr (S O) = swap₊
incr (S (S n)) = (id⟷₁ ⊗ incr (S n)) ◎ fst2last (S (S n)) ◎ toffoli (S (S n)) ◎ Pi.!⟷₁ (fst2last (S (S n)))
incr^ : ∀ n → _
incr^ = eval₁ ∘ incr
incr+ : ∀ n → _
incr+ = Pi^.quote^₁ ∘ Pi^.quoteNorm₁ idp ∘ Pi^.evalNorm₁ ∘ incr^
incr+test : Fin 4 → Fin 4
incr+test = –> (Pi+.eval₁ (incr+ 2))
incr+test-0 : incr+test 0 == 1
incr+test-0 = fin= idp
incr+test-1 : incr+test 1 == 2
incr+test-1 = fin= idp
incr+test-2 : incr+test 2 == 3
incr+test-2 = fin= idp
incr+test-3 : incr+test 3 == 0
incr+test-3 = fin= idp
open import Pi.Examples.Interp
private
test-interp-incr2 = interp-elems (incr 2)
test-interp-incr2+ = interp+-elems (Pi^.quote^₁ (eval₁ (incr 2)))
test-interp-incr2^ = interp+-elems (incr+ 2)
test-encode-interp-incr2 = map encode-interp-elems test-interp-incr2