- Enxerga o processo de solicitação de passaporte no Reino Unido como um jogo de puzzle e relata a experiência de programar esse processo complexo em Haskell para transformá-lo em regras
- A solicitação online de passaporte tem como elementos centrais a coleta de documentos variados, a interpretação de regras complexas e subquests inesperadas
- Conecta a lógica do processo de solicitação à 'Constructive Logic', destacando que os documentos originais que sustentam cada prova são indispensáveis
- Usa o mônada LogicT do Haskell e gerenciamento de estado (State) para rastrear a lista de documentos necessários e os caminhos lógicos de prova da cidadania britânica
- O HMPO tende, na prática, a exigir primeiro o caminho de prova mais complexo, e a adoção de ferramentas de automação é lenta devido aos limites da interpretação de legislação complexa
Introdução: pedido de passaporte como um jogo
- Recentemente, vem crescendo a tendência de usar programação para resolver jogos online ou puzzles, e o Passport Application do Reino Unido também é abordado dessa forma
- O Passport Application é um tipo de "jogo de aventura e puzzle de coleta de documentos" que os britânicos jogam a cada 10 anos, com custo de cerca de £100 e um design textual rigorosamente minimalista
- O objetivo desse jogo é reunir vários documentos comprobatórios (artefacts) por meio de diferentes órgãos públicos para provar, sob critérios legais complexos, que "este solicitante é britânico"
- A recompensa do jogo é um livreto de passaporte e a "data em que a próxima partida será possível"
Estrutura e dificuldade do jogo
- A versão offline em papel é conduzida por correio registrado e procedimentos de autenticação, e os documentos a reunir em cada etapa são apresentados em forma de manual ou tabela
- O procedimento inicial é relativamente fácil, mas conforme o jogo avança surgem várias "side quests" e obstáculos
- Ex.: pedir a um conhecido com determinada profissão que faça a verificação de identidade, obter tradução juramentada de documentos em língua estrangeira, cooperação familiar, explorar os procedimentos administrativos próprios de cada órgão etc.
Relato da experiência: desafio no nível 'primeiro filho nascido no exterior'
- O autor assumiu, em nome de sua filha pequena, o desafio do nível 'primeira criança nascida no exterior' e, por já ter bastante experiência, esperava um grau de dificuldade considerável
- Mais tarde, confirmou-se que metade dos documentos exigidos no início era desnecessária, e os requisitos e explicações sobre os documentos eram bastante ambíguos ou confusos
- Não é possível se comunicar diretamente com o examinador responsável, e só se pode obter ajuda informal por meio de um agente intermediário de atendimento
- Novos documentos exigidos surgem repetidamente, às vezes até documentos inexistentes são solicitados, e o nível de dificuldade aumenta com pedidos como certidões de nascimento/casamento de ancestrais familiares raros
A lógica do HMPO: Bureaucratic Logic
- A lógica da solicitação de passaporte pode ser vista como uma Bureaucratic Logic (lógica burocrática) derivada da Constructive Logic
- Em vez de uma simples prova de "verdadeiro/falso", é preciso apresentar diretamente a comprovação documental original correspondente a cada regra
- Como o terceiro excluído (Excluded Middle) não é aceito, não se pode provar algo dizendo "em qualquer cenário, um dos dois está certo"; é obrigatório seguir um único caminho e entregar os documentos correspondentes
- Em especial, a "Britishness" depende da nacionalidade dos pais, e as solicitações de documentos avançam recursivamente em forma de árvore familiar
- Caso base: situações em que não é necessário comprovar os pais, como nascimento no Reino Unido antes de 1983 ou naturalização
Modelando as regras com código Haskell
- Com o objetivo de modularizar as regras e automatizar a inferência, foi feito um protótipo da lógica da solicitação em Haskell (especialmente com uso da mônada LogicT)
- Declara tipos como Person/Document/Proof para modelar diferentes caminhos de documentos comprobatórios conforme cada condição
- A função de prova de Britishness explora, junto com o input (informações sobre cada person), múltiplos caminhos possíveis de prova (Set of Proofs)
- Seguindo a árvore de Proof, calcula a combinação mínima de documentos necessária (Set of Set Document)
- Com a combinação de StateT e LogicT IO, faz consultas interativas e compartilhamento de estado, com ramificações e backtracking conforme o "conhecimento disponível"
- Lógica de análise da cidadania britânica:
- caminho único para prova de naturalização
- caminho (base) condicional para nascimento no Reino Unido antes de 1983
- prova recursiva via pais (incluindo condições adicionais como casamento legal)
- criação de um caminho especial conforme os pais sejam BOTBD (British Otherwise Than By Descent)
- tratamento em código de regras excepcionais como Crown Service
Execução de exemplo e caminhos de prova
- Via
ghci, com base em entradas reais (local de nascimento do solicitante, nacionalidade dos pais etc.), são derivados automaticamente 3 caminhos de prova (Proof) no total
- Para cada caminho de prova, é gerada a lista de documentos exigidos (combinação de certidões, certidões de casamento etc.)
- No caminho mais complexo, confirma-se a necessidade de prova recursiva e comprovação de vínculos matrimoniais remontando aos ancestrais
Discussão e conclusão
- Na prática, o HMPO parece exigir de propósito primeiro o caminho de prova mais complexo, e contradições jurídicas reais ou regras sutis seguem diretrizes separadas ou o princípio de "balance of probabilities"
- Se ferramentas de automação se difundirem, os solicitantes poderão identificar com muito mais facilidade seu caminho de prova e os documentos necessários
- No entanto, como a legislação é extremamente sutil e mutável, há riscos em uma automação simplista em que "o computador dá um veredito de yes/no"
- O autor está atualmente tentando comprovar pelos segundo e terceiro caminhos
Resumo do código de referência e da estrutura documental
- O código completo em Haskell pode ser visto no GitHub
- É possível conferir a implementação detalhada da lógica em Haskell, incluindo vários tipos, caminhos de prova, estrutura de módulos e funções de consulta
1 comentários
Comentários do Hacker News
SELECTnuma tabela SQL, então essa estrutura lhe parece inacreditável.:e=, pode confundir iniciantes, então a intuição seria resultado da familiaridade.