https://jameshaydon.github.io/passport/
Прочитал уморительную статью про попытку логически решить задачу подачи на британский паспорт.
Суть в двух словах: автор подавал свою дочку, рожденную не в ЮК, на паспорт, у него изначально запросили сколько-то документов.
Он их нашел, перевел, предоставил… спустя неделю запросили еще документов.
Дело в том, что англичане для принятия
А как понять, был ли кто-то из твоих родителей британцем? Либо они родились в британии, либо… :)
Это рекурсивное дерево продолжается до тех пор, пока не достигнут “base case” - предок, имевший гражданство до 1983 года,
тк для него и для его предка уже не обязательно доказывать легитимность этого гражданства.
Для всех, родившихся после, доказывать “британскость” надо.
И главный прикол подачи на паспорт (на практике - на любые документы) в ЮК - ты не можешь изначально узнать весь набор документов, которые тебе потребуются. Отправь емейл - и через 5-7 business days ты узнаешь, какой документ от тебя ждут для прохождения на следующий этап.
Поигравшись месяц в эту игру и после того, как для паспорта его дочери запросили applicant's father's father's father's birth certificate, автор не выдержал и написал скрипт на Haskell, который задает тебе вопросы, и исходя из ответов показывает доступные варианты пруфов и наборы документов.
Не буду подробно пересказывать, что там написал автор - в целом, аккуратно расписал все правила и конфликты в виде логических функций. Приведу пару примеров того, как это выглядит:
-- | British citizenship for those born abroad
britBornAbroad :: Person -> M Proof
britBornAbroad p =
viaParent p $ \parent ->
britOtbd parent `orElse` (brit parent `and` evidence (Years3LivingInUK parent))
-- | British otherwise than by descent (BOTD)
britOtbd :: Person -> M Proof
britOtbd p = do
check (IsBritOtbd p)
evidence (Naturalised p) `orElse` britOtbdUkBorn `orElse` bornCrownService p
where
britOtbdUkBorn = evidence (BornInUK p) `and` britBornInUk p
bornCrownService :: Person -> M Proof
bornCrownService p = viaParent p $ \parent -> do
check (CrownService parent)
brit parent `and` evidence (CrownService parent)
Итоговая программа задает тебе вопросы, пока не придет к однозначному base case и соответствующему набору документов, например:
Proof 1:
• Applicant was born after 2006
• Via Applicant's Father's britishness:
• Applicant's Father was born in UK
• Via Applicant's Father's Mother's britishness:
Applicant's Father's Mother was settled at time of birth
Possible doc sets:
• - Birth certificate for Applicant,
- Birth certificate for Applicant's Father,
- Settled status document for Applicant's Father's Mother
Всего за 37 вопросов скрипт собрал аж 3 возможных пруфа с наборами документов - естественно, applicant's father's father's father's birth certificate требуется только в самом длинном и неоптимальном пруфе)
В общем, смешно и познавательно!
Всем, кто когда-либо подавался на английские визы / подтверждал дипломы и т п - очень советую почитать, прям одинаковые паттерны:)
Хорошо, что я уже со своей англией успокоился.