# Quil

Quil é uma arquitetura de conjunto de instruções quântica que introduziu pela primeira vez um modelo de memória quântica/clássica compartilhada. Foi introduzido por Robert Smith, Michael Curtis e William Zeng em A Practical Quantum Instruction Set Architecture. Muitos algoritmo quânticos (incluindo teleporte quântico, correção de erro quântico, simulação, e algoritmos de otimização) requer uma arquitetura de memória compartilhada. Quil está sendo desenvolvido para os processadores quânticos supercondutores desenvolvidos pela Rigetti Computing através da API de programação quântica Forest na nuvem. Uma biblioteca Python chamada pyQuil foi introduzida para desenvolver programas Quil com construções de nível mais alto. Um backend Quil também é suportado por outros ambientes de programação quântica.

## Máquina abstrata quântica subjacente

No artigo apresentado por Smith, Curtis e Zeng, Quil especifica o conjunto de instruções para uma Máquina Abstrata Quântica (MAQ), semelhante a uma máquina de Turing, porém mais prática para realizar tarefas "do mundo real". O estado da MAQ pode ser representado como uma 6-tupla $(|\Psi \rangle ,C,G,G',P,\kappa )$ onde:
* $|\Psi \rangle$ é o estado (quântico) de um número fixo, porém arbitrário de qubits $N_{q}$ indexados usando uma indexação de base zero.
* $C$ é uma memória clássica de um número $N_{c}$ de bits clássicos indexados usando uma indexação de base zero.
* $G$ é uma lista fixa, porém arbitrária, de portas estáticas (portas quânticas que não dependem de parâmetros, como a porta Hadamard.)
* $G'$ é uma lista fixa, porém arbitrária, de portas paramétricas (portas que dependem de um número de parâmetros complexos, como a porta de deslocamento de fase que requer um parâmetro de ângulo para ser completamente definida.)
* $P$ é uma sequência de instruções Quil a serem executadas, representando o programa. O comprimento de $P$ é denotado por $|P|$.
* $\kappa$ é um contador de programa inteiro apontando para a próxima instrução a ser executada. $\kappa$ sempre começa em 0 (apontando para a $0^{th}$ instrução) e termina em $|P|$ indicando a parada do programa (observe que a última instrução tem o índice $|P|-1$.) O contador de programa é incrementado após cada instrução, exceto por instruções especiais de fluxo de controle (saltos condicionais e incondicionais saltos, e a instrução especial HALT que interrompe o programa definindo $\kappa$ para $|P|$.
A semântica da MAQ é definida usando produto tensorial de espaços de Hilbert e os mapa linear entre eles.

## Recursos

Quil tem suporte para definir portas possivelmente parametrizadas em forma de matriz (a linguagem não inclui uma maneira de verificar se as matrizes são unitárias, o que é uma condição necessária para a realizabilidade física da porta definida) e sua aplicação em qubits. A linguagem também suporta definições semelhantes a macro de possivelmente circuitos quânticos parametrizados e sua expansão, medição de qubits e registro do resultado na memória clássica, sincronização com computadores clássicos com a instrução WAIT que pausa a execução de um programa Quil até que um programa clássico tenha terminado sua execução, ramificação condicional e incondicional, suporte de diretiva, bem como inclusão de arquivos para uso como bibliotecas (um conjunto padrão de portas é fornecido como uma das bibliotecas.)

## Rigetti QVM

A Rigetti Computing desenvolveu uma Máquina Virtual Quântica em Common Lisp que simula a Máquina Abstrata Quântica definida em um computador clássico e é capaz de analisar e executar programas Quil com possibilidade de execução remota via HTTP.

## Exemplo

O exemplo a seguir demonstra o fluxo de controle clássico necessário para fazer a teletransportação quântica do qubit no registro do processador 2 para o registro 1:
Exemplos das implementações da transformada de Fourier quântica e do solucionador quântico variacional são dados no artigo.