Resolvendo o problema do ‘Passport Application’ do Reino Unido com Haskell
(jameshaydon.github.io)- O procedimento de solicitação de passaporte do Reino Unido é tratado como um quebra-cabeça burocrático de coleta de documentos, e este é um caso em que as combinações de documentos necessárias para provar a nacionalidade foram calculadas com busca lógica em Haskell
- As exigências de documentos do HMPO podem recursar na direção da árvore genealógica, dependendo do local e da data de nascimento do solicitante, dos pais e dos avós, bem como da nacionalidade, condição de residência estável e estado civil dos pais
- Em um primeiro pedido de passaporte para uma criança nascida no exterior, chegaram a ser exigidos a certidão de nascimento e a certidão de casamento do bisavô paterno, e a recursão só para ao alcançar casos-base como nascimento no Reino Unido antes de 1983
- A implementação usa LogicT do Haskell e
StateT Claims IO, em vez de Prolog, para enumerar osProofpossíveis de comprovação de nacionalidade e calcular oSet Documentnecessário para cada caminho - Mesmo para o mesmo pedido, podem existir vários caminhos de prova; assim, mesmo quando há um caminho simples disponível, a exigência real pode acabar sendo mais longa, e a automação pode ajudar tanto na preparação dos documentos quanto na compreensão do motivo das solicitações
Enxergando o Passport Application como um jogo de coleta de documentos
- O Passport Application do Reino Unido é um processo de solicitação online operado pelo HMPO, e a versão online padrão custa cerca de £100 para começar
- O objetivo é reunir documentos originais espalhados por vários órgãos burocráticos para provar a proposição “o solicitante é British”
- A recompensa final é um pequeno livreto com uma data a partir da qual será possível solicitar de novo: ou seja, o passaporte
- A solicitação em papel é mais próxima de uma versão “hardcore” que depende do correio
Solicitações de documentos que surgiram em um caso real
- O caso foi um pedido feito online em nome da filha, escolhendo a dificuldade “first child passport born abroad”
- O pedido é tratado por um “examiner”, mas o solicitante só pode fazer consultas por meio de um advice agent via chat ou telefone
- A orientação do advice agent não é uma decisão oficial
- Se a pergunta for repassada ao examiner, há uma espera de alguns dias; no caso, chegou a até 10 dias
- Cerca de 50% das solicitações iniciais de documentos foram apontadas no chat como desnecessárias, e mesmo depois continuaram chegando novos pedidos
- O e-mail de solicitação incluía
__APPLICANT_NAME__, como se fosse um template quebrado, e as condições para provar a responsabilidade parental também não estavam claras - No fim, foi exigido algo raro: a certidão de nascimento e a certidão de casamento do bisavô paterno do solicitante
- “applicant's Paternal great grandfather” pode ser ambíguo entre duas pessoas
- A interpretação adotada foi
applicant's father's father's father's birth certificate
Interpretando a lógica do HMPO como um problema recursivo de prova
- A lógica do HMPO pode ser vista como uma lógica burocrática baseada em documentos
- Como na lógica construtiva, não basta a mera possibilidade lógica
- A prova exige “testemunhas” na forma de documentos originais
- Não dá para usar diretamente a lei do terceiro excluído
P ∨ ¬P- Por exemplo, não é permitido dizer que “o pai do pai nasceu ou não no Reino Unido” e enviar documentos de ambos os cenários
- É preciso escolher uma alternativa e apresentar os documentos correspondentes
- Segundo a orientação do HMPO, quem nasceu fora do Reino Unido após 31 de dezembro de 1982 geralmente se torna British citizen se, no momento do nascimento, um dos pais era “British citizen otherwise than by descent”
- Como o HMPO não usa seus próprios registros de passaporte para provar Britishness, em alguns pedidos surgem solicitações recursivas de documentos na direção de pais e avós
- A recursão para quando se alcança um ancestral cuja Britishness não depende dos pais
- Ex.: uma pessoa naturalizada
- Ex.: alguém nascido no Reino Unido antes de 1983, um caso-base de Britishness independentemente dos pais
A cadeia de solicitações no caso
- A data em que o HMPO recebeu os documentos iniciais foi 7 de junho, incluindo a certidão de nascimento do solicitante e a do pai do solicitante
- Solicitação de 12 de junho:
- Como o pai do solicitante nasceu em ou após 1º de janeiro de 1983, foi informado que era necessária prova da reivindicação de British citizenship do pai
- Como resultado, foi exigida a certidão de nascimento do pai do pai do solicitante
- Solicitação de 26 de junho:
- Como o avô do solicitante nasceu no exterior, foi informado que era necessária prova de sua reivindicação de British citizenship
- Por isso, foram exigidos documentos do bisavô paterno do solicitante
- Os documentos necessários eram a certidão de nascimento e a certidão de casamento
- Essa recursão ocorreu na forma de pedidos por e-mail
Estrutura da implementação em Haskell
- O código completo está no GitHub
- No começo, as regras foram codificadas em Prolog, mas depois o autor migrou para o mônade
LogicTdo Haskell - O objetivo não era obter uma única lista de documentos, mas vários conjuntos possíveis de documentos
- Há várias formas de sustentar a alegação de nacionalidade, então também pode haver vários conjuntos de documentos necessários
- Conceitualmente, é preciso algo como
Set (Set Document)
- O modelo de documentos representa o solicitante, os ancestrais e os tipos de certidão como tipos
Parent = Mother | FatherPerson = Applicant | Parent Parent PersonDocument = BirthCertificate Person | MarriageCertificate Person Person | NaturalizationCertificate Person | Passport Person
- Como apenas uma lista de documentos não mostra claramente por que ela basta, o problema foi tratado como uma busca de provas
- Com
LogicT, são enumerados todos osProofda Britishness do solicitante - Para cada
Proof, é calculado o conjunto de documentos necessários
- Com
Proof e estado do conhecimento
- O tipo de prova é composto por três formas
ViaParent Person Proof: derivação da Britishness por meio de um pai ou mãeAnd Proof Proof: combinação de duas alegaçõesEvidence Predicate: evidência básica
- As perguntas necessárias são feitas ao usuário durante a execução, e respostas anteriores são reutilizadas em todos os ramos e retrocessos
- Para isso, são combinados
IO,StateeLogicTtype Claims = Map Predicate Knowledgetype M a = LogicT (StateT Claims IO) a
Knowledgese divide emSureYes,SureNoeUnsurePredicaterepresenta as condições necessárias para julgar as regrasIsBritish PersonSettled PersonBornBefore Int PersonBornInUK PersonBornAfter Int PersonNaturalized PersonYears3LivingInUK PersonIsBritOtbd PersonMarried Person Person
O núcleo das regras de determinação de nacionalidade
- A função
brité a função-raiz que decide se uma pessoa é British- Primeiro, ela verifica
IsBritish p - Depois, explora Britishness por nascimento e Britishness por naturalização
- Primeiro, ela verifica
- A naturalização é um caminho simples, e o documento central é a certidão de naturalização
- Para pessoas nascidas no Reino Unido, há dois grandes casos
- Nascimento no Reino Unido antes de 1983 leva à Britishness como caso-base
- Se nasceu depois disso, é preciso verificar se um dos pais era British ou tinha status de residência estável naquele momento
- Para quem nasceu fora do Reino Unido, o caso é mais complexo
- É preciso verificar se um dos pais era British otherwise than by descent
- Ou se um dos pais era British e há prova de residência contínua por 3 anos no Reino Unido
- “British otherwise than by descent” se refere a quem não recebeu a Britishness apenas por meio dos pais
- Ex.: naturalização
- Ex.: nascimento no Reino Unido
- Ex.: nascimento no exterior enquanto os pais estavam em serviço da Crown Service
Transmissão pelos pais e a condição de 2006
viaParentrepresenta os casos em que o filho obtém Britishness por meio de um dos pais- São explorados tanto o caminho da mãe quanto o do pai, mas o caminho do pai tem uma condição adicional
- Se o filho nasceu após 2006, o caminho do pai pode ser usado normalmente
- Se nasceu antes de 2006, é preciso verificar se pai e mãe eram casados no momento do nascimento
- A implementação não inclui caminhos alternativos como “registration” nem algumas disposições históricas discriminatórias por sexo
- Leis que hoje não se aplicam ainda podem ser historicamente relevantes ao julgar a Britishness dos ancestrais
Resultado da execução e os três caminhos de prova
- A execução de
run (brit Applicant)ocorre por meio de perguntas interativas- Ex.: se o solicitante nasceu no Reino Unido
- Ex.: se o pai era British otherwise than by descent
- Ex.: se os avós tinham status de residência estável
- No caso, foram feitas ao todo 37 perguntas
- O usuário pode responder
dkpara indicar que não sabe, e então aquele ramo continua sendo explorado - O resultado mostra que o solicitante tem 3 provas de Britishness
- Proof 1:
- O solicitante nasceu após 2006
- Britishness por meio do pai
- O pai nasceu no Reino Unido
- A mãe do pai tinha status de residência estável no momento do nascimento dele
- Os documentos necessários são a certidão de nascimento do solicitante, a certidão de nascimento do pai e os documentos de residência estável da mãe do pai
- Proof 2:
- É o caminho em que a mãe do pai do pai nasceu no Reino Unido antes de 1983
- Os documentos necessários incluem as certidões de nascimento do solicitante, do pai, do avô, da mãe do avô e a certidão de casamento dos avós
- Proof 3:
- É o caminho em que o pai do pai do pai, ou seja, o bisavô paterno, nasceu no Reino Unido antes de 1983
- Os documentos necessários incluem as certidões de nascimento do solicitante, do pai, do avô e do bisavô paterno, além de certidões de casamento de duas gerações
- A exigência do HMPO,
Birth certificate for Applicant's Father's Father's Father, aparece nesse caminho
Crown Service e caminhos mais complexos
- No caso, o status de Crown Service do bisavô paterno gerou confusão, mas pelos resultados da execução ele não era necessário
- O status de British otherwise than by descent do pai já era derivado do nascimento no Reino Unido e da Britishness simples do avô
- Ainda assim, a Britishness simples do avô precisava ser provada, então a recursão desceu até a geração do avô
- Para provar a “legitimacy” do avô, a certidão de casamento também foi necessária
- O caminho escolhido pelo HMPO foi o mais longo e complexo dos três: o Proof 3
- O Proof 1 era um caminho mais simples, bastando provar o status de residência estável de um ancestral
- Cidadania por meio de um ancestral não-British mas estabelecido é não recursiva e pode ser mais simples
- Ainda assim, provar esse status em um momento específico pode ser difícil
Limitações da implementação e avaliação da automação
orElsenão explora o segundo ramo se o primeiro tiver sucesso, enquanto<|>explora os dois lados- Em algumas regras, usar
<|>produz mais caminhos de prova de cidadania, mas há casos em que o HMPO parece tentar esgotar primeiro um caminho específico - A implementação não rastreia com precisão suficiente algumas condições vinculadas a um momento específico
- Ex.: quando estado civil ou status de residência estável precisam valer no momento do nascimento de determinada pessoa
- Isso é visto como algo que pode ser adicionado sem grande dificuldade
- Não se trata de uma implementação completa da lei de nacionalidade do Reino Unido, mas apenas das partes relevantes ou interessantes para este caso
- Uma implementação completa exigiria muito mais código e muitas exceções
- Se esse tipo de software existisse, poderia ter sido útil para montar mais rapidamente o conjunto correto de documentos e entender por que as exigências ficaram tão complexas
- Há também riscos na automação completa
- Se o programa gerar um falso positivo, pode surgir a reclamação de que “o computador disse que dava”
- Substituir a expertise humana por automação pode levar a situações em que a cidadania seja negada porque “o computador disse que não dava”
- O pedido ainda não foi concluído, e o plano é seguir com o Proof 2 e o Proof 3 ao mesmo tempo e, se falharem, tentar o Proof 1
1 comentários
Opiniões no Hacker News
Ao longo dos últimos 10 anos, lidei com vários grandes sistemas do governo britânico, e este texto mostra bem por que surgem resultados estranhos ao criar serviços/software governamentais.
Software governamental é, em essência, o trabalho de transformar em código centenas de anos de leis do Parlamento. Se você cria o sistema de passaportes do HMPO e a lei que serve de base para ele muda ou é revogada, alguém precisa encontrar e corrigir, em todos os sistemas, as partes afetadas por essa lei.
Some a isso o fato de o governo frequentemente terceirizar para consultorias caras, e de essas empresas terem incentivos para ampliar contratos, extrair o máximo valor do cliente e se entrincheirar. Como elas acabam criando sistemas com qualidade e flexibilidade irregulares, o mesmo processo se repete toda vez que a lei muda.
Antes havia uma autoridade central de decisão, como os Spend Controls, mas hoje não há um centro para coordenar esse problema, e é por isso que entregar serviços governamentais sai tão caro.
Na prática, eles criam algo próximo de funcionar e cobram algo como 1000 vezes a mais por um resultado que um desenvolvedor júnior provavelmente entregaria em 3 meses, mas parecem receber como se o sistema realmente tivesse funcionado.
O formulário era fácil de acompanhar, e depois fui uma vez a um escritório para concluir o processo, o que levou só 10 minutos, e o passaporte foi entregue. Acho que foi um procedimento tão pouco doloroso quanto possível.
Seja qual for a situação no Reino Unido, ela não é sem esperança. O governo não deveria ter medo de contratar funcionários de verdade e deveria internalizar todo o desenvolvimento.
Como apontado, todo o trabalho técnico foi terceirizado, então parte da lacuna parece ser a falta de capacidade interna na organização para imaginar e executar uma reformulação bastante revolucionária.
É muito frustrante que o governo gaste dezenas de milhões em custos de subcontratadas em projetos de TI, mas não consiga pagar preço de mercado a engenheiros internos que, no longo prazo, poderiam sair mais baratos.
Seria bom ter um sistema em que, em vez de espalhar condicionais de exceção por toda parte, bastasse aplicar “patches” de forma append-only.
Algumas linguagens de programação lógica permitem isso até certo ponto, mas o verdadeiro problema parece ser a falta de um orçamento para dívida técnica e o fato de que advogados que lidam com leis também podem se beneficiar da complexidade. Seria bom haver pessoas dedicadas a manter as leis o mais simples possível.
A sintaxe de Haskell é interessante. Depois que alguém explica, ela é intuitiva; antes da explicação, nem tanto.
Não acho que seja apenas por eu estar acostumado a linguagens da família Algol (C, Python etc.). O código Haskell que vi até agora tinha operadores demais tentando deixar o código conciso, e só de olhar não ficava claro o que faziam: https://academy.fpblock.com/haskell/tutorial/operators/
Foi há muito tempo, então não tenho vontade de repetir, mas mesmo sendo generoso com o lado do JavaScript, os operadores necessários em Haskell na prática não são 10 vezes os de JavaScript na prática, e sim cerca de 2 vezes.
Haskell tem uma complexidade incidental que é preciso aceitar no início, mas a diferença em relação às linguagens populares para iniciantes não é de tipo, e sim de grau. É fácil esquecer o quanto já aprendemos sobre linguagens no estilo Algol, porque isso já está internalizado demais.
Já ensinei Java e Python a alunos do ensino fundamental e médio que eram iniciantes em programação, e, especialmente no 1:1, eles frequentemente travavam em coisas nas quais eu nem lembrava mais que seria preciso explicar. Como errar a posição de
:em Python ou não entender como=funciona.Mesmo sintaxes “básicas” como
:e=são muito mais complexas do que imaginamos. É parecido com um falante nativo de inglês não perceber a regra de ordem dos adjetivos em “big red ball” e “red big ball”, enquanto quem está aprendendo bate de frente com isso como se fosse um muro.Se você pegar um programa Java qualquer sem saber programar, também vai entender quase nada. Da mesma forma, se tentar ler uma fórmula sem nunca ter feito uma aula de matemática, não vai entender operadores nem coisa alguma.
O critério deveria ser quanto se consegue entender depois de aprender o básico e fazer alguns tutoriais.
Intuitivo significa algo mais próximo de ser fácil de entender ou aprender sem conhecimento prévio nem explicação.
E o objeto da reclamação, na verdade, nem parece ser a sintaxe. Alguns componentes de Haskell fazem referência a modelos específicos, como mônadas ou lenses, e, se o leitor ainda não tiver esse conhecimento, nenhuma sintaxe vai injetá-lo nele.
Gostei deste texto. No começo parecia uma paródia, mas aos poucos se transformou em uma solução séria e elegante para aquele “jogo”.
No fim, eu mesmo fiquei com vontade de tentar.
O pedido de passaporte britânico pode ser feito totalmente online, exceto pelo envio dos documentos necessários ao HMPO pelo correio.
Mesmo quem se tornou um “novo” cidadão por adoção, naturalização ou ascendência pode solicitar um novo passaporte de fora do Reino Unido usando apenas um dispositivo móvel, inclusive tirando a foto, sem baixar nenhum app separado.
Dá até para brincar de fazer o “modo difícil” com papel e caneta, mas minha experiência foi muito eficiente, rápida e simples.
Funcionou perfeitamente até em um computador antigo e em um navegador “ancestral”, e as cores, textos, botões, campos de entrada e requisitos eram todos simples, acessíveis e claros. A navegação passo a passo também era simples e, de fato, amigável.
É uma pena que mais empresas não se importem o bastante com seus clientes para investir em sites tão bem projetados. O HMPO mandou bem.
Para comparar, quando renovei um passaporte canadense na Califórnia, era um passaporte danificado após 3 anos e levou 4 meses. Era totalmente baseado em papel e tinha exigências absurdas, como foto com carimbo de um fiador e de um fotógrafo.
Sei que há um piloto digital em andamento, mas eles precisam implantá-lo por completo o quanto antes.
É preciso uma entrevista presencial e também a assinatura de uma pessoa responsável, algo a que muita gente não tem acesso. Por exemplo, médicos não são aceitos.
Para quem for fazer esse processo no Japão, estes foram os documentos que precisei apresentar. Vai variar conforme a situação, e especialmente como o autor também parece ter nascido fora do Reino Unido, talvez tenha precisado de outros documentos ou de mais documentos.
O que enviei foi uma cópia autenticada da certidão de nascimento encomendada ao General Register Office do Reino Unido, o koseki japonês original e a tradução, o certificado original de aceitação do registro de nascimento e a tradução, a certidão de casamento original e a tradução, cópias coloridas de todas as páginas do passaporte japonês da criança, e uma cópia do passaporte de um cidadão americano ou britânico confirmando que a criança é minha filha.
O processo é bem obscuro e, em geral, parece estruturado como um envio contínuo de documentos até que o responsável fique satisfeito.
applicant's father, ou seja, eu, nasci no Reino Unido, mas oapplicant's father's fathernão nasceu no Reino Unido, e isso foi o que gerou a complexidade adicional.Eu sou britânico, minha esposa é húngara e moramos na Hungria, e exigiram as certidões de nascimento de ambos os pais e de todos os quatro avós.
Como minha esposa não tem contato com o pai, tivemos que enviar uma carta de apresentação explicando a situação, e ela foi aceita. Mas, de todo modo, a nacionalidade britânica do meu filho vem da minha nacionalidade britânica, então não entendo muito bem por que a nacionalidade da minha esposa e a dos pais dela seriam relevantes.
Não precisei copiar o passaporte de outra pessoa, mas um amigo da família teve que confirmar online. Esse amigo da família é advogado no Reino Unido, então estava na lista de profissões aprovadas.
Tive que fazer um pedido MN1 por causa da minha filha, que nasceu nos EUA. Foi porque tanto eu quanto meu cônjuge nascemos no exterior.
Como o post original sugere, isso é uma espécie de side quest chamada “registro”, e, se não for feito antes de a criança completar 18 anos, o prazo expira. Claro, pelo que sei, ainda existem caminhos para obter cidadania mesmo nessa situação.
A parte mais difícil do processo foi encontrar alguém para autenticar meus documentos comprobatórios, algo que esta versão de Passport Application não cobria, mas que parece material para um futuro pacote de DLC. Dizem para enviar os originais, mas eles retêm documentos, inclusive passaportes, por 3 a 6 meses, então isso é inviável para residentes no exterior.
Não me lembro das regras exatas, mas não dava para usar um tabelião americano nem um procedimento comum de autenticação por advogado, e no fim tive que ir a um escritório de council.
Liguei para uns cinco councils, e todos disseram que não conheciam o procedimento ou os requisitos; no fim, encontrei uma pessoa muito prestativa no Islington Council. Ainda assim, ficou entre as interações mais frustrantes que já tive com o governo britânico.
Eu também joguei Passport Application por procuração.
Uma das regras interessantes que o post original não menciona é a regra da história variável. Os fatos contidos em um documento podem mudar em um curto período, então talvez seja preciso devolver um documento que já foi escaneado no sistema de registros factuais do examinador para que ele seja escaneado novamente depois.
Dizem que verificar que os fatos de um documento não mudaram significa que a raça dos examinadores reconhece implicitamente a existência do multiverso.
O canal de comunicação entre os atendentes telefônicos “NPC” e os examinadores parece semelhante a uma oração, e o que se recebe de fato são apenas inferências vagas.
Além disso, o autor do post original talvez seja fã de Mornington Crescent, um jogo cuja topologia de regras parece semelhante à do Passport Application mencionado antes.
A certidão de nascimento também é imutável em certo sentido, mas nem tudo que está escrito nela é completamente imutável.
Além disso, o escritório de passaportes esqueceu a decisão tomada sobre meu passaporte anterior, que explicava e aceitava essa divergência de sobrenome. Em um dos passaportes, eu até aparecia em uma página do passaporte da minha mãe.
Os NPCs dão muita raiva. A cada ligação e e-mail, a resposta era diferente. Parecia um modelo de linguagem de grande porte péssimo.
Depois de enviar os pedidos, tive que explicar à minha mãe que, dentro do mesmo pacote de solicitações, uma filha precisava de documentos britânicos adicionais, mas a outra não precisava e já tinha recebido o passaporte. Simplesmente porque uma nasceu no Reino Unido e a outra não.
Minha mãe, é claro, explodiu, levou o problema ao deputado e tudo foi resolvido em um dia.
Acabei de passar por esse procedimento infernal por causa de uma das minhas filhas. Ela nasceu no Japão, e tive dificuldade para fazer o sobrenome da minha mãe bater com o que consta na minha certidão de nascimento.
Em resumo, como eu havia comprovado que nasci na Inglaterra e que tenho cidadania, isto é, passaporte, parecia que, qualquer que fosse a possibilidade considerada, esse deveria ser um status transmissível à minha filha. Não corresponde às diretrizes de documentos exigidos, mas me parece uma forma muito menos dolorosa.
“Qual é o caso base? O caso base é um ancestral cuja condição de britânico não depende dos pais, por exemplo alguém que se naturalizou ou que nasceu no Reino Unido antes de 1983. Quanto mais você se afasta de 1983 em direção ao futuro, mais profunda fica essa pilha de chamadas” — esse trecho parece coisa de maluco para quem vem de um país onde existe um banco de dados central de cidadãos e residentes estrangeiros, e a verificação de cidadania seria algo como um único
SELECTem uma tabela SQLPessoas nascidas no exterior muitas vezes também são cidadãs, e o Reino Unido passou por uma quantidade absurda de mudanças territoriais que afetaram a cidadania
Alguns cidadãos atuais têm cidadania porque nasceram em Bombay, ou seja, Mumbai, e outros porque nasceram em Hong Kong
Para manter uma lista confiável de cidadãos, seria necessário um registro periódico, e quem não se registrasse teria de perder a cidadania
SELECTem uma tabela SQL. Eu apostaria nisso com prazer, mesmo com odds extremamente desfavoráveis para mimJoguei esse jogo alguns anos atrás
Apesar de ter nascido no Reino Unido, filho de pai britânico, meu personagem antes não era britânico. Isso porque meus pais não eram casados, e eu nasci depois de 1983, mas antes da mudança das regras em 2006
Não tenho certeza do momento exato, mas em algum ponto dos anos 2010 a atualização de 2006 parece ter sido aplicada retroativamente, e meu personagem também pôde ser jogado. Não fiz muitas missões secundárias; a principal foi encontrar a certidão de nascimento do meu pai
Meu personagem também teve de comparecer à cerimônia de endgame e jurar lealdade à rainha, o que pareceu estranho para alguém que nasceu neste país e viveu aqui a vida toda