Apunte
Apunte
Alejandro Díaz-Caro
Instituto de Investigación en Ciencias de la Computación
(CONICET / Universidad de Buenos Aires)
& Universidad Nacional de Quilmes
version 2018-06-25
Enfoque de este apunte
Materia:
Introducción a la computación cuántica y fundamentos de lenguajes de programación
CC 2015–2018 Creative Commons Attibution 4.0 Internacional.
Podés ver una copia de la licencia en http://creativecommons.org/licenses/by/4.0/.
Índice general
3
3. Introducción a la mecánica cuántica 35
3.1. Postulados de la mecánica cuántica . . . . . . . . . . . . . . . . . . . . . 35
3.1.1. Medición proyectiva . . . . . . . . . . . . . . . . . . . . . . . . . . 36
3.1.1.1. Preliminares . . . . . . . . . . . . . . . . . . . . . . . . 36
3.1.1.2. Medición proyectiva . . . . . . . . . . . . . . . . . . . . 38
3.1.2. Fase . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
3.2. Operador densidad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
3.2.1. Preliminares . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
3.2.2. Conjuntos de estados cuánticos . . . . . . . . . . . . . . . . . . . 40
3.2.3. Propiedades generales del operador densidad . . . . . . . . . . . . 42
3.2.4. El operador densidad reducido . . . . . . . . . . . . . . . . . . . . 44
3.2.4.1. Teleportación cuántica y el operador densidad reducido . 45
I feel that a deep understanding of why quantum algorithms work is still lac-
king. Surely the power of quantum computers has something to do with entan-
glement, quantum parallelism, and the vastness of Hilbert space, but I think
that it should be possible to pinpoint more precisely the true essence of the
matter. John Preskill [1998]
1.1. Introducción
La computación cuántica, una rama de las ciencias de la computación teórica, tiene su
origen en la física, y más precisamente en el físico estadounidense Richard Feynman,
quien en 1981 dedicó una charla en el Massachusetts Institute of Technology (MIT) al
problema de la simulación de la física cuántica con computadoras clásicas. Sus ya célebres
palabras finales resumen su frustración de ese entonces:
And I’m not happy with all the analyses that go with just the classical theory,
because nature isn’t classical, dammit, and if you want to make a simulation of
nature, you’d better make it quantum mechanical, and by golly it’s a wonderful
problem, because it doesn’t look so easy. Thank you.
(ver, por ejemplo, [Brown, 2001, pp.100])
Esta provocación, lejos de plantear soluciones, abrió las puertas a interrogantes nunca
antes concebidos. ¿Qué ganancia se lograría si las computadoras fuesen regidas por las
leyes de la mecánica cuántica? Fueron los algoritmos de Grover [1996] y Shor [1997] los
cuales despertaron el gran interés desde las ciencias de la computación en este nuevo
paradigma. El primero es un algoritmo de búsqueda sobre registros desordenados, el cual
provee una ganancia cuadrática de complejidad temporal frente a cualquier algoritmo
clásico conocido. El segundo es un algoritmo para la factorización de números, con una
ganancia exponencial.
Actualmente existen muchas áreas de investigación dentro de la computación cuántica.
Por ejemplo, desde un punto de vista práctico se plantea el problema de construir el
hardware de una computadora cuántica. Desde sus orígenes, en las palabras de Feinmann,
7
8 1.1. Introducción
la idea es que un algoritmo cuántico sea una simulación cuántica en hardware que se
comporta de acuerdo a las leyes de la física cuántica. Es decir que un experimento cuántico
en un laboratorio, puede considerarse como un algoritmo. O dicho de otro modo: podemos
describir el comportamiento de un sistema cuántico a través de un algoritmo. La pregunta
es, ¿podemos realizar el experimento cuántico que describe un algoritmo dado? Allí es
donde se manifiesta el desafío técnico.
Otra área es la de desarrollar algoritmos que obtengan una ganancia con respecto a su
contraparte clásica. En general los algoritmos de Grover y Shor mencionados anterior-
mente se consideran como los ejemplos canónicos de aceleración obtenida gracias a la
computación cuántica. Muchos otros algoritmos cuánticos son derivados de ellos. La pre-
gunta aquí es ¿qué otros algoritmos podemos obtener que nos den una ganancia respecto
a los algoritmos clásicos?
Otra rama de investigación es la del diseño de lenguajes de programación que permitan
expresar los algoritmos cuánticos de una manera amigable, y quizá permitiendo descubrir
nuevos algoritmos al tener una herramienta de alto nivel para pensarlos.
Desde un punto de vista más fundamental, y como lo expresara Preskill en la cita que
abre este capítulo, los fundamentos lógicos detrás de la computación cuántica, siguen
siendo un misterio. Si bien existe una lógica cuántica [Birkhoff y von Neumann, 1936],
ésta fue propuesta muchos años antes de la computación cuántica, por lo que encontrar la
correspondencia entre computación y lógica cuántica no es trivial. Esta área tiene muchas
subáreas con metodologías diferentes. En particular, el estudio de semántica de lenguajes
de programación sigue este objetivo. En este caso no se persigue el estudio del lenguaje
en sí mismo, sino que el objetivo es el estudio de la lógica subyacente. Estudiar la lógica
detrás de la computación cuántica implica estudiar la lógica detrás de la física cuántica,
lo cual puede tener influencia en el desarrollo de nuevas teorías sobre el mundo que nos
rodea.
En esta materia nos interesan los dos últimos aspectos: lenguajes de programación que
permitan expresar el cómputo cuántico de una manera estructurada y amigable, y el
estudio de propiedades de lenguajes que nos acerquen hacia una lógica computacional de
la física cuántica.
Definición 1.3 (Sucesión de Cauchy). Sea ~vn una sucesión de vectores del espacio E.
Si k~vn − ~vm k → 0 cuando n, m → ∞, entonces la sucesión ~vn es una sucesión de Cauchy.
(Esto quiere decir que puedo hacer distar entre sí los términos tan poco como quiera).
Definición 1.6 (Producto tensorial). Sean E y F dos espacios vectoriales con bases
canónicas B = {~bi | i ∈ I} y C = {~cj | j ∈ J} respectivamente. El producto tensorial
E ⊗ F de E y F es el espacio vectorial de base canónica {~bi ⊗ ~cj | i ∈ I y j ∈ J}, donde
~bi ⊗ ~cj es el par ordenado formado por el vector ~bi y el vector ~cj . La operación ⊗ se
extiende a vectores de E y F bilinearmente:
X X X
( αi~bi ) ⊗ ( βj~cj ) = αi βj (~bi ⊗ ~cj )
i j ij
S × T = {~u ⊗ ~v | ~u ∈ S, ~v ∈ T }
Ejemplos 1.10.
5 6 5 6 5 6 10 12
1 2
1 2 5 6
7 8 7 8 7 8 14
16
⊗ = =
3 4 7 8 5 6 5 6 15 18 20 24
3 4
7 8 7 8 21 24 28 32
3 3
1
1 3
4 = 4
⊗ =
2 4 3 6
2
4 8
Capítulo 1. Introducción a la computación cuántica 11
Observación. El producto escalar, o producto interno, entre dos vectores nos da un nú-
mero. El producto tensorial, o producto externo, entre dos vectores nos da un vector de
mayor dimensión.
Como se dijo anteriormente, E × F 6= E ⊗ F , y por lo tanto:
Demostración. Supongamos que existen ~v1 y ~v2 tales que ~v1 ⊗ ~v2 = ~v , entonces
ac α
ac = α
a c ad 0 ad = 0
⊗ = = ⇒
b d bc 0
bc = 0
bd β bd = β
y como estos son dos vectores ortogonales (por ende, forman una base), ahora es posible
también escribir cualquier vector de C2 como combinación lineal de |+i y |−i.
Por ejemplo:
α 1 1
= α|0i + β|1i = √ (α + β)|+i + √ (α − β)|−i
β 2 2
Observación. Al menos que se indique lo contrario, en el resto del apunte consideraremos
n
el espacio complejo de dimensión N = 2n , CN = C2 .
Observaciones.
Haciendo un abuso de notación, podemos escribir vectores como el siguiente:
Si tomamos la base canónica de CN , con |ui i el vector i-ésimo de dicha base, pode-
mos calcular la componente i-ésima de un vector cualquiera de la siguiente manera:
N
X N
X
hui |ψi = hui | aj |uj i = aj hui |uj i = ai
| {z }
j=1 j=1
δij
Capítulo 1. Introducción a la computación cuántica 13
N
P
Teorema 1.13. Sea B = {|u1 i, . . . , |uN i} una base ortonormal, entonces |ui ihui | = I.
i=1
Demostración.
N
! N
! N
!
X X X
|ui ihui | |ψi = |ui ihui | aj |ui i
i=1 i=1 j=1
N X
X N N
X
= aj |ui i hui |uj i = ai |ui i = |ψi
| {z }
i=1 j=1 i=1
δij
Observaciones.
N
b∗i hui |.
P
Análogamente a los kets, todo bra hφ| puede ser descompuesto como hφ| =
i=1
Observación. De aquí en más, trabajaremos sólo con los vectores normalizados de CN (es
decir, vectores cuya norma es 1). Esto es
N
! N ! N N
X X X X
2 ∗ ∗
1 = kψk = hψ|ψi = aj huj | ai |ui i = aj ai huj |ui i = |ai |2 = 1
| {z }
j=1 i=1 i,j=1 i=1
δij
Es decir, trabajamos con vectores cuya suma de los módulos al cuadrado de sus compo-
nentes es 1.
PN
Es decir, las componentes del vector A|ψi son bi = j=1 αij aj .
Observación. Considerando la base {|0i, |1i} de C2 , cualquier qubit puede escribirse como
|ψi = α|0i + β|1i, con |α|2 + |β|2 = 1.
Observaciones.
En lugar de escribir |0i ⊗ |1i ⊗ · · · ⊗ |0i escribimos |01 . . . 0i.
1.3.3. Operadores
Definición 1.16 (Operador). Un operador de CN es una matriz cuadrada de dimensión
N a coeficientes complejos.
1 0
Ejemplo 1.19. Tomemos la base {|0i, |1i}, con |0i = y |1i = . Un vector |ψi
0 1
cualquiera puede escribirse como |ψi = α|0i + β|1i. Por lo tanto
U −1 es unitario.
Definición 1.23 (Compuertas cuánticas). A los operadores unitarios se les llama com-
puertas cuánticas, como analogía a las compuertas lógicas de la computación clásica, ya
que serán esos los que se utilizan para realizar el cómputo.
Observación. La mayoría de las compuertas cuánticas que usaremos a lo largo del curso
serán además de operadores unitarios, hermíticos, por lo que coinciden con su inversa.
Definición 1.24 (Evolución). Se dice que un sistema representado por un ket |ψi evo-
luciona al sistema |φi, cuando se realiza una de las siguientes operaciones:
|φi = U |ψi
16 1.3. Bits cuánticos y operadores
Observaciones.
U M
Usaremos también la notación |ψi −
→ |φi o |ψi −→ |φi para indicar que el ket |ψi
evoluciona al ket |φi.
Cuando se quiera hacer evolucionar sólo un qubit de un sistema de n-qubits, digamos
el qubit i, se premultiplica tensorialmente i − 1 veces y se postmultiplica n − i − 1
veces la compuerta a aplicar por la matriz identidad. Ejemplo: U aplicada al segundo
qubit de un sistema de 2–qubits, será la compuerta I ⊗ U .
Ejemplo 1.25. Consideramos el operador medición de {M0 , M1 } con
1 0 0 0
M0 = |0ih0| = M1 = |1ih1| =
0 0 0 1
La identidad I:
I|0i = |0i 1 0
donde: I=
I|1i = |1i 0 1
La negación X:
X|0i = |1i 0 1
donde: X=
X|1i = |0i 1 0
El cambio de fase Z:
Z|0i = |0i 1 0
donde: Z=
Z|1i = −|1i 0 −1
La No-controlada CN OT :
CN OT |0xi = |0xi I 0
donde: CN OT =
CN OT |1xi = |1i ⊗ X|xi 0 X
En particular, las matrices I, X, iXZ y Z son las llamadas matrices de Pauli en honor
a Wolfgang Pauli
|xi H •
βxy
|yi
Es decir, partiendo del estado inicial |xyi, se aplica H al primer qubit. Luego se aplica
CN OT a ambos, donde el primero es el de control (marcado con el punto negro). En
otras palabras, este circuito representa la siguiente ecuación:
βxy = CN OT (H ⊗ I)|xyi
Las posibles salidas de este circuito, cuando x e y varían entre 0 y 1 son las siguientes:
H(1) 1 1 CN OT (1,2) 1
|00i −−→ √ (|0i + |1i) |0i = √ (|00i + |10i) −−−−−−→ √ (|00i + |11i) = β00
2 2 2
H(1) 1 1 CN OT (1,2) 1
|01i −−→ √ (|0i + |1i) |1i = √ (|01i + |11i) −−−−−−→ √ (|01i + |10i) = β01
2 2 2
H(1) 1 1 CN OT (1,2) 1
|10i −−→ √ (|0i − |1i) |0i = √ (|00i − |10i) −−−−−−→ √ (|00i − |11i) = β10
2 2 2
H(1) 1 1 CN OT (1,2) 1
|11i −−→ √ (|0i − |1i) |1i = √ (|01i − |11i) −−−−−−→ √ (|01i − |10i) = β11
2 2 2
Observación. β00 = (X ⊗ I)β01 = (Z ⊗ I)β10 = (XZ ⊗ I)β11 .
A estos cuatro estados se les llama Estados de Bell, en honor a John S. Bell. Estos son
estados entrelazados, es decir, estados que no pueden representarse como el producto
tensorial de dos estados individuales.
A los estados entrelazados también se les llama estados EPR por Einstein, Podolsky, y
Rosen [1935] quienes detectaron, en pleno auge de las formulaciones de la teoría cuántica,
que existía una acción a distancia que parecía no razonable. Por muchos años se llamó la
“paradoja EPR”. Lo que determinaron es que cuando se tiene un par entrelazado (física-
mente el estado representa por ejemplo el spin en un par de electrones, o la polarización
de un par de fotones), sucede que cuando se colapsa (por acción de la medición) un estado
del par, el segundo también colapsará, incluso cuando físicamente se encuentren a años
luz de distancia. Con el tiempo se demostró experimentalmente que esto es exactamente
lo que sucede, y por lo tanto no hay paradoja. También se demuestra que esto no contra-
dice la teoría de la relatividad (que entre otras cosas determina que nada puede viajar
a mayor velocidad que la luz, ni siquiera la información), ya que no hay trasmisión de
información en este colapso a distancia.
Matemáticamente la acción de medir un estado de un par se ve con el siguiente ejemplo:
Ejemplo 1.28. Consideremos el siguiente operador de medición: M = {M0 , M1 } donde
M0 = |0ih0| y M1 = |1ih1|.
Aplicando este operador al primer qubit del estado β00 , se obtiene uno de los siguientes
resultados:
Capítulo 1. Introducción a la computación cuántica 19
Es decir, al medir el primer qubit del estado entrelazado β00 , se obntiene |00i o |11i, es
decir que ambos qubits colapsan.
2. Alice se queda con el primer qubit del par y Bob se lleva el segundo. Podemos
considerar que estos dos pasos son la preparación del canal cuántico.
20 1.6. Usando los estados de Bell
3. Alice aplica una transformación a su qubit, de acuerdo a los bits que quiere enviar:
Z b1 X b2 , donde C 0 = I y C 1 = C.
5. Bob aplica CNOT a los dos elementos del par y luego Hadamard al primero.
Z b1 X b2 | • H |b1 i
β00 |
| |b2 i
donde la línea punteada determina el paso 4, en el que Alice envía su qubit a Bob.
Ejemplo 1.29. Se quiere enviar los bits 11. Por lo tanto se aplica (ZX ⊗ I) a β00 , con lo
que se obtiene β11 (en general, la aplicación de la compuerta Z b1 X b2 cambia el estado β00
a βb1 b2 ):
2. Alice se queda con el primer qubit del par y Bob se lleva el segundo.
3. Alice aplica CNOT entre el qubit a transmitir y el primero del par β00 , y luego
Hadamard al primero.
4. Alice realiza una medición sobre los dos qubits en su posesión y envía el resultado
de la medición (2 bits clásicos) a Bob.
5. Bob aplica una transformación sobre su qubit, de acuerdo a los bits recibidos:
Z b1 X b2 .
El circuito completo queda de la siguiente manera
|ψi • H
β00
Z b1 X b2 |ψi
donde |ψi es el qubit a transmitir (o “teleportar”).
Ejemplo 1.30. Se quiere transmitir el qubit |ψi = α|0i + β|1i, entonces
1
|ψi ⊗ β00 = (α|0i + β|1i) √ (|00i + |11i)
2
1
= √ (α|0i(|00i + |11i) + β|1i(|00i + |11i))
2
CN OT (1,2) 1
−−−−−−→ √ (α|0i(|00i + |11i) + β|1i(|10i + |01i))
2
H(1) 1 1 1
−−→ √ α √ (|0i + |1i)(|00i + |11i) + β √ (|0i − |1i)(|10i + |01i)
2 2 2
1
= [|00i(α|0i+β|1i) + |01i(α|1i+β|0i) + |10i(α|0i−β|1i) + |11i(α|1i−β|0i)]
2
1 1
1XX
= |b1 b2 i(X b2 Z b1 )|ψi
2 b =0 b =0
1 2
Por lo tanto, aplicando Z b1 X b2 , Bob obtendrá el estado original |ψi. (Nótese que para
toda compuerta U , U = U −1 ).
Observación. Si se quiere escribir la compuerta Z b1 X b2 como dos dos compuertas,
b b b
debe escribirse b
X2 Z 1 , ya que en Z X primero se aplica la compuerta X 2 y
b 1 2
luego Z b1 .
Esta es una función que toma un bit y devuelve un bit. Si fuese un bit cuántico, sería
posible evaluar la función en una superposición de 0 y 1 (por ejemplo 12 (|0i + |1i)), lo
cual nos daría como resultado una superposición de f aplicada a 0 y a 1.
El método es el siguiente. Primero se debe construir una matriz unitaria Uf de C4 que
calcule la función, de la siguiente manera:
En realidad, aunque vamos a usar la definición que acabamos de dar, se debe definir
también qué sucede cuando el segundo qubit es |1i, por lo que esta compuerta se define
más generalmente como Uf |x, yi = |x, y ⊕ f (x)i, donde ⊕ es la suma módulo 2.
Lo que se pretende es aplicar f a todas las entradas posibles, por lo que primero se aplicará
Hadamard al |0i, a fin de obtener una superposición, y luego se aplicará la compuerta
Uf . El circuito es el siguiente:
|0i H
|0,f (0)i+|1,f (1)i
Uf |ψi = √
2
|0i
Es decir:
H(1) 1 1 Uf 1
|00i −−→ √ (|0i + |1i)|0i = √ (|00i + |10i) −→ √ (|0, f (0)i + |1, f (1)i)
2 2 2
La salida de este circuito es un estado que es superposición de todos los resultados posibles
de la aplicación de la función f . Y la compuerta Uf fue utilizada una sola vez. El problema
ahora pasa porque el resultado es una superposición de todos los resultados posibles, y
al querer leerlo (es decir, al medirlo), éste colapsará a uno de los dos. El problema de
los algoritmos cuánticos pasa por utilizar la superposición de manera inteligente para
aprovechar el paralelismo, pero obteniendo el resultado buscado y no una superposición
de resultados sin utilidad.
En el siguiente capítulo mostraremos algunos de los algoritmos que, haciendo uso del
paralelismo, consiguen ganancias en complejidad respecto a su contrapartida clásica.
Capítulo 2
En este capítulo veremos algunos de los algoritmos cuánticos más conocidos. En particu-
lar, los algoritmos de Deutsch [1985] y de Deutsch y Jozsa [1992], que pueden considerarse
como los primeros algoritmos cuánticos que hacen uso del paralelismo (ver Sección 1.7).
El algoritmo de Grover [1996], que es uno de los que motivó que los investigadores en
computación se interesaran en el área. No se incluye el algoritmo de Shor [1997], el otro
importante algoritmo que motivó a investigadores en computación a adentrarse en el área.
Finalmente, el último ejemplo es una aplicación directa de la física cuántica en cripto-
grafía, diseñado por Bennett y Brassard [1984], la cual no sigue el esquema de los otros
algoritmos cuánticos presentados, pero es también el puntapié de un área de investigación
activa dentro de la computación cuántica.
|0i H H
Uf
|1i H
Las primeras dos compuertas Hadamard, aplicadas a |0i y |1i, producen lo siguiente:
H(1,2) 1 1 1 1
|01i −−−→ √ (|0i + |1i) √ (|0i − |1i) = |xi √ (|0i − |1i) = √ (|x, 0i − |x, 1i) (2.1)
2 2 2 2
23
24 2.2. Algoritmo de Deutsch-Jotza
1
Uf ( √ (|x, 0i − |x, 1i))
2
1
= √ (Uf |x, 0i − Uf |x, 1i)
2
(2.2)
1 1 1
=√ √ (|0, f (0)i + |1, f (1)i) − √ (|0, 1 ⊕ f (0)i + |1, 1 ⊕ f (1)i)
2 2 2
1
= (|0, f (0)i + |1, f (1)i − |0, 1 ⊕ f (0)i − |1, 1 ⊕ f (1)i)
2
Si f (0) 6= f (1), (2.2) es igual a
1 |0i − |1i |0i − |1i
± (|00i + |11i − |01i − |10i) = ± √ √
2 2 2
Es decir, el primer qubit es ±|−i, si f (0) 6= f (1) y ±|+i si f (0) = f (1). Aplicando
Hadamard al primer qubit, obtenemos |1i si éste era |−i y |0i si éste era |+i.
|0i − |1i
Si f (0) 6= f (1), aplicando Hadamard se obtiene ± |1i √
2
|0i − |1i
Si f (0) = f (1), aplicando Hadamard se obtiene ± |0i √
2
es decir, aplicando Hadamard, se obtiene
|0i − |1i
±|f (0) ⊕ f (1)i √
2
Dado que el primer qubit es |0i o |1i, podemos medirlo y nos dará con probabilidad 1 el
valor 0 si f es constante y con probabilidad 1 el valor 1 si f no lo es.
Observación. Este algoritmo hace uso del paralelismo, ya que la evaluación de la función se
realiza una vez sobre el estado en superposición de 0 y 1. El algoritmo clásico equivalente
haría dos evaluaciones de la función y una comparación.
El circuito es el siguiente:
|0i H H
|0i H H
Uf
.. ..
. .
|1i H
La entrada de este algoritmo son n + 1 qubits: |0i⊗n |1i = |0 . . . 01i.
Aplicando las n + 1 compuertas Hadamard sobre la entrada, se obtiene
⊗n X |xi |0i − |1i
|0i + |1i |0i − |1i
√ √ = √ √ (2.3)
2 2 2n 2
x∈{0,1}n
La compuerta Uf que se utiliza es una generalización del caso anterior definida por
Uf |x, yi = |x, y ⊕ f (x)i
donde x son cadenas de n bits.
Es decir
Uf |x, 0i = |x, f (x)i Uf |x, 1i = |x, 1 ⊕ f (x)i
Por lo tanto, aplicando Uf sobre el estado (2.3) se obtiene
X |xi |0i − |1i X 1
|0i − |1i
Uf √ √ = √ Uf |xi √
2n 2 2n 2
x∈{0,1}n x∈{0,1}n
X 1
= √ (Uf |x, 0i − Uf |x, 1i)
2n+1
x∈{0,1}n
(2.4)
X 1
= √ (|x, f (x)i − |x, 1 ⊕ f (x)i)
x∈{0,1}n
2n+1
X 1 |f (x)i − |1 ⊕ f (x)i
= √ |xi √
2n 2
x∈{0,1}n
1 X
=√ (−1)x·z |zi
n
2 z∈{0,1}n
donde x · z = x1 z1 + . . . + xn zn .
26 2.3. Algoritmo de Búsqueda de Grover
Con esta notación, se aplica Hadamard a los primeros n qubits del estado (2.4) (es decir,
al ket |xi), obteniendo
X 1 1 X
x·z |f (x)i − |1 ⊕ f (x)i
√ √ (−1) |zi √
2n 2n 2
x∈{0,1}n z∈{0,1} n
(2.5)
X X (−1)x·z |zi |f (x)i − |1 ⊕ f (x)i
= √
n n
2n 2
x∈{0,1} z∈{0,1}
Casos:
Por lo tanto, dado que este vector tiene norma 1, el resto de los términos de la
suma deben anularse, debido a que el resultado tiene que ser forzosamente un vector
normalizado. Por lo tanto, cuando f es constante, el estado (2.5) es
⊗n |0i − |1i
±|0i √
2
Es decir, midiendo los primeros n qubits se obtiene 0 . . . 0 en este caso.
Es decir que los primeros n qubits no incluyen al qubit |0i⊗n , y por lo tanto, al
medir los primeros n qubits no se puede obtener 0 . . . 0 en este caso.
2.3.1. Oráculo
1
Uf |x, yi = Uf |xi √ (|0i − |1i)
2
1
= √ (Uf |x, 0i − Uf |x, 1i)
2
1
= √ (|x, f (x)i − |x, 1 ⊕ f (x)i)
2
1
= |xi √ (|f (x)i − |1 ⊕ f (x)i)
2
f (x)
= (−1) |x, yi
G = 2|φihφ| − I
1
√
2n
= 2 ...
√1 · · · √12n −I
2n
2n
√1
2n 2n
2 2 2
2n
−1 2n
··· 2n
2 2 2
2n 2n
− 1 ··· 2n
=
.. .. ..
. . .
2 2 2
2n 2n
··· 2n
− 1 2n ×2n
P
La aplicación de G sobre un estado cualquiera |ψi = x∈{0,1}n ax |xi es la siguiente
28 2.3. Algoritmo de Búsqueda de Grover
a0
..
G|ψi .
a2n −1
X 2ax
2 2 − a0
2 n
− 1 ···
2n x∈{0,1}n
2n
.. ..
..
. .
.
2 2
··· − 1
X 2ax
2n 2n − a2n −1
n
2n
x∈{0,1}
Es decir:
X X X 2ay X
G ax |xi = − ax |xi = (2A − ax )|xi
2n
x∈{0,1}n x∈{0,1}n n
y∈{0,1} x∈{0,1}n
2.3.3. El algoritmo
El algoritmo de Grover es un algoritmo de búsqueda sobre una lista desordenada. Supo-
nemos una lista de tamaño N , con N = 2n (observar que siempre es posible aumentar
la lista con datos irrelevantes para cumplir la condición sobre N ). Los índices de la lista
son x ∈ 0, 1n , es decir x = 0 . . . 2n − 1.
El objetivo del algoritmo es localizar el x0 tal que f (x0 ) = 1, para una función booleana
f dada.
El input del circuito es |0i⊗n .
H ⊗n 1 X
|0i⊗n −−→ √ |xi (2.6)
2n x∈{0,1}n
Este estado es una superposición de todos los elementos de la lista. La idea del algoritmo
es subir la probabilidad de que al medir este estado obtengamos el elemento x0 .
U 1 X
→ √
(2.6) − (−1)f (x) |xi (2.7)
2n x∈{0,1}n
Capítulo 2. Algoritmos cuánticos y aplicación a criptografía 29
X (−1)f (x)
(2.7) = √ |xi
2n
n
x∈{0,1} | {z }
ax
G
X
−
→ (2A − ax )|xi
x∈{0,1}n
X X (−1)f (y) (−1) f (x)
= 2 √ − √ |xi
2n 2n 2 n
x∈{0,1}n y∈{0,1}n
(2.8)
2n+1 + 2n − 4
= √ |x0 i
2n 2n
n
n+1 n
X 1 2(−1) 2 − 2 2 − 2 − 4
2 √ + √ + √ |xi =
√ |xi
y∈{0,1}n 2n 2n 2n 2n 2n 2n 2n 2n
y6=x0
y6=x
El algoritmo ha cambiado las amplitudes del estado, aumentando la amplitud del estado
x0 y disminuyendo las otras.
Repitiendo este proceso (pasos 2 y 3) se va subiendo la amplitud del estado que se
quiere encontrar y disminuyendo las otras. Sin embargo es cíclico: pasado cierto número
de repeticiones, esa amplitud vuelve a decrecer. En la Sección 2.3.4 se calcula el número
optimo de repeticiones para obtener la amplitud máxima. Cuando la amplitud es máxima,
se realiza una medición, obteniendo el estado x0 con la máxima probabilidad. En la
Sección 2.3.4 se muestra que la probabilidad de error tiene cota máxima en 1/2n .
30 2.3. Algoritmo de Búsqueda de Grover
Ejemplo
Sea una lista de 24 = 16 elementos, de los que sólo uno, x0 , verifica la propiedad f (x0 ) = 1.
El algoritmo comienza por tomar el estado |0i⊗4 y aplicar H ⊗4 obteniendo,
1 X
|xi
4 4
x∈{0,1}
Inicialmente todas las amplitudes son iguales a 1/4. Se aplica el oráculo y se obtiene
1 X
(−1)f (x) |xi
4 4
x∈{0,1}
Luego se aplica la inversión sobre el promedio, y la nueva amplitud del estado x0 será
25 + 24 − 4 11
√ = = 0,6875
24 24 16
y para el resto de los x la amplitud será
25 − 24 − 4 3
√ = = 0,1875
24 24 16
Con las sucesivas repeticiones de la aplicación del oráculo y la inversión sobre el promedio,
se obtienen las siguientes amplitudes:
Repetición Amplitud de x0 Amplitud de x 6= x0 Probabilidad de error
1 0.6875 0.1875 0.527
2 0.953125 0.078125 0.092
3 0.98046875 -0.05078125 0.039
A partir de la iteración 4 la probabilidad de error comienza a subir, por lo tanto el número
óptimo de iteraciones es 3, con una probabilidad de error de 0,039.
1
m0 = b0 = √
2n (2n − 1)mk − bk
mk+1 = 2Ak − mk donde Ak =
2n
bk+1 = 2Ak + bk
Capítulo 2. Algoritmos cuánticos y aplicación a criptografía 31
1 |1i 1
(1) Alice Esquema + Esquema + Bob
1 |1i 1o0
(2) Alice Esquema + Esquema × Bob
Figura 2.2: Ejemplo: (1) Alice transmite un 1 codificado mediante el esquema + y Bob
elije al azar el esquema + obteniendo un 1 (2) si Bob elige el esquema × obtiene 0 ó 1
con probabilidad 1/2.
5. Usando solamente los bits de los esquemas idénticos a dos puntas, ambos han defi-
nido una sucesión aleatoria de bits que servirá como one-time pad de encriptación
para transmisiones futuras por cualquier canal.
Esquemas de Alice × + + × × + × +
Valores de Alice |−i |0i |0i |+i |−i |0i |−i |1i
Esquemas de Bob + × + × + + × ×
Valores de Bob |0i |+i |0i |+i |1i |0i |−i |−i
√ √ √ √
Coincidencias
Clave 0 1 0 0
6. Alice y Bob intercambian hashes de las claves (en bloques) para aceptarla o descar-
tarla.
Inviolabilidad Este protocolo es, en teoría, inviolable. Supongamos que Cliff espía el
canal de comunicación entre Alice y Bob e intenta recuperar la clave. Cliff está en la
misma situación que Bob y no conoce cuál esquema es el correcto, + o ×. Por lo tanto
elige al azar y se equivocará, en promedio, la mitad de las veces.
En el paso 5 Alice y Bob se ponen de acuerdo en cuáles valores tomar en cuenta (las coin-
cidencias de la secuencia de esquemas). Esta información no le es útil a Cliff porque sólo
en la mitad de las veces habrá usado el detector correcto, de manera que mal interpretará
sus valores finales.
Además el QKD brinda el método para que Alice y Bob puedan detectar el potencial
espionaje de Cliff:
Imaginemos que Alice envió un 0 con el esquema × (es decir, el qubit |−i). Si Cliff usa el
esquema +, colapsará el qubit a |0i o |1i. Si Bob usa el esquema × y mide |−i coincide con
lo enviado por Alice, pero si mide |+i Alice y Bob descubrirán esa discrepancia durante
el intercambio de hashes, por lo tanto descartarán el bloque.
34 2.4. Aplicación criptográfica
Capítulo 3
|ψ 0 i = U |ψi
El postulado anterior se puede tomar con tiempo continuo, para lo cual hace falta una
ecuación diferencial, y el postulado se transforma en el siguiente:
Postulado 20 . La evolución del estado de un sistema físico cuántico aislado es
descripta por la ecuación de Shcrödinger,
d|ψi
i~ = H|ψi
dt
En esta ecuación, ~ es una constante física conocida como constante de Planck
cuyo valor debe ser determinado experimentalmente. El valor exacto no es im-
portante, en la práctica es común absorber el valor ~ en H tomando ~ = 1. El
operador H no es la compuerta Hadamard vista anteriormente sino un operador
hermítico fijo conocido como el Hamiltoniano del sistema.
35
36 3.1. Postulados de la mecánica cuántica
Mm |ψi
q
†
hψ|Mm Mm |ψi
3.1.1.1. Preliminares
Definición 3.1 (Autovectores y autovalores). Un autovector de un operador lineal A en
un espacio vectorial dado es un vector no-nulo |vi tal que A|vi = v|vi, donde v es un
número complejo conocido como autovalor de A correspondiente a |vi.
3.1.2. Fase
Consideremos por ejemplo el estado eiθ |ψi¬ , donde |ψi es un vector de estado, y θ es un
número real. Decimos que el estado eiθ |ψi es igual a |ψi, excepto por la fase global eiθ .
La medición sobre ambos estados es la misma: Supongamos que Mm es una matriz de
un operador de medición. Entonces las probabilidades de aplicar esa matriz vienen dadas
†
por hψ|Mm Mm |ψi y por hψ|e−iθ Mm †
Mm eiθ |ψi = hψ|Mm†
Mm |ψi . Por lo tanto, desde un
punto de vista observacional, ambos estados son idénticos.
Por esta razón solemos ignorar las fases globales ya que son irrelevantes a las propiedades
observacionales de sistemas físicos.
¬ iθ
e = cos θ + i sin θ (aeiθ es la llamada notación exponencial de un número complejo, donde a su
módulo y θ su argumento).
−iθ iθ
e e = e−iθ+iθ = e0 = 1.
Capítulo 3. Introducción a la mecánica cuántica 39
3.2.1. Preliminares
Definición P
3.11
P(Traza). La traza de una matriz es la suma de sus elementos diagonales.
Así, si A = i j αij |ui ihuj |, la traza se define por
X
tr(A) = αii
i
Ejemplos 3.13.
√ √
1. Sea A = |0ih−|. Entonces, A = 1/ 2(|0ih0| − |0ih1|) y tr(A) = 1/ 2.
√ √
Por otro lado, siguiendo el teorema, tr(A) = h0|−i = 1/ 2(h0|0i − h0|1i) = 1/ 2.
tr(A|ψihψ|) = hψ|A|ψi
Demostración. Ejercicio.
Ejemplo 3.15. tr(X|0ih0|) = h0|X|0i = h0|0ih1|0i + h0|1ih0|0i = 0.
Ejemplo 3.17. El operador densidad del conjunto de estados puros {(1/4, |+i); (3/4, |1i)}
tiene operador densidad
Es decir
1/8 1/8
ρ= 1/8 7/8
U
X X
ρ= pi |ψi ihψi | −
→ pi U |ψi ihψi |U † = U ρU †
i i
Medición Supongamos que realizamos una medición descripta por las matrices Mm . Si
el estado inicial era |ψi i, entonces la probabilidad de obtener el resultado m es
† Cor.3.14 †
p(m|i) = hψi |Mm Mm |ψi i = tr(Mm Mm |ψi ihψi |)
Mm |ψi i
|ψim i = q
†
hψi |Mm Mm |ψi i
Por lo tanto, luego de una medición que de resultado m tendremos el conjunto de estados
|ψim i, con probabilidades p(i|m) respectivamente. Por lo tanto, el operador densidad ρm
correspondiente es
†
X X Mm |ψi ihψi |Mm
ρm = p(i|m)|ψim ihψim | = p(i|m) †
(3.1)
i i hψi |Mm Mm |ψi i
Podemos ver que el conjunto de estados está en el estado |1i con probabilidad 3/4. Si ese
es efectivamente el estado inicial, la probabilidad de medir 1 sería 1. Por otro lado, en el
estado |+i, la probabilidad de medir 1 es 1/2. De ahí que la probabilidad de medir 1 es
Efectivamente, si se midió 1 y el estado inicial era |+i, el estado final será |1i, pero lo
mismo pasa si el estado inicial era |1i, por lo que la matriz densidad es la matriz densidad
del conjunto de estados {1, |1i}.
Definición 3.20. Un sistema cuántico donde el estado |ψi se conoce exactamente se dice
que está en un estado puro. En este caso, el operador densidad es simplemente ρ = |ψihψ|.
Si no es un estado puro, ρ está en un estado mixto (o mezcla), o que es una mezcla de
diferentes estados puros.
Demostración. Ejercicio.
Teorema 3.22. Un estado cuánticoP que está en estado ρi con probabilidad pi , puede ser
descripto por la matriz densidad i pi ρi .
Demostración. Supongamos que ρi viene de un conjunto {pij , |ψij i} de estados puros (con
i fijo). Por lo tanto, la probabilidadP estar en el estado |ψP
de P ij i viene dada por pi pij . Es
decir que la matriz densidad es ρ = i j pi pij |ψij ihψij | = i pi ρi .
1. tr(ρ) = 1
2. ρ es un operador positivo
Demostración.
P
⇒) Sea ρ = i pi |ψi ihψi | un operador densidad. Entonces,
P P
1. tr(ρ) = i pi tr(|ψi ihψi |) = i pi = 1.
2. Sea |ϕi un vector arbitrario en el espacio de estados. Entonces,
!
X X X
hϕ|ρ|ϕi = hϕ| pi |ψi ihψi | |ϕi = pi hϕ|ψi ihψi |ϕi = pi |hϕ|ψi i|2 ≥ 0
i i i
ρ0 = U ρU †
44 3.2. Operador densidad
Definición 3.26. Sean A y B dos sistemas físicos tales que su estado es descripto por el
operador densidad ρAB . El operador densidad reducido para A se define por
ρA = trB (ρAB )
donde trB es la traza parcial sobre el sistema B, y es un operador lineal definido por
trB (|a1 iha2 | ⊗ |b1 ihb2 |) = |a1 iha2 |tr(|b1 ihb2 |) = hb2 |b1 i|a1 iha2 |
para todo |a1 i, |a2 i en el espacio de estados de A y |b1 i, |b2 i en el espacio de estados de
B.
ρA = trB (ρ ⊗ σ) = ρtr(σ) = ρ
Similarmente, ρB = σ.
Capítulo 3. Introducción a la mecánica cuántica 45
√
Un ejemplo menos trivial es el estado de Bell β00 = 1/ 2(|00i + |11i), que tiene el siguiente
operador densidad
|00i + |11i h00| + h11| |00ih00| + |11ih00| + |00ih11| + |11ih11|
ρ= √ √ =
2 2 2
Haciendo la traza sobre el segundo qubit obtenemos el operador densidad del primer
qubit:
ρ1 = tr2 (ρ)
tr2 (|00ih00|) + tr2 (|11ih00|) + tr2 (|00ih11|) + tr2 (|11ih11|)
=
2
tr2 (|0ih0| ⊗ |0ih0|) + tr2 (|1ih0| ⊗ |1ih0|) + tr2 (|0ih1| ⊗ |0ih1|) + tr2 (|1ih1| ⊗ |1ih1|)
=
2
h0|0i|0ih0| + h0|1i|1ih0| + h1|0i|0ih1| + h1|1i|1ih1|
=
2
|0ih0| + |1ih1|
=
2
I
=
2
Notar que este es un estado mixto, ya que tr((I/2)2 ) = 1/2 < 1. Es decir que al estar
enredados, por más que el estado de dos qubits sea un estado puro, el primer qubit sólo
está en un estado mixto: es decir, un estado que no conocemos completamente.
1
(|00i(α|0i + β|1i) + |01i(α|1i + β|0i) + |10i(α|0i − β|1i) + |11i(α|1i − β|0i))
2
Por lo tanto, si hacemos la traza parcial sobre el sistema de Alice, obtenemos que operador
densidad del sistema de Bob es
1
ρB = ((α|0i + β|1i)(α∗ h0| + β ∗ h1|) + (α|1i + β|0i)(α∗ h1| + β ∗ h0|)
4
+ (α|0i − β|1i)(α∗ h0| − β ∗ h1|) + (α|1i − β|0i)(α∗ h1| − β ∗ h0|))
2(|α|2 + |β|2 )|0ih0| + 2(|α|2 + |β|2 )|1ih1|
=
4
|0ih0| + |1ih0|
=
2
I
=
2
Por lo tanto, el estado de Bob después de que Alice hizo la medición, pero antes de que
Bob obtuvo el resultado de esa medición es I/2. Este estado no depende del estado |ψi que
se transmitió, y por lo tanto, cualquier medición que haga Bob no contendrá información
sobre |ψi, lo que previene que Alice use la teleportación para enviar información a mayor
velocidad que la luz.
Capítulo 4
Operaciones: +, −, ×, / .
Observaciones.
47
48 4.1. PCF no tipado
Recursión
En PCF hay un símbolo (palabra clave) “µ” que liga una variable en su argumento tal
que µf.G es el punto fijo® de λf.G.
µf.G = (λf.G)(µf.G)
Por lo tanto,
F act = µf. λn.isZ(n)?1 : n × (f (n − 1))
| {z }
G
Ejemplo 4.1.
F act 2 = (µf.G)2
= ((λf.G)F act)2
= (λn.isZ(n)?1 : n × F act(n − 1))2
= isZ(2)?1 : 2 × F act 1
= 2 × F act 1
= 2 × (µf.G)1
= 2 × ((λf.G)F act)1
= 2 × (λn.isZ(n)?1 : n × F act(n − 1))1
= 2 × isZ(1)?1 : 1 × F act 0
=2×1
=2
®
En matemáticas, x es el punto fijo de f si y sólo si f (x) = x.
Capítulo 4. Introducción al lambda cálculo y a la teoría de tipos 49
Let
La construcción let no es necesaria, pero será útil más adelante y por lo tanto también la
vamos a considerar:
let x = t in u
es equivalente a (λx.u)t.
4.1.4. No terminación
Ejemplos 4.2.
1. µx.x → x[µx.x/x] = µx.x
2. Sin µ: Ω = (λx.xx)(λx.xx) → xx[λx.xx/x] = (λx.xx)(λx.xx) = Ω
Ejercicio:
(µf.λx.f x)0
¿Termina?
50 4.1. PCF no tipado
Fix sin µ
¡Y F es el punto fijo de F !
µf.G → (λf.G)(µf.G)
| {z } | {z } | {z }
YF F YF
2. (λx.λy.((λx.(x + y))x)54
3. let x = 4 in
let f = λy.y + x in En las primeras versiones de Lisp, este
let x = 5 in
ejemplo daba 11 en lugar de 10.
f6
Tenemos que definir precisamente qué significa t[u/x]. Damos una definición inductiva:
x[u/x] = u
y[u/x] = y
(λx.t)[u/x] = λx.t
(λy.t)[u/x] = λy.t[u/x] Si y ∈
/ FV(u)
(λy.t)[u/x] = λz.t[z/y][u/x] Si y ∈ FV(u)
(tv)[u/x] = t[u/x]v[u/x]
n[u/x] = n
(t v)[u/x] = t[u/x] v[u/x]
(isZ(t)?v1 : v2 )[u/x] = isZ(t[u/x])?v1 [u/x] : v2 [u/x]
(µx.t)[u/x] = µx.t
(µy.t)[u/x] = µy.t[u/x] Si y ∈
/ FV(u)
(µy.t)[u/x] = µz.t[z/y][u/x] Si y ∈ FV(u)
(let x = t in v)[u/x] = let x = t[u/x] in v
(let y = t in v)[u/x] = let y = t[u/x] in v[u/x] Si y ∈
/ FV(u)
(let y = t in v)[u/x] = let y = t[u/x] in v[z/y][u/x] Si y ∈ FV(u)
Capítulo 4. Introducción al lambda cálculo y a la teoría de tipos 51
Definición 4.5.
Definición 4.6. Sea →R una relación binaria, y →∗R su cierre reflexivo y transitivo.
u
→R es Church-Rosser o confluente si →∗R satisface la propiedad del diamante. Es
decir, si t →∗R v1 y t →∗R v2 implica que v1 →∗R u y v2 →∗R u para algún u.
Lema 4.7.
Demostración. Ejercicio.
2+3
Pero esta propiedad, cuando hay términos que no terminan, no es suficiente. Por ejemplo:
Entonces:
F act 0 = (µf.G)0
→ (G[F act/f ])0
→ (G[G[F act/f ]/f ])0
→ (G[G[G[F act/f ]/f ]/f ])0
→ ··· → ∞
C0 = λx,0
b1 = (µf.λx.f x)0
Entonces,
Es decir,
b 1 → b2 → b1 → b2 → · · ·
Por lo tanto, tenemos el siguiente diagrama:
C 0 b1 0
C 0 b2 C 0 b1 C 0 b2 C 0 b1 ...
En Caml,
let rec f x = f x in
let g x = 0 in
g (f 0)
Capítulo 4. Introducción al lambda cálculo y a la teoría de tipos 53
no termina nunca.
Mismo ejemplo en Java:
class Omega {
static int f (int x) {return f(x);}
static int g (int x) {return 0;}
static public void main (String [] args) {
System.out.println (g(f(0)));
}
}
(λx.x + 9)3
Observación. La estrategia débil no optimiza programa, los ejecuta. Sólo hace falta para
ésto eliminar la regla
t→u
λx.t → λx.u
4.2.3. Call-by-name
C 0 b1 0
C 0 b2 C 0 b1 C 0 b2 C 0 b1 ...
54 4.3. PCF tipado
4.2.4. Call-by-value
C 0 b1 0
C 0 b2 C0 b 1 C 0 b2 C 0 b1 ...
Definición 4.14. A los términos t de PCF tales que FV(t) = ∅ y que t esté en forma
normal, se les llaman valores.
Definición 4.15. La estrategia call-by-value consiste en evaluar siempre los argumentos
antes de pasarlos a la función. La idea es que
(λx.t)v
reduce sólo cuando v esté en forma normal (si la estrategia es débil, y sólo reducimos
términos cerrados, v es un valor).
En (λx.x + x)(Fact 10) comenzamos por reducir el factorial, obtenemos 3628800 y recién
ahí lo pasamos a la función. De esa manera el factorial es calculado una vez.
Ejercicio: Escribir las reglas que implementan call-by-value.
Observación. Un poco de pereza es necesaria: ifz siempre debe evaluar primero la condi-
ción, estemos en call-by-name o call-by-value.
¡Todo es aplicable a todo! Sin restricciones. Sumar 1 a una función no tiene sentido. Hacer
un ifz sobre algo que no es un número o pasarle un argumento a un número, tampoco.
Idea: detectar este tipo de errores sintácticamente. Por ejemplo:
Es decir, deducimos que no tiene sentido pasarle un argumento a (λx.x)1, ya que es una
constante, y lo dedujimos sin tener que ejecutar el programa.
En matemáticas:
Cualquier conjunto
Ejemplo:
f : Pares → N
x
f (x) 7→
2
¿Está bien definido f (3 + (4 + 1))? Hay que determinar si 3 + (4 + 1) pertenece al dominio,
es decir, si es par.
En general, determinar si un objeto cualquiera pertenece a un conjunto cualquiera es un
problema indecidible.
De todas maneras, x2 lo podemos calcular si x es un número (y no, por ejemplo, una
función), y poco importa si es par o no. Así que vamos a restringir las clases de conjuntos
que se pueden utilizar como dominios. A estos conjuntos los llamamos tipos.
Teniendo tipos, tendremos que escribir de qué tipo son cada una de las variables. Como
sólo nos vamos a interesar en términos sin variables libres (sólo los subtérminos tendrán
variables libres), es suficiente con escribir el tipo cuando se liga la variable. Por ejemplo,
en lugar de λx.x la función identidad es una para cada tipo:
A ::= nat | A ⇒ A
t ::= x | λx : A.t | tt | n | t t | isZ(t)?t : t | µx : A.t | let x : A = t in t
donde = +, −, ×, / y n ∈ N.
axv axc
Γ, x : A ` x : A Γ ` n : nat
Γ, x : A ` t : B Γ ` t : A ⇒ B Γ ` u : A ⇒e
⇒i
Γ ` λx : A.t : A ⇒ B Γ ` tu : B
4.3.4. Correctitud
Si deducimos el tipo A para un término (usando la Definición 4.17), o sea, sin ejecutar
el programa, y luego ejecutamos el programa obteniendo u, entonces queremos que el
término u tienga el mismo tipo, ya que la intención fue desde el principio saber qué
tipo de resultado voy a tener al ejecutar un programa (un número, una función, etc). El
teorema de subject reduction o de conservación de tipos (Teorema 4.20) nos asegura eso
en el sistema que acabamos de definir. Para demostrar este teorema necesitaremos un
resultado previo (Lema 4.19).
Teorema 4.21 (Normalización fuerte). Todo término tipado que no contenga µ, termina.
Capítulo 4. Introducción al lambda cálculo y a la teoría de tipos 59
Esta demostración utiliza el concepto de semántica denotacional, que aún no vimos (lo
veremos en la Sección 4.7). Sin embargo, aquí veremos una versión muy reducida de
la semántica denotacional: la idea es interpretar los tipos como conjuntos de términos
fuertemente normalizables, y luego verificamos que si un término tiene un tipo, está
dentro de la interpretación de dicho tipo, y por lo tanto es fuertemente normalizable.
Sea SN el conjunto de todos los términos fuertemente normalizables.
JnatK = SN
JA ⇒ BK = {t | ∀r ∈ JAK, tr ∈ JBK}
Es decir, al tipo nat lo interpretamos en el conjunto de todos los términos que normalizan
fuertemente y al tipo A ⇒ B, en el conjunto de términos que aceptan como argumento
un término de JAK y devuelven un término de JBK.
El siguiente lema dice que todos los tipos son conjuntos de términos fuertemente norma-
lizables.
Si A = B ⇒ C, entonces para todo t ∈ JAK se tiene que para todo r ∈ JBK, tr ∈ JCK.
Por hipótesis de inducción sobre JCK, tr ∈ SN y por lo tanto t ∈ SN .
El lema que sigue, nos dice que las variables están en todos los tipos.
N = tt | let x : A = t in t | isZ(t)?t : t
Para cualquier término t, notamos por |t| a la suma de nodos en el árbol formado por
todos los caminos de reducción que comienzan en t.
Lema 4.26. Si todas las reducciones de un término neutral N están en JAK, entonces
N ∈ JAK.
Si A = nat entonces tenemos que mostrar que si todas las reducciones de N están
en JnatK = SN , entonces N está en SN , lo cual es cierto por definición.
Definición 4.27. Una valuación θ es una función que a cada variable de tipo A le
asigna un elemento del conjunto JAK. Además, usamos la notación θ(t) para un tér-
mino t cualquiera para representar t[θ(x1 )/x1 ][θ(x2 )/x2 ] . . . [θ(xn )/xn ], donde F V (t) =
{x1 , x2 , . . . , xn }.
Decimos que una valuación θ es válida en un contexto Γ (notación θ
Γ), si para todo
x : A ∈ Γ se tiene θ(x) ∈ JAK.
El Lema 4.28 nos dice que si un término tiene un tipo en un contexto, entonces cualquier
valuación, válida en ese contexto, del término, será un elemento de la interpretación de
su tipo.
Lema 4.28 (Adecuación). Para todo θ tal que θ Γ, si Γ ` t : A entonces θ(t) ∈ JAK.
Γ, x : A ` x : A.
θ(x) ∈ JAK por definición.
Capítulo 4. Introducción al lambda cálculo y a la teoría de tipos 61
Γ ` n : nat.
θ(n) = n ∈ SN = JnatK.
Γ, x : A ` t : B
Γ ` λx : A.t : A ⇒ B
θ(λx : A.t) = λx : A.θ(t).
Quiero mostrar que θ(λx : A.t) ∈ JA ⇒ BK, es decir que ∀r ∈ JAK, tenemos (λx :
A.θ(t))r ∈ JBK. Procedemos por inducción en |θ(t)| + |r|, donde |s| es la cantidad
de pasos del camino más largo para llegar a la forma normal de s. Como θ(t) y r
son SN , podemos hacer esa inducción.
Las reducciones posibles de (λx : A.θ(t))r son:
Por lo tanto, todas las reducciones de (λx : A.θ(t))r están en JBK, y entonces, por
Lema 4.26, (λx : A.θ(t))r ∈ JBK.
Γ`t:A⇒B Γ`r:A
Γ ` tr : B
Por hipótesis de inducción, θ(t) ∈ JA ⇒ BK y θ(r) ∈ JAK. Por lo tanto, por definición
de JA ⇒ BK tenemos θ(t)θ(r) ∈ JBK. Nótese que θ(t)θ(r) = θ(tr).
Γ ` t : nat Γ ` r : nat
Γ ` t ⊗ r : nat
Por hipótesis de inducción θ(t) ∈ SN y θ(r) ∈ SN , por lo tanto θ(t) ⊗ θ(r) =
θ(t ⊗ r) ∈ SN = JnatK.
Γ ` t : nat Γ ` r : A Γ ` s : A
Γ ` isZ(t)?r : s : A
Por hipótesis de inducción θ(t) ∈ SN , θ(r) ∈ JAK y θ(s) ∈ JAK. Procedemos por
inducción sobre |θ(t)| para mostrar que todos los reductos de isZ(θ(t))?θ(r) : θ(s)
están en JAK.
Los reductos son:
• isZ(t0 )?θ(r) : θ(s) con θ(t) → t0 . Entonces t0 ∈ SN y |t0 | < |θ(t)|. Por lo tanto,
la hipótesis de inducción aplica y isZ(t0 )?θ(r) : θ(s) ∈ JAK.
• θ(r) si θ(t) = 0, y por hipótesis θ(r) ∈ JAK.
• θ(s) si θ(t) = n 6= 0, y por hipótesis θ(s) ∈ JAK.
Γ, x : A ` t : B Γ ` u : A
Γ ` let x : A = u in t : B
Por hipótesis de inducción, para todo θ válido en Γ, θ(u) ∈ JAK, y para todo θ0 válido
en Γ, x : A, θ0 (t) ∈ JBK. Dado que θ(u) ∈ JAK, tenemos que θ0 = θ, x = θ(u) es una
valuación válida en Γ, x : A, y por lo tanto θ0 (t) ∈ JBK. Procedemos por inducción
sobre |θ(t)| + |θ(u)| para mostrar que todos los reductos de let x : A = θ(u) in θ(t)
están en JBK.
Los reductos son:
• let x : A = u0 in θ(t) con θ(u) → u0 . Entonces la hipótesis de inducción aplica.
• let x : A = θ(u) in t0 con θ(t) → t0 . Entonces la hipótesis de inducción aplica.
• θ(t)[θ(u)/x] = θ0 (t) ∈ JBK.
Por lo tanto, por Lemma 4.26, θ(let x : A = u in t) = let x : A = θ(u) in θ(t) ∈
JAK.
Demostración del Teorema 4.21 (Normalización fuerte). Sea Γ ` t : A donde t no con-
tiene µ. Por el Lema 4.24, θ = id es una valuación válida en Γ. Por lo tanto, por el
Lema 4.28, tenemos t ∈ JAK, y por el Lema 4.23, t ∈ SN .
¿Qué sucede con Ω = (λx.xx)(λx.xx)? No es tipable. Es decir, no existe un tipo A tal
que ` Ω : A.
Ejercicio: Extender PCF con constructores para pares: (t, u), π1 (t, u) y π2 (t, u). Dar la
gramática, semántica operacional, reglas de tipado, y extender la prueba de normalización
fuerte para incluir a los pares.
Estilo Curry. Escribimos variables sin tipos, como hicimos con PCF no tipado, y
definimos independientemente el lenguaje de tipos, como ya lo definimos.
Así, en vez de ` λx : nat.x + 1 : nat ⇒ nat escribimos ` λx.x + 1 : nat ⇒ nat.
Gramática
A ::= nat | A ⇒ A
t ::= x | λx.t | tt | n | t t | isZ(t)?t : t | µx.t | let x = t in t
Capítulo 4. Introducción al lambda cálculo y a la teoría de tipos 63
Reglas de tipado
axv axc
Γ, x : A ` x : A Γ ` n : nat
Γ, x : A ` t : B Γ ` t : A ⇒ B Γ ` u : A ⇒e
⇒i
Γ ` λx.t : A ⇒ B Γ ` tu : B
Ahora, para el mismo término, podemos derivar diferentes tipos. Por ejemplo:
axv axv
x : nat ` x : nat ⇒i x : nat ⇒ nat ` x : nat ⇒ nat ⇒i
` λx.x : nat ⇒ nat ` λx.x : (nat ⇒ nat) ⇒ (nat ⇒ nat)
Definición 4.29. Notamos A(X) a un tipo cualquiera que contiene alguna variable X.
Notamos θ a una substitución de meta-variables por tipos.
axv axc
f : nat ⇒ nat ` f : nat ⇒ nat f : nat ⇒ nat ` 1 : nat
axc ⇒e
f : nat ⇒ nat ` 2 : nat f : nat ⇒ nat ` f 1 : nat
+
f : nat ⇒ nat ` 2 + f 1 : nat
⇒i
` λf ,2 + f 1 : nat ⇒ nat
Γ`t A, τ
Γ, x : A ` x A, ∅ Γ`n nat, ∅
Γ, x : A ` t B, τ Γ`t A, τ Γ ` u B, σ
(X nueva)
Γ ` λx.t A ⇒ B, τ Γ ` tu X, τ ∪ σ ∪ {A = B ⇒ X}
Γ`t A, τ Γ ` u B, σ
Γ`tu nat, τ ∪ σ ∪ {A = nat, B = nat}
Γ`t B, τ Γ ` u A, σ Γ ` v C, ρ
Γ ` isZ(t)?u : v A, τ ∪ σ ∪ ρ ∪ {B = nat, A = C}
Γ, x : A ` t B, τ Γ`u C, τ Γ, x : B ` t A, σ
Γ ` µx.t B, τ ∪ {A = B} Γ ` let x = u in t A, τ ∪ σ ∪ {B = C}
Ejemplo 4.33.
f :A`f A, ∅ f : A ` 1 nat, ∅
f :A`2 nat, ∅ f : A ` f1 X, {A = nat ⇒ X}
f : A ` 2 + f1 nat, {A = nat ⇒ X, nat = nat, X = nat}
` λf ,2 + f 1 A ⇒ nat, {A = nat ⇒ X, nat = nat, X = nat}
Definición 4.34. Sea θ una substitución A1 /X1 , . . . , An /Xn . Decimos que θ es una so-
lución del conjunto de ecuaciones τ si para todo B = C en τ , θB y θC son idénticos.
4.5. Polimorfismo
4.5.1. Introducción
En la sección anterior vimos que el tipo principal de λx.x es X ⇒ X. Es decir, λx.x tiene
tipo X ⇒ X para todo X. Podemos entonces atribuirle el tipo
∀X.(X ⇒ X)
y agregar una regla según la cual si t tiene tipo ∀X.A, entonces t tiene tipo A[B/X] para
cualquier B.
A tales lenguajes se los llama polimórficos.
66 4.5. Polimorfismo
Ejemplo 4.37. Usemos los algoritmos de Hindley y Robinson para inferir el tipo del
término let i = λx.x in ii:
i:X`i X, ∅ i : X ` i X, ∅ x:Z`x Z, ∅
i : X ` ii Y, {X = X ⇒ Y } ` λx.x Z ⇒ Z, ∅
` let i = λx.x in ii Y, {X = X ⇒ Y, X = Z ⇒ Z}
El algoritmo de Robinson finalizará con error al leer la ecuación X = X ⇒ Y .
Sin embargo, el término equivalente (λx.x)(λx.x) sí puede ser tipado:
x:X`x X, ∅ x:Y `x Y, ∅
` λx.x X ⇒ X, ∅ ` λx.x Y ⇒ Y, ∅
` (λx.x)(λx.x) Z, {X ⇒ X = (Y ⇒ Y ) ⇒ Z}
X = Y ⇒Y
X ⇒ X = (Y ⇒ Y ) ⇒ Z =⇒ =⇒ Y ⇒ Y = Z
X = Z
Es decir, el término tiene tipo Y ⇒ Y para cualquier Y .
La diferencia entre el primer término y el segundo es que en el primero, i debe tener
el mismo tipo en ambas instancias, Z ⇒ Z para cualquier Z, en cambio en el segundo
ejemplo, cada función identidad puede instanciar la Z de manera diferente.
Con un tipo ∀, podemos hacer que el i del let tenga tipo ∀X.(X ⇒ X) y cada ocurrencia
de i se instancie en un tipo diferente, haciendo que el término let i = λx.x in ii pueda ser
tipado como ∀Y.(Y ⇒ Y ).
El ejemplo anterior no es un ejemplo aislado. Podríamos por ejemplo hacer una función
map para árboles, sea cual sea el tipo de los elementos en los árboles, lo que permite
reusabilidad de código y por lo tanto programas más concisos.
Tenemos que distinguir tipos sin cuantificadores (los que llamaremos simplemente “tipos”)
de tipos cuantificados (que llamaremos “esquemas de tipos”).
Definición 4.38. Un esquema de tipo tiene forma ∀X1 . . . ∀Xn .A, donde A es un tipo,
con n ≥ 0.
Definimos entonces una gramática a dos niveles: uno para tipos y otro para esquemas de
tipos:
A ::= X | nat | A ⇒ A
α ::= [A] | ∀X.α
Si A es un tipo, [A] es un esquema de tipo formado por el tipo A donde ninguna variable
está cuantificada.
Capítulo 4. Introducción al lambda cálculo y a la teoría de tipos 67
Definición 4.39. Ahora que tenemos variables y un ligador (∀) en los tipos, extendemos
la definición de variables libres (FV) para tipos:
FV(X) = {X}
FV(nat) = ∅
FV(A ⇒ B) = FV(A) ∪ FV(B)
FV([A]) = FV(A)
FV(∀X.α) = FV(α) \ {X}
Definición 4.40. El sistema de tipos asocia contextos y términos con esquemas de tipos,
Γ ` t : α, y viene dado por
axv axc
Γ, x : α ` x : α Γ ` n : [nat]
Γ, x : [A] ` t : [B] Γ ` t : [A ⇒ B] Γ ` u : [A]
⇒i ⇒e
Γ ` λx.t : [A ⇒ B] Γ ` tu : [B]
Γ ` t : [nat] Γ ` u : [nat] Γ ` t : [nat] Γ ` u : [A] Γ ` v : [A]
ifz
Γ ` t u : [nat] Γ ` isZ(t)?u : v : [A]
Γ, x : [A] ` t : [A] Γ ` t : α Γ, x : α ` u : [A]
µ let
Γ ` µx.t : [A] Γ ` let x = t in u : [A]
Γ`t:α ∀ Γ ` t : ∀X.α ∀
Si X ∈
/ FV(Γ),
Γ ` t : ∀X.α i Γ ` t : α[A/X] e
Observaciones.
1. λx.x
68 4.6. Interpretación
2. let i = λx.x in ii
3. (λf.f f )(λx.x)
4. (λx.xx)(λx.xx)
4.6. Interpretación
El programa que calcula el valor de un término se llama intérprete.
Γ ` t ,→ hx, t0 , Γ0 i Γ0 , x = hr, Γi ` t0 ,→ v
Γ ` λx.t ,→ hx, t, Γi Γ ` tr ,→ v
Γ ` t ,→ 0 Γ ` r ,→ v Γ ` t ,→ n Γ ` s ,→ v Si n 6= 0
Γ ` isZ(t)?r : s ,→ v Γ ` isZ(t)?r : s ,→ v
Γ, x = hr, Γi ` t ,→ v Γ, x = hµx.t, Γi ` t ,→ v
Γ ` let x = r in t ,→ v Γ ` µx.t ,→ v
Ejemplo 4.46. (Leer de abajo hacia arriba)
` 4 ,→ 4 ` 4 ,→ 4
x = h4, ∅i ` x ,→ 4 x = h4, ∅i ` x ,→ 4
` λx.x × x ,→ hx, x × x, ∅i x = h4, ∅i ` x × x ,→ 16
` (λx.x × x)4 ,→ 16
Γ0 ` µy.t → v
x∈
/ D(∆) x∈
/ D(∆)
Γ, x = v, ∆ ` x ,→ v Γ, x = hµy.t, Γi0 , ∆ ` x ,→ v
Γ ` t ,→ n Γ ` u ,→ m Si n m = p
Γ ` n ,→ n Γ ` t u ,→ p
Γ ` r ,→ w Γ ` t ,→ hx, t0 , Γ0 i Γ0 , x = w ` t0 ,→ v
Γ ` λx.t ,→ hx, t, Γi Γ ` tr ,→ v
Γ ` t ,→ 0 Γ ` r ,→ v Γ ` t ,→ n Γ ` s ,→ v Si n 6= 0
Γ ` isZ(t)?r : s ,→ v Γ ` isZ(t)?r : s ,→ v
Γ ` r ,→ w Γ, x = w ` t ,→ v Γ, x = hµx.t, Γi ` t ,→ v
Γ ` let x = r in t ,→ v Γ ` µx.t ,→ v
70 4.7. Semántica denotacional
t ,→ r ⇐⇒ t →∗ r y r irreducible
donde →∗ es la clausura reflexiva y transitiva de →.
JnatK = N
JA ⇒ BK = JAK → JBK
JxKθ = θ(x)
Jλx : A.tKθ = λa : JAK.JtKθ,x=a
JtrKθ = JtKθ JrKθ
JnKθ =n
Jt rKθ = JtKθ JrKθ
JrKθ si JtKθ = 0
JisZ(t)?r : sKθ =
JsKθ si JtKθ ∈ N∗
Jlet x : A = r in tKθ = JtKθ,x=JrKθ
1. t/0 tirar error en PCF y no está definida en matemática. Para que esta definición
sea correcta hay que agregar un elemento error a cada conjunto JAK y adaptar la
definición
error si JrK = 0
Jt/rK =
JtK/JrK si JtK ∈ N, JrK ∈ N∗
2. λf : nat ⇒ nat.λx : nat.(f x) + 1 tampoco tiene punto fijo. . . y basta con cmabiar el
primer λ y tengo el µ.
4. µx : nat.x también.
Teorema 4.50. Si tomamos el punto fijo de una función que no tiene punto fijo o que
tiene varios, el programa que obtenemos no termina.
Observación. También existen programas con un sólo punto fijo y que no terminan en
PCF. Por ejemplo λx : nat.x + x.
Ahora vemos que la función Jλx : nat.x + 1K que no tenía punto fijo cuando JnatK = N, si
JnatK = N ∪ ⊥ le podemos dar ⊥ como semántica a ese término.
Jλx : nat.xK que tenía muchos puntos fijos, ahora tiene uno más: ⊥.
Jλx : nat.x + xK que tenía sólo un punto fijo en 0, ahora tiene 2: 0 y ⊥, y el segundo es el
que queremos atribuirle como semántica.
Definimos entonces Jµx : nat.tK como el punto fijo más chico de Jλx : nat.tK.
Capítulo 4. Introducción al lambda cálculo y a la teoría de tipos 73
JxKθ = θ(x)
Jλx : A.tKθ = λa : JAK.JtKθ,x=a
JtrKθ = JtKθ JrKθ
JnKθ =n
JtKθ JrKθ si JtKθ , JrKθ ∈ N
Jt rKθ =
⊥N si no
JrKθ si JtKθ = 0
JisZ(t)?r : sKθ = JsKθ si JtKθ ∈ N∗
⊥A si JtKθ = ⊥N y A es el tipo del término
4.8.1. Introducción
La lógica lineal fue introducida por Jean-Yves Girard [1987]. Aquí daremos una presen-
tación por medio de cálculo de secuentes, ya que es muy similar a las reglas de tipado
que hemos visto en las secciones anteriores.
La idea principal a retener es que la lógica lineal es una lógica de recursos: la fórmula
A ⇒ B normalmente se entiende como “Si me das A, te devuelvo B”, pero, en la práctica,
significa más bien “Si me das tantas A como necesite, te devuelvo B”. Por ejemplo, el
término
λx.x + Fact x
tiene tipo nat ⇒ nat, pero para calcular x + Fact x, se necesitan dos copias del número
x. Es decir, el recurso (el número x), fue duplicado para poder calcular el resultado. Si,
74 4.8. Rapid(ísim)a descripción de la lógica lineal
por ejemplo, el recurso fuese Fact 1000, y trabajamos en call-by-value (para asegurar que
si hay un resultado, llegaremos al mismo), entonces duplicar el recurso tiene un costo.
En lógica lineal no podemos duplicar recursos, salvo que explícitamente se autorice. Así,
el tipo nat ( nat significa: “Si me das un nat, te devuelvo un nat usándolo exactamente
una vez”, y, en cambio, el tipo !nat ( nat significa nat ⇒ nat.
Ésta lógica nos será de utilidad para definir cálculos cuánticos, ya que el teorema de no
clonado (Teorema 1.27) nos impide clonar recursos cuánticos.
De la misma manera, la función λx,1, que descarta su argumento, no podríamos decir
que tiene tipo nat ( nat. En cambio, se utiliza el tipo ?nat ( nat, donde ? se utiliza,
justamente, para permitir descartar el argumento.
Implicación lineal: A ( B := ¬A ` B
Implicación intuicionista: A ⇒ B := !A ( B
A ! y a ? se les llama exponenciales, y existen las equivalencias normales de los exponen-
ciales con respecto a la suma y la adición: na+b = na nb .
!> ≡ 1 ?0 ≡ ⊥
Donde A ≡ B significa que (A ( B) ∧ (B ( A) es derivable.
A continuación se detallan las reglas en el formato ∆ ` Γ, que significa que la conjun-
ción (multiplicativa) de las fórmulas en ∆, implican la disjunción (multiplicativa) de las
fórmulas en Γ.
Gramática
A := p | ¬A | A ⊗ A | A ` A | A & A | A ⊕ A | 1 | ⊥ | > | 0
∆ ` B, Γ ∆0 , B ` Γ0 ∆ ` A, Γ ∆, A ` Γ
ax cut ¬l ¬r
A`A ∆, ∆0 ` Γ, Γ0 ∆, ¬A ` Γ ∆ ` ¬A, Γ
Capítulo 4. Introducción al lambda cálculo y a la teoría de tipos 75
Reglas multiplicativas
∆`Γ 1 ∆, A, B ` Γ ∆ ` A, Γ ∆0 ` B, Γ0
1r ⊗ ⊗r
∆, 1 ` Γ l `1 ∆, A ⊗ B ` Γ l ∆, ∆0 ` A ⊗ B, Γ, Γ0
∆`Γ ⊥ ∆, A ` Γ ∆0 , B ` Γ0 ∆ ` A, B, Γ
⊥l ` `
⊥` ∆ ` ⊥, Γ r ∆, ∆0 , A ` B ` Γ, Γ0 l ∆ ` A ` B, Γ r
Reglas aditivas
∆, A ` Γ ∆, B ` Γ ∆ ` A, Γ ∆ ` B, Γ
0l & & &r
∆, 0 ` Γ ∆, A & B ` Γ l1 ∆, A & B ` Γ l2 ∆ ` A & B, Γ
∆, A ` Γ ∆, B ` Γ ∆ ` A, Γ ∆ ` B, Γ
>r ⊕l ⊕ ⊕
∆ ` >, Γ ∆, A ⊕ B ` Γ ∆ ` A ⊕ B, Γ r1 ∆ ` A ⊕ B, Γ r2
∆`Γ W ∆, !A, !A ` Γ ∆, A ` Γ
C! D
∆, !A ` Γ ! ∆, !A ` Γ ∆, !A ` Γ !
∆`Γ W ∆ ` ?A, ?A, Γ ∆ ` A, Γ
C? D
∆ ` ?A, Γ ? ∆ ` ?A, Γ ∆ ` ?A, Γ ?
Ejemplo 4.54. El término apply := λx.λy.x(y +y) puede ser tipado como (!nat ( !nat) (
!nat ( !nat:
axv axv
y : !nat ` y : !nat z : !nat ` z : !nat
+
y : !nat, z : !nat ` y + z : !nat
axv C
x : !nat ( !nat ` x : !nat ( !nat y : !nat ` y + y : !nat
(e
x : !nat ( !nat, y : !nat ` x(y + y) : !nat
(i
x : !nat ( !nat ` λy.x(y + y) : !nat ( !nat
(i
` λx.λy.x(y + y) : (!nat ( !nat) ( !nat ( !nat
Notar que el segundo argumento no es lineal, ya que se utiliza dos veces, y eso se ve
reflejado en el tipo (!nat), en cambio, el primer argumento es lineal (!nat ( !nat) y se
utiliza sólo una vez.
En la práctica veremos que todas las reglas de tipado que dimos más arriba, son lógica-
mente derivables.
Capítulo 5
Donde
new mapea un bit clásico en un qubit.
Programas
El estado de un programa se representa con una tripleta [q, `, t] donde
q es un vector normalizado de ni=1 C2 , para algún n > 0.
N
77
78 5.1. Control clásico, datos cuánticos
t es un término lambda.
` es una función de W en N≤n , donde FV(t) ⊆ W . A L se la llama función de
linkeado.
La función de linkeado linkea variables libres específicas de t a qubits específicos de q.
Ejemplo 5.1. La tripleta
1
[ √ (|00i + |11i), {x 7→ 2}, λy.Xx]
2
representa el programa que comienza con el estado de Bell β00 y al pasarle un argumento
cualquiera aplica la compuerta X (not) al segundo qubit, transformando dicho estado en
β01 , pero aún no hemos dicho cómo reduce un programa para poder verificar esta última
afirmación.
Notación. Para simplificar la notación, se usan pi para denotar las variables libres x
tal que `(x) = i. Es decir, pi es la variable que referencia al i-ésimo qubit. De esa manera,
un programa [q, `, t] es abreviado en [q, t0000 ], donde t0 = t[p`(x1 ) /x1 ] . . . [p`(xn ) /xn ].
Ejemplo 5.2. La tripleta del ejemplo 5.1 se escribe abreviadamente como
1
[ √ (|00i + |11i), λy.Xp2 ]
2
Observación. El teorema de no clonado (ver Teorema 1.27) en este lenguaje es traducido
en que cada qubit cuántico no puede ser referenciado más de una vez a través de la función
de linkeado. Sintácticamente esta restricción se traduce en la condición de linealidad: una
lambda abstracción λx.t se dice lineal si la variable x aparece exactamente una vez en t.
El sistema de tipos se encargará de que las variables linkeadas a través de la función ` se
usen linealmente, mientras al resto de las variables se permite una utilización no-lineal.
Donde las dos ramas tienen probabilidad 1/2 cada una, por lo tanto, en call-by-value este
programa produce el valor booleano 0 con probabilidad 1.
(No se detalla paso a paso ya que hay algunas sutilezas con la construcción isZ()? : que
aún no hemos mencionado).
Entonces, en call-by-name este programa produce 0 o 1 con la misma probabilidad.
Sin estrategia. Si no se establece una estrategia, este término podría incluso reducir
a un término mal formado, por ejemplo:
[α|0i + β|1i, meas p1 ] →|α|2 [|0i, 0] y [α|0i + β|1i, meas p1 ] →|β|2 [|1i, 1]
i−1
donde |φ0j i, |φ1j i ∈ C2 .
n
(∗ ∗ ∗) q ∈ C2
Tipos
El sistema de tipos captura la noción de duplicabilidad, como se discutió anteriormente.
Se utiliza la notación de la lógica lineal de Girard [1987]. Un término de tipo A se asume no
duplicable, y a los términos duplicables se les asignará tipos de la forma !A. La gramática
de los tipos se define como sigue:
A ::= α | X | !A | A ( A | > | A ⊗ A
A <: B Ac <: B
(var ) (const)
Γ, x : A ` x : B Γ`c:B
Γ1 , !∆ ` t : bit Γ2 , !∆ ` r : A Γ2 , !∆ ` s : A
(if )
Γ1 , Γ2 , !∆ ` isZ(t)?r : s : A
Γ1 , !∆ ` t : A ( B Γ2 , !∆ ` r : A
(app)
Γ1 , Γ2 , !∆ ` tr : B
x : A, ∆ ` t : B Γ, !∆, x : A ` t : B
(λ1 ) Si FV(t) ∩ |Γ| = ∅, (λ2 )
∆ ` λx.t : A ( B Γ, !∆ ` λx.t :!n+1 (A ( B)
Γ1 , !∆ ` t :!n A1 Γ2 , !∆ ` r :!n A2
(⊗i ) (>)
Γ1 , Γ2 , !∆ ` (t, r) :!n (A1 ⊗ A2 ) ∆ ` ∗ :!n >
Γ1 , !∆ ` t :!n (A1 ⊗ A2 ) Γ2 , !∆, x :!n A1 , y :!n A2 ` r : A
(⊗e )
Γ1 , Γ2 , !∆ ` let (x, y) = t in r : A
Ejemplo: Teleportación
La teleportación fue presentada en la Sección 1.6.2. Reproducimos el circuito aquí por
conveniencia.
|ψi • H
|0i H •
|0i Z b1 X b2 |ψi
Las líneas punteadas delimitan tres partes del circuito: la primera es la creación del
estado de Bell β00 , y le llamaremos Bell. La segunda es las operaciones que realiza Alice,
82 5.2. Control y datos cuánticos
y llamaremos a esta parte del algoritmo Alice. Finalmente, la tercera es la que realiza
Bob, por lo que le llamaremos Bob. Los tipos de cada parte del programa serán:
Luego,
Telep = λq.(let (p, p0 ) = Bell ∗ in (Bob p0 (Alice q p)))
Ejercicios:
Inicialmente van Tonder plantea una gramática simple, con constantes para las operacio-
nes cuánticas
t ::= x | λx.t | tt | c
c ::= 0 | 1 | H | CN OT | X | Z | . . .
donde, como puede observarse, no hay medición.
La computación reversible fue estudiada en los 70s, en particular, el trabajo de Bennett
[1973] mostró una manera simple de obtener reversibilidad: llevar un historial de los pasos
de reducción. Por ejemplo, si t0 → t1 → t2 → . . . , la reducción reversible sería
(t0 ) → (t0 , t1 ) → (t0 , t1 , t2 ) → . . .
Sin embargo, en el caso cuántico, no es tan directo. Supongamos que el estado inicial
viene dado por H aplicada al qubit |0i, que van Tonder lo representa dentro de un ket
de la siguiente manera:
|(H 0)i
Las reglas de reducción para este término deberían ser tales que |(H 0)i reduzca a √12 (|0i+
|1i) y |(H 1)i a √12 (|0i−|1i). Sin embargo, estas reglas no son reversibles. Usando el truco
de Bennett podríamos tener
1 1
|(H 0)i → √ (|(H 0); 0i + |(H 0); 1i) = |(H 0)i ⊗ √ (|0i + |1i)
2 2
En este ejemplo, el “historial” se factoriza a la izquierda y el término reducido queda a la
derecha. Sin embargo, consideremos el siguiente ejemplo:
1
|(H (H 0))i → √ (|(H (H 0)); (H 0)i + |(H (H 0)); (H 1)i)
2
1
→ |(H (H 0))i ⊗ (|(H 0); 0i + |(H 0); 1i + |(H 1); 0i − |(H 1); 1i)
2
Aquí el término reducido no puede ser factorizado: el registro quedo enredado con parte
del historial.
Pero en este ejemplo vemos que se está guardando más información de la necesaria. Con
guardar simplemente que subtérmino redujo y con qué operación es suficiente. Retomando
el mismo ejemplo, tendríamos:
1
|(H (H 0))i → √ (|(_ (H _)); (H 0)i + |(_ (H _)); (H 1)i)
2
1
→ |(_ (H _))i ⊗ (|(H _); 0i + |(H _); 1i + |(H _); 0i − |(H _); 1i)
2
= |(_ (H _)); (H _)i ⊗ |0i
Con estas ideas en mente se define el modelo computacional. El estado computacional se
toma como una superposición cuántica de secuencias
h1 ; . . . ; hn ; t
donde h1 ; . . . ; hn es llamado historial, y t registro computacional.
No vamos a discutir el cálculo de van Tonder en este curso, sólo estas observaciones y se
recomienda al interesado el paper [van Tonder, 2004].
84 5.2. Control y datos cuánticos
Gramática
La gramática del lenguaje incluye todos los términos de lambda cálculo, y sus combina-
ciones lineales.
Semántica operacional
Las reglas de reducción son, además de la beta reducción, una versión orientada de los
axiomas de espacios vectoriales. La orientación de cada regla ha sido elegida de manera
de obtener un cálculo confluente.
La idea principal es que una abstracción, sobre una combinación lineal, se comporte
linealmente como lo hace una matriz sobre un vector. Así,
De esa manera no se impone no clonado con una restricción de lógica lineal (ver el cálculo
de Selinger y Valiron en la Sección 5.1.1), sino que siempre que haya una superposición,
la función actuará linealmente, y por lo tanto sólo actuará en los vectores de base. Re-
cordemos que los vectores de base son clonables: por ejemplo, la compuerta CNOT clona
los qubits |0i y |1i:
Por lo tanto el cálculo deberá ser call-by-value, ya que si el argumento reduce a una
superposición, es necesario reducirlo antes de pasarlo a una abstracción.
Ejemplo 5.3. Consideremos los términos true y false de Church, λx.λy.x y λx.λy.y como
los qubits |0i y |1i. De esa manera podemos codificar el término isZ(t)?r : s simplemente
como trs, ya que si t es |0i, λx.λy.xrs →∗ r y si t es |1i, λx.λy.yrs →∗ s.
La compuerta Hadamard podría ser codificada en Lineal de la siguiente manera:
1 1
Hx = x( √ (|0i + |1i))( √ (|0i − |1i))
2 2
Sin embargo, de esta manera trivial no funciona, ya que los mecanismos utilizados para
no-clonado (las reglas de aplicación), harán que el término reduzca de la siguiente manera:
H|0i = Hλx.λy.x
1 1
= λx.λy.x( √ (|0i + |1i))( √ (|0i − |1i))
2 2
1 1
→ √ λx.λy.x(|0i + |1i)( √ (|0i − |1i))
2 2
1 1
→ √ (λx.λy.x|0i + λx.λy.x|1i)( √ (|0i − |1i))
2 2
1
→∗ (λy.|0i + λy.|1i)(|0i − |1i)
2
1
→∗ (|0i − |0i + |1i − |1i)
2
→∗ 0
El problema está en la linealidad. Lo que debemos hacer es que el encodaje del isZ()? :
detenga la linealidad. Por ejemplo:
isZ(t)?r : s = (t(λx.r)(λx.s))(λx.x)
86 5.2. Control y datos cuánticos
isZ(t)?r : s = {t[r][s]}
1 1
{Hx} = {x[( √ (|0i + |1i))][( √ (|0i − |1i))]}
2 2
Tipos
El sistema de tipos vectorial para Lineal [Arrighi, Díaz-Caro, y Valiron, 2017] propone
que los tipos lleven cuenta de las superposiciones en los términos. Así, si el término t
tiene tipo A y el término r tiene tipo B, el término α.t + β.r tendrá tipo α.A + β.B.
Si consideramos T = X ⇒ Y ⇒ X y F = X ⇒ Y ⇒ Y , el término √12 (|0i + |1i) tendrá
tipo √12 (T + F ). Notar que este tipo tiene norma 1, al igual que el término, y por lo
tanto, un tal tipo nos permite verificar facilmente la norma del vector que produce un
programa.
Dada la estrategia call-by-value, las variables sólo pueden tener tipos no superpuestos,
los que llamamos unit types. Esta necesidad se comprende mejor con el siguiente ejemplo:
Supongamos que permitimos variables con tipos escalados, como α.V . Entonces, el tér-
mino λx.x + t podría tener tipo (α.V ) ⇒ α.V + U , con t de tipo U . Luego, tomemos un
término v de tipo V y tenemos (λx.x + t)(α.v) de tipo α.V + U . Sin embargo
A ::= U | α.A | A + A | X
U ::= X | U ⇒ A | ∀X .U | ∀X.U
Consideramos también las siguientes equivalencias entre tipos, la cual es una congruencia:
Reglas de tipado. Las reglas de tipado se detallan a continuación. Usamos [T /X] para
referir a [U/X ] o [A/X].
Γ`t:A 0 Γ, x : U ` t : A
ax ⇒I
Γ, x : U ` x : U Γ ` 0 : 0.A I Γ ` λx.t : U ⇒ A
Γ ` t : ni=1 αi .∀X.(U ⇒ Ai ) Γ ` r : m
P P
j=1 βj .U [T /X]
Pn Pm ⇒E
Γ ` tr : i=1 j=1 αi × βj .Ai [Tj /X]
` |0i : ∀X Y.X ⇒ Y ⇒ X ,
` |1i : ∀X Y.X ⇒ Y ⇒ Y.
1 1
|+i = √ .(|0i + |1i) y |−i = √ .(|0i − |1i).
2 2
88 5.2. Control y datos cuánticos
De la misma manera,definimos
1
= √ .((∀X Y.X ⇒ Y ⇒ X ) + (∀X Y.X ⇒ Y ⇒ Y)),
2
1
= √ .((∀X Y.X ⇒ Y ⇒ X ) − (∀X Y.X ⇒ Y ⇒ Y)).
2
Es fácil verificar que ` [|+i] : [] y ` [|−i] : [].
Para simplificar la notación, tomamos A = [] ⇒ [] ⇒ [X]. Entonces
ax
x:A`x:A x : A ` [|+i] : []
⇒E
x : A ` x[|+i] : [] ⇒ [X] x : A ` [|−i] : []
⇒E
x : A ` x[|+i][|−i] : [X]
⇒E
x : A ` {x[|+i][|−i]} : X
⇒I
` λx.{x[|+i][|−i]} : A ⇒ X
∀
` λx.{x[|+i][|−i]} : ∀X.([] ⇒ [] ⇒ [X]) ⇒ X I
Ahora podemos aplicar Hadamard a un qubit para obtener el tipo correcto. Sea H =
λx.{x[|+i][|−i]}.
` |0i : ∀X Y.X ⇒ Y ⇒ X
∀
` H : ∀X.([] ⇒ [] ⇒ [X]) ⇒ X ` |0i : ∀Y.[] ⇒ Y ⇒ [] E
∀E ∀
` H : ([] ⇒ [] ⇒ []) ⇒ ` |0i : [] ⇒ [] ⇒ [] E
⇒E
` H|0i :
Un ejemplo aún más interesante es el siguiente. Sea
1
I = √ .(([] ⇒ [] ⇒ []) + ([] ⇒ [] ⇒ []))
2
Es decir, I es donde los forall han sido instanciados. Es fácil verificar que ` |+i : I .
Entonces,
` H : ∀X.([] ⇒ [] ⇒ [X]) ⇒ X ` |+i : I
⇒E
` H|+i : √12 . + √12 .
Y dado que √1 . + √12 . ≡ ∀X Y.X → Y → X , podemos concluir
2
` H|+i : ∀X Y.X ⇒ Y ⇒ X .
Notar que H|+i →∗ |0i.
(AL) Usar un sistema de reescritura que defina las aplicaciones como aplicaciones lineales,
así λx.x ⊗ x es permitido, pero al aplicarlo a α.|0i + β.|1i producirá α.|00i + β.|11i
y no (α.|0i + β.|1i) ⊗ (α.|0i + β.|1i).
Sin embargo, definir aplicaciones lineales por medio de reescritura no funciona si el cálculo
tiene medición, ya que sólo las compuertas cuánticas se comportan de esa manera. Por
ejemplo, digamos que tenemos un operador de medición notado por π, entonces
Gramáticas
La gramática de tipos se separa en dos niveles ya que este cálculo es de primer orden (por
razones que luego discutiremos).
con α ∈ C.
Utilizamos la notación isZ(t)?r : s para (isZ()?r : s)t. El motivo de considerar a isZ()?r : s
como una función es aprovechar la linealidad AL de las funciones, de esa manera,
Tipos
∆`u:Ψ Γ`t:Ψ⇒A ⇒E
∆ ` u : S(Ψ) Γ ` t : S(Ψ ⇒ A) ⇒ES
∆, Γ ` tu : A ∆, Γ ` tu : S(A)
Γ`t:A W
Γ, x : Bn , y : Bn ` t : A C
Γ, x : Bn ` t : A Γ, x : Bn ` (x/y)t : A
Semántica operacional
(lin0r )
(t + u)v −→(1) (tv + uv) (lin+l )
(α.t)u −→(1) α.tu (linαl )
~0S(Bn ⇒A) t −→(1) ~0S(A) (lin0l )
(~0S(A) + t) −→(1) t (neutral)
Axiomas de espacios vectoriales
P Q
πj ( [αi .] |bhi i) −→(1) pk (|ki × |φk i) (proj)
i=1 h=1 k=0
If t −→(1) u, then
contextuales
n n
tv −→(1) uv (λxB .v)t −→(1) (λxB .v)u (t + v) −→(1) (u + v)
Reglas
j≤m
|ki = |b1 i × · · · × |bj i donde b1 . . . bj es la representación binaria de k
m
X αi Y
|φk i = qP |bhi i
|α |2
i∈Tk r∈Tk r h=j+1
2
X |α |
pk = Pn i 2
i∈Tk
r=1 |αr |
Primer orden. El motivo de utilizar primer orden es que en este cálculo hemos mez-
clado los dos enfoques precedentes: LL y AL, y por lo tanto ahora es posible construir
una máquina de clonado si se permite alto orden. El truco es esconder dentro de una
abstracción una superposición, por ejemplo λx:B.α.|0i + β.|1i. Éste es un término dupli-
cable, y no hay problema en ello (no es una superposición, es un programa que produce
una). Sin embargo, dado que ahora tenemos términos LL, podríamos también producir
λy:S(B).λx:B.y, el cual nos permite generar superposiciones duplicables. La solución es
impedir tomar una abstracción como argumento, y por lo tanto este término no podrá
ser duplicado.
El primer término podría ser tipado con B ⊗ S(B), en cambio el segundo debería ser
tipado con S(B ⊗ B). Naturalmente el subipado va en sentido contrario al necesario:
B ⊗ S(B) S(B ⊗ B), y por lo tanto este ejemplo rompe la propiedad de preservación de
tipos.
Es normal, en matemática, que al desarrollar un término perdamos información. Por
ejemplo, (x − 1)(x − 2) = x2 − 3x + 2. La información del término izquierdo, que da
sus raíces y una factorización, es perdida al desplegar el término. Por este motivo, no
permitimos la reducción (5.1). En cambio, para poder realizar esa reducción, se debe
castear el término, y entonces el tipo es preservado:
Algoritmo de Deutsch
La compuerta Hadamard puede ser implementada de la siguiente manera:
√
H = λx:B.1/ 2.(|0i + (isZ(x)?(−|1i) : |1i))
Notar que la variable es un tipo de base, y por lo tanto, si H se aplica a una superposición,
por ejemplo (α.|0i + β.|1i), reduce de la siguiente manera:
(lin+ ) (linα )2
H(α.|0i + β.|1i) −→r (1) (Hα.|0i + Hβ.|1i) −→r (1) (α.H|0i + β.H|1i)
Entonces, Uf es:
Los casteos luego de las compuertas Hadamard se necesitan para desarrollar el término
por completo para luego poder pasarlo a una abstracción que espera términos de base.
El término Deutschf se tipa como sigue:
` Deutschf : B × S(B)
Notar que la única diferencia con H1 es el tipo de la variable. También, necesitamos aplicar
cnot a los dos primeros qubits de un sistema de tres qubits, por lo que definimos cnot312 :
Notar que antes de pasar a cnot312 el parámetro de tipo S(B) × S(B × B), necesitamos
desarrollar el término por completo usando dos casteos, y de nuevo luego de la compuerta
Hadamard.
El lado de Bob del algoritmo aplicará ciertas compuertas basado en los bits que reciba de
Alice. Por lo tanto, para cualquier ` U : B ⇒ S(B) o ` U : B ⇒ B, definimos U(b) como
la función que aplica U o no dependiendo del bit b:
Este tipo tiene el tipo esperado S(B) ⇒ S(B), y aplicado a cualquier superposición
(α.|0i + β.|1i) reduce, como es de esperarse, a (α.|0i + β.|1i).
Bibliografía
Charles Bennett y Gilles Brassard. Quantum cryptography: Public key distribution and
coin tossing. En Proceedings of IEEE International Conference on Computers, Systems
and Signal Processing, págs. 175–179. 1984.
Charles Bennett, Gilles Brassard, Claude Crépeau, Richard Jozsa, Asher Peres, y William
Wootters. Teleporting an unknown quantum state via dual classical and Einstein–
Podolsky–Rosen channels. Physical Review Letters, 70(13):1895–1899, 1993.
Charles Bennett y Stephen Wiesner. Communication via one- and two-particle operators
on Einstein–Podolsky–Rosen states. Physical Review Letters, 69(20):2881–2884, 1992.
Garret Birkhoff y John von Neumann. The logic of quantum mechanics. Annals of
Mathematics, 37(4):823–843, 1936.
Julian Brown. The Quest for the Quantum Computer. Touchstone, 2001.
David Deutsch. Quantum theory, the church-turing principle and the universal quantum
computer. Proceedings of the Royal Society of London. Series A, Mathematical and
Physical Sciences, 400(1818):97–117, 1985.
Roberto Di Cosmo y Dale Miller. Linear logic. The Stanford Encyclopedia of Philo-
sophy, Winter Edition, 2016. Edward N. Zalta (ed.). https://plato.stanford.edu/
archives/win2016/entries/logic-linear.
95
96 Bibliografía
Lov K. Grover. A fast quantum mechanical algorithm for database search. En Proceedings
of the 28th Annual ACM Symposium on Theory of computing, STOC-96, págs. 212–219.
ACM, 1996.
Michael Nielsen y Isaac Chuang. Quantum Computation and Quantum Information. 10th
Anniversary Edition. Cambridge University Press., 2010.
John Preskill. Quantum computing: pro and con. Proceedings of the Royal Society of
London A, 454:469–486, 1998.
Juan Pablo Rinaldi. Demostrando normalización fuerte sobre una extensión cuántica del
lambda cálculo. Proyecto Fin de Carrera, Universidad Nacional de Rosario, Argentina,
2018.
Peter Selinger y Benoît Valiron. A lambda calculus for quantum computation with clas-
sical control. Mathematical Structures in Computer Science, 16(3):527–552, 2006.
Bibliografía 97
Peter W. Shor. Polynomial-time algorithms for prime factorization and discrete loga-
rithms on a quantum computer. SIAM Journal on Computing, 26(5):1484–1509, 1997.
André van Tonder. A lambda calculus for quantum computation. SIAM Journal on
Computing, 33:1109–1135, 2004.
Gilbert S. Vernam. Cipher printing telegraph systems for secret wire and radio telegrap-
hic communications. Transactions of the American Institute of Electrical Engineers,
XLV:295–301, 1926.
Joe B. Wells. Typability and type checking in the second-order lambda-calculus are equi-
valent and undecidable. En Proceedings of LICS-1994, págs. 176–185. IEEE Computer
Society, 1994.
William K. Wootters y Wojciech .H. Zurek. A single quantum cannot be cloned. Nature,
299:802–803, 1982.