{-# 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.Reset where
open import Pi.Examples.Base
open import Pi.Examples.Toffoli
rearrange : (t₁ t₂ t₃ : Pi.U) → t₁ Pi.× (t₂ Pi.× t₃) Pi.⟷₁ t₂ Pi.× (t₁ Pi.× t₃)
rearrange t₁ t₂ t₃ = assocl⋆ ◎ (swap⋆ ⊗ id⟷₁) ◎ assocr⋆
reset : ∀ n → 𝟚 Pi.× 𝔹 n Pi.⟷₁ 𝟚 Pi.× 𝔹 n
reset O = id⟷₁
reset (S O) = swap⋆ ◎ cnot ◎ swap⋆
reset (S (S n)) = rearrange 𝟚 𝟚 (𝔹 (S n)) ◎ cif (not ⊗ id⟷₁) (reset (S n)) ◎ rearrange 𝟚 𝟚 (𝔹 (S n))
reset^ : ∀ n → _
reset^ = eval₁ ∘ reset
reset+ : ∀ n → _
reset+ = Pi^.quote^₁ ∘ Pi^.quoteNorm₁ idp ∘ Pi^.evalNorm₁ ∘ reset^
reset+test : Fin 8 → Fin 8
reset+test = –> (Pi+.eval₁ (reset+ 2))
reset-test : Fin 8 → Fin 8
reset-test = –> (Pi^.evalNorm₁ (eval₁ (reset 2)))
reset2-perm : Aut (Fin 8)
reset2-perm = equiv f f f-f f-f
where f : Fin 8 → Fin 8
f (O , ϕ) = 0
f (1 , ϕ) = 5
f (2 , ϕ) = 6
f (3 , ϕ) = 7
f (4 , ϕ) = 4
f (5 , ϕ) = 1
f (6 , ϕ) = 2
f (7 , ϕ) = 3
f (n , N.ltSR (N.ltSR (N.ltSR (N.ltSR (N.ltSR (N.ltSR (N.ltSR (N.ltSR ()))))))))
f-f : (x : Fin 8) → f (f x) == x
f-f (O , ϕ) = fin= idp
f-f (1 , ϕ) = fin= idp
f-f (2 , ϕ) = fin= idp
f-f (3 , ϕ) = fin= idp
f-f (4 , ϕ) = fin= idp
f-f (5 , ϕ) = fin= idp
f-f (6 , ϕ) = fin= idp
f-f (7 , ϕ) = fin= idp
f-f (n , N.ltSR (N.ltSR (N.ltSR (N.ltSR (N.ltSR (N.ltSR (N.ltSR (N.ltSR ()))))))))
reset2-perm+ : _
reset2-perm+ = (Pi^.quote^₁ ∘ Pi^.quoteNorm₁ idp) reset2-perm
-- ((true , true , true) , false , true , true) ::
-- ((true , true , false) , false , true , false) ::
-- ((true , false , true) , false , false , true) ::
-- ((true , false , false) , true , false , false) ::
-- ((false , true , true) , true , true , true) ::
-- ((false , true , false) , true , true , false) ::
-- ((false , false , true) , true , false , true) ::
-- ((false , false , false) , false , false , false) :: nil
-- 0 b1 b2 b3 => or(b1,b2,b3) , b1 b2 b3
-- 1 b1 b2 b3 => nor(b1,b2,b3) , b1 b2 b3
-- {-
-- 0000 -> 0000 -> 0 -> 0
-- 0001 -> 1001 -> 1 -> 9
-- 0010 -> 1010 -> 2 -> 10
-- 0011 -> 1011 -> 3 -> 11
-- 0100 -> 1100 -> 4 -> 12
-- 0101 -> 1101 -> 5 -> 13
-- 0110 -> 1110 -> 6 -> 14
-- 0111 -> 1111 -> 7 -> 15
-- 1000 -> 1000 -> 8 -> 8
-- 1001 -> 0001 -> 9 -> 1
-- 1010 -> 0010 -> 10 -> 2
-- 1011 -> 0011 -> 11 -> 3
-- 1100 -> 0100 -> 12 -> 4
-- 1101 -> 0101 -> 13 -> 5
-- 1110 -> 0110 -> 14 -> 6
-- 1111 -> 0111 -> 15 -> 7
-- -}
open import Pi.Examples.Interp
private
test-interp-reset2 = interp-elems (reset 2)
{-
((true , true , true) , false , true , true) ::
((true , true , false) , false , true , false) ::
((true , false , true) , false , false , true) ::
((true , false , false) , true , false , false) ::
((false , true , true) , true , true , true) ::
((false , true , false) , true , true , false) ::
((false , false , true) , true , false , true) ::
((false , false , false) , false , false , false) :: nil
-}
private
test-interp-reset2x+ = interp+-elems (Pi^.quote^₁ (eval₁ (reset 2)))
test-encode-interp-reset2 = map encode-interp-elems test-interp-reset2
-- (true , inr (inr (inr (inr true)))) ::
-- (inr true , inr (inr (inr (inr (inr true))))) ::
-- (inr (inr true) , inr (inr (inr (inr (inr (inr true)))))) ::
-- (inr (inr (inr true)) , inr (inr (inr true))) ::
-- (inr (inr (inr (inr true))) , true) ::
-- (inr (inr (inr (inr (inr true)))) , inr true) ::
-- (inr (inr (inr (inr (inr (inr true))))) , inr (inr true)) ::
-- (inr (inr (inr (inr (inr (inr (inr true)))))) ,
-- inr (inr (inr (inr (inr (inr (inr true)))))))
-- :: nil
-- (true , true) ::
-- (inr true , inr true) ::
-- (inr (inr true) , inr (inr true)) ::
-- (inr (inr (inr true)) , inr (inr (inr true))) ::
-- (inr (inr (inr (inr true))) ,
-- inr (inr (inr (inr (inr (inr true))))))
-- ::
-- (inr (inr (inr (inr (inr true)))) ,
-- inr (inr (inr (inr (inr true)))))
-- ::
-- (inr (inr (inr (inr (inr (inr true))))) ,
-- inr (inr (inr (inr true))))
-- ::
-- (inr (inr (inr (inr (inr (inr (inr true)))))) ,
-- inr (inr (inr (inr (inr (inr (inr true)))))))
-- :: nil
private
test-interp-reset2+ = interp+-elems (reset+ 2)
-- (true , true) ::
-- (inr true , inr true) ::
-- (inr (inr true) , inr (inr true)) ::
-- (inr (inr (inr true)) , inr (inr (inr true))) ::
-- (inr (inr (inr (inr true))) ,
-- inr (inr (inr (inr (inr (inr true))))))
-- ::
-- (inr (inr (inr (inr (inr true)))) ,
-- inr (inr (inr (inr (inr true)))))
-- ::
-- (inr (inr (inr (inr (inr (inr true))))) ,
-- inr (inr (inr (inr true))))
-- ::
-- (inr (inr (inr (inr (inr (inr (inr true)))))) ,
-- inr (inr (inr (inr (inr (inr (inr true)))))))
-- :: nil
private
test-interp-reset^2 = interp^-elems (reset^ 2)
-- (true , true) ::
-- (inr true , inr true) ::
-- (inr (inr true) , inr (inr true)) ::
-- (inr (inr (inr true)) , inr (inr (inr true))) ::
-- (inr (inr (inr (inr true))) ,
-- inr (inr (inr (inr (inr (inr true))))))
-- ::
-- (inr (inr (inr (inr (inr true)))) ,
-- inr (inr (inr (inr (inr true)))))
-- ::
-- (inr (inr (inr (inr (inr (inr true))))) ,
-- inr (inr (inr (inr true))))
-- ::
-- (inr (inr (inr (inr (inr (inr (inr true)))))) ,
-- inr (inr (inr (inr (inr (inr (inr true)))))))
-- :: nil
open import Pi.Equiv.Equiv1NormHelpers
open import Pi.Coxeter.LehmerCoxeterEquiv
open import Pi.Lehmer.LehmerFinEquiv
private
reset^-list = pi^2list (reset^ 2)
reset^-list+ = immersion (–> Fin≃Lehmer reset2-perm)
{-
reset+ 2:
(id⟷₁ ⊕ id⟷₁ ⊕ assocl₊ ◎ (swap₊ ⊕ id⟷₁) ◎ assocr₊) ◎
(id⟷₁ ⊕ assocl₊ ◎ (swap₊ ⊕ id⟷₁) ◎ assocr₊) ◎
(assocl₊ ◎ (swap₊ ⊕ id⟷₁) ◎ assocr₊) ◎
(id⟷₁ ⊕ id⟷₁ ⊕ id⟷₁ ⊕ assocl₊ ◎ (swap₊ ⊕ id⟷₁) ◎ assocr₊) ◎
(id⟷₁ ⊕ id⟷₁ ⊕ assocl₊ ◎ (swap₊ ⊕ id⟷₁) ◎ assocr₊) ◎
(id⟷₁ ⊕ assocl₊ ◎ (swap₊ ⊕ id⟷₁) ◎ assocr₊) ◎
(assocl₊ ◎ (swap₊ ⊕ id⟷₁) ◎ assocr₊) ◎
(id⟷₁ ⊕ id⟷₁ ⊕ id⟷₁ ⊕ id⟷₁ ⊕ assocl₊ ◎ (swap₊ ⊕ id⟷₁) ◎ assocr₊) ◎
(id⟷₁ ⊕ id⟷₁ ⊕ id⟷₁ ⊕ assocl₊ ◎ (swap₊ ⊕ id⟷₁) ◎ assocr₊) ◎
(id⟷₁ ⊕ id⟷₁ ⊕ assocl₊ ◎ (swap₊ ⊕ id⟷₁) ◎ assocr₊) ◎
(id⟷₁ ⊕ assocl₊ ◎ (swap₊ ⊕ id⟷₁) ◎ assocr₊) ◎
(id⟷₁ ⊕
id⟷₁ ⊕ id⟷₁ ⊕ id⟷₁ ⊕ id⟷₁ ⊕ assocl₊ ◎ (swap₊ ⊕ id⟷₁) ◎ assocr₊)
◎
(id⟷₁ ⊕ id⟷₁ ⊕ id⟷₁ ⊕ id⟷₁ ⊕ assocl₊ ◎ (swap₊ ⊕ id⟷₁) ◎ assocr₊) ◎
(id⟷₁ ⊕ id⟷₁ ⊕ id⟷₁ ⊕ assocl₊ ◎ (swap₊ ⊕ id⟷₁) ◎ assocr₊) ◎
(id⟷₁ ⊕ id⟷₁ ⊕ assocl₊ ◎ (swap₊ ⊕ id⟷₁) ◎ assocr₊) ◎ id⟷₁
-}