quipper-demos-0.9.0.0: Quipper/Demos/WithComputed.hs
import Quipper
crazy :: (QData a, QCData b) => (a -> Circ b) -> (a -> Circ (a,b))
crazy f a = do
mapUnary hadamard a
y <- with_computed (f a) $ \b -> do
b' <- qc_copy b
return (a,b')
return y
circuit :: [Qubit] -> Circ ([Qubit], [Qubit])
circuit qs = do
y <- with_computed values $ \values -> do
qc_copy values
return (qs, y)
where
values = do
mapUnary hadamard qs
a <- qinit True
b <- qinit False
qnot_at a `controlled` qs
qnot_at b `controlled` qs .==. [0,0..]
c <- qinit False
qnot_at c `controlled` [a,b]
qnot_at b `controlled` qs .==. [0,0..]
qnot_at a `controlled` qs
qterm False b
qterm True a
return (c:qs)
circuit2 :: [Qubit] -> Circ ([Qubit], ([Qubit], [Qubit]))
circuit2 = crazy circuit
circuit3 :: [Qubit] -> Circ ([Qubit], ([Qubit], ([Qubit], [Qubit])))
circuit3 = crazy circuit2
circuit4 = crazy circuit3
main = print_generic Preview circuit4 (replicate 5 qubit)