世界を動かす技術を、日本語で。

Haskellを用いた「パスポート申請」の解決方法

概要

  • イギリスのパスポート申請 を「ゲーム」として捉えた体験談
  • 書類収集複雑なルール が「アドベンチャーパズル」として描写
  • 家系図の遡り書類の再帰的要求 が特徴
  • 論理プログラミング でルールを自動化する試み
  • 文化的現象ユーモア も交えた解説

英国版「パスポート申請」ゲームの魅力

  • His Majesty's Passport Office (HMPO) が開発した、イギリスで大人気の「パスポート申請」ゲーム
  • 10年ごと に多くの英国人が挑戦し、標準オンライン版は 約£100 と高額
  • ミニマリズムなテキストUI、書類収集型アドベンチャーパズル仕様
  • ゴールは 「申請者が英国人である」 ことを、 議会制定法 のルールに従い証明すること
  • クリア報酬は 小冊子(パスポート)、次回プレイ可能日付き

ゲームの進行とサイドクエスト

  • 最初は基本情報と写真提出 のみで簡単だが、徐々に難易度上昇
  • 「本人確認」サイドクエスト :会計士や公務員、時に珍しい職業(葬儀屋、航空パイロット等)の知人に協力依頼
  • 「原本書類」提出 が主メカニクス、英語以外は 「公的認証翻訳」 も必要
  • 家族の書類も必要になり、 協力プレイ(Co-op) 要素追加
  • 書類発行機関ごとに 独自の謎解き要素 あり、数週間~数ヶ月かかることも

英国籍証明のロジックと「再帰的書類要求」

  • British Nationality Act 1981 に基づき、申請者・親・祖父母の出生地と生年月日が審査基準
  • 1983年以降生まれ は親の英国籍取得経緯まで遡って証明が必要
  • HMPOは自前のパスポート記録を信用せず、家系の「根本ケース」(例:1983年以前英国生まれ、帰化者)まで書類提出を要求
  • メールで再帰的に書類要求 が届き、時に「曽祖父の出生証明書」など100年前の書類が必要
  • ミスディレクション曖昧な説明 が多く、NPC(アドバイス担当)との会話も攻略要素

バックエンドの論理(Bureaucratic Logic)

  • Constructive Logic に由来し、「証明」には 原本書類 が必須

  • 排中律(P or not P) は許されず、どちらか一方にコミットし、その証明書類を提出

  • ルールの自動化は 証明探索問題(Proof Search) として定式化可能

    • 例:HaskellやPrologで「どの書類集合が条件を満たすか」を探索
    • 証明木(Proof Tree) を構築し、必要な書類セットを列挙
    • インタラクティブな質問応答状態管理 も重要

プログラミングによる自動化の試み

  • HaskellのLogicTモナド で証明探索を実装
  • 複数の証明経路 が存在し、どれか一つの書類セットで十分
  • 証明理由の説明 も出力可能な設計
  • 状態管理分岐探索 を組み合わせ、効率的な書類リスト自動生成を目指す

まとめと文化的意義

  • パスポート申請 は英国人にとって 一大イベント かつ 社会的儀式
  • 非英国人でも挑戦可能、ルール理解と書類集め自体が「遊び」
  • 書類収集、家族巻き込み、再帰的要求、論理的思考 の組み合わせが独特の「面白さ」
  • 自動化ツールの開発 はゲーム性を損なう可能性もあるが、仕組み理解には有効
  • ユーモアと皮肉 を交えつつ、英国の官僚主義文化を体験できる貴重な「ゲーム」

Hackerたちの意見

日本でこれをやる人のために、私が提出した書類を紹介します。状況によって異なると思いますが、特に著者がイギリス以外で生まれている場合は、他の書類が必要になるかもしれません。とにかく、私が提出したのは以下の通りです:出生証明書の公証済みコピー、イギリスの一般登録局からの命令。日本の戸籍の原本(コピーではなく)とその翻訳。出生届受理証明書の原本と翻訳。結婚証明書の原本と翻訳。子供の日本のパスポートの各ページのカラーコピー。子供が私の子供であることを確認するアメリカ人またはイギリス人のパスポートのコピー。プロセスはかなり不明瞭で、一般的には満足するまで書類を提出し続ける必要があるようです。

著者がイギリス以外で生まれている可能性があるため、他の書類が必要かもしれません。実際、今回の申請者の父(私)はイギリスで生まれましたが、申請者の父の父はそうではなく、そのために余計な複雑さが生じています。

子供の日本のパスポートの各ページのカラーコピー。なんで?

面白いね、親の出生証明書が必要ないの?私は(イギリス人で、妻はハンガリー人、ハンガリーに住んでる)両親の出生証明書と、四人の祖父母の出生証明書を提出するように言われたよ。妻は父親と連絡を取っていないから、状況を説明するカバーレターを提出しなきゃいけなかったけど、それは受け入れられた(でも、なんでそれが関係あるのかはよく分からないけどね、息子のイギリス国籍は私のイギリス国籍から来てるし、彼女の国籍や両親の国籍は基本的に関係ない)。他の誰かのパスポートのコピーも必要なかったけど、家族の友人にオンラインで確認してもらう必要があった(その友人はイギリスの弁護士だから、この仕事の承認リストに載ってた)。

イギリスのパスポート申請は、必要な書類をHMPOに郵送する以外は完全にオンラインで完結できます。養子縁組、帰化、または血統による「新しい」市民として、新しいパスポートをオンラインで、特別なアプリをダウンロードせずに、モバイルデバイスだけで申請できます。写真も撮れますよ。もちろん、「ハードモード」で紙とペンを使ってやってもいいですが、私の経験では非常に効率的で、早くて、簡単でした。

最近、オンラインシステムを使って更新しましたが、初めての体験でした。全体のプロセスは非常に早かったです。カリフォルニアから2週間以内にパスポートが戻ってきました。比較すると、カナダのパスポート更新(3年で損傷したもの)は4ヶ月かかりました。完全に紙ベースで、紹介状や写真を撮影したスタンプが必要など、馬鹿げた要件がありました。現在進行中のデジタルパイロットがあることは知っています。それは早急に導入されるべきです。

昨年、イギリスのオンラインパスポート更新システムを使ったけど、すごく良いウェブサイトだった。久しぶりに本当に新鮮な感じがした。古いコンピュータと「古代」のブラウザでも完璧に動いたし、すべてがシンプルでアクセスしやすく、わかりやすかった。色、テキスト、ボタン、フィールド、要件もすごく良かった。シンプルなステップバイステップのナビゲーションで、実際にフレンドリーだった。もっと多くのビジネスが、こんなに良くデザインされたウェブサイトに投資して、顧客を大事にしてくれればいいのに。HMPO、お疲れ様!

Haskellは面白い文法を持っています。誰かに説明してもらった後は直感的ですが、説明の前はあまり直感的ではありません。Algol系の言語(C、Pythonなど)に慣れているからではないと思います。私が見たHaskellのコードは、コードを簡潔にするための多くの演算子で溢れていますが、見ただけでは何をするのかは明らかではありません。 https://academy.fpblock.com/haskell/tutorial/operators/

誰かに説明してもらった後は直感的ですが、説明の前はあまり直感的ではありません。直感的というのは、事前の知識や指導なしで簡単に理解できることを意味するんじゃない?

あのリンクのオペレーターはほとんどが普通のもので、Haskellについて言えることの中で一番面白くないことだと思う。もしプログラミングを知らなくて、ランダムにJavaのプログラムを選んだら、あんまり理解できないだろうね。数学の授業を一度も受けていなかったら、数式を読もうとしても、オペレーターや何も理解できないと思う。基準は、基本を学んでいくつかのチュートリアルをやった後に、どれだけ理解できるかだと思う。

ある時、ざっと数えたことがあって、「普通の」Haskellコードで出会うオペレーターの数は、レンズやドメイン特化のライブラリを避ければ、JavaScriptで出会うオペレーターの数にかなり近かった。これ、結構前の話で今は再計算したくないけど、JavaScriptに優しく見積もっても、実用的なHaskellは実用的なJavaScriptの約2倍のオペレーターが必要だと思う。Haskellには初めのうちの偶発的な複雑さがあるけど、人気のある入門言語とは種類の違いではなく、程度の違いだよね。Algolスタイルの言語について、どれだけ学ばなきゃいけなかったかを過小評価しがちだけど、実はそれをすごく内面化しているから気づかないんだよね。プログラミング初心者(高校生や中学生)にJavaやPythonを教えたことがあるけど、特にマンツーマンだと、説明が必要だとすら思わなかったことに混乱しているのを見たことがある!例えば、Pythonでは、みんなが:を間違った場所に置いたり、=の使い方が分からなかったりする。「基本的な」構文である:や=は、実は私たちが思っているよりもずっと複雑なんだ。私たちは基本をしっかり学んだから、もう第二の天性みたいになってる。英語のネイティブスピーカーが形容詞の順序にルールがあることに気づかないのと似てる(「big red ball」と「red big ball」の違い)、言語学習者はそれにぶつかると壁にぶつかるみたいに。

ラリー・ウォールがperlについてこんなことを言ってた気がする。物事は学んだ後にしか直感的にならないんだ。あなたが文法について文句を言っているとは思わないよ。Haskellの中には特定のモデル(モナドやレンズ)を参照する構文があって、それを持っていない読者にはどんな文法もその知識を与えることはできないからね。

私は娘の一人と一緒に地獄を経験しました。彼女は日本で生まれたのですが、母の姓を出生証明書に合わせるのが大変でした。長い話を短くすると、私はイギリスで生まれたことと市民権(パスポート)を持っていることを証明しました。どんな可能性があっても、受け継がれるべきものだと思います。それは必要な書類のガイドラインには合っていませんが、ずっと楽だと思います。

これ、めっちゃ好き。最初はパロディみたいだけど、徐々に真剣でエレガントな解決策に変わっていくのがいいね。最後には、自分でもプレイしたいと思うくらいだった。ブラボー!

プレイできると思うけど、エンドゲームのステージをクリアするのはかなり難しいね。

過去10年間、いろんな大規模なイギリス政府のシステムに関わってきた。この記事は、政府のサービスやソフトウェアを書くことの問題をまとめていて、しばしば奇妙な結果を生む。政府のためにソフトウェアを書くことは、何世代にもわたる議会法のコーディフィケーションみたいなもので、HMPOのパスポートシステムを構築することを想像してみて。そこに基づく法律や法令が変更されたり廃止されたりしたら、影響を受けたすべてのシステムの中で何を変更しなきゃいけないかを見つけて変更する必要がある。政府はこの作業を高額なコンサルタントに外注することが多くて、彼らは契約を長引かせてクライアントから最大限の価値を引き出そうとする... そして理想的には、根を下ろす。そうやって、さまざまな品質や柔軟性のシステムを構築し、次に法律や法令が変更されるたびにこのプロセスが繰り返される。これを解決するための中央の意思決定機関は存在しない(以前は支出管理があったけど)、だから政府のサービス提供はすごく高くつくんだ。

なんで契約者にちゃんとしたシステムを作る契約義務がないのか、何か知ってる?彼らはほぼ動作するシステムを作るけど、出力が一人のジュニアプログラマーの3ヶ月の仕事に見えるのに、x1000倍の料金を請求して、実際にシステムが動いているかのように支払われるんだよね。

最近フランスでパスポートを更新したんだ。ここには、取得したい書類のための新しいプラットフォームがあるんだ。オンラインで一つのフォームを記入するだけで、かなり簡単だったよ。その後、手続きを終えるために一度オフィスに行かなきゃいけなかったけど、それも10分で済んで、パスポートが届いたんだ。これ以上ないくらいスムーズだったと思う。イギリスの状況がどうであれ、絶望的ではないよ。政府は実際の従業員を雇うことを恐れずに、全ての開発を社内でやるべきだね。

このゲームのイタリア版はすごく面白くなると思う。

何年か前にこれをプレイしたんだ。イギリスで生まれたけど、父がイギリス人でも、両親が未婚だったから、キャラクターは以前はイギリス人じゃなかったんだ。1983年以降、2006年のルール更新前に生まれたからね。でも、いつかはわからないけど、2010年代のどこかで2006年の更新が遡及的になったみたいで、キャラクターがプレイできるようになったんだ。サイドクエストはあまりやらなくて、メインは父の出生証明書を取り戻すことだった。キャラクターはエンドゲームの式典にも出席して、女王に忠誠を誓わなきゃいけなかったんだけど、国で生まれて一生ここに住んでる人間にとってはちょっと変な感じだったな。

少なくともボーナスのエンドクレジットはもらえたね!

私も代理でパスポート申請のゲームを楽しんだことがあるよ。OPが言及してない面白いルールの一つは「可変履歴」ルールだね。ここでは、単一の文書に含まれる事実が短期間で変わることがあって、すでに審査官の事実記録システムにスキャンされた文書が、後のスキャンのために返却されることがあるんだ。文書の事実が変わっていないことを確認するのは、審査官たちが多元宇宙が存在することを暗黙に認めているとも言われてる。 "NPC"の電話エージェントと審査官の間のコミュニケーションは、祈りに似ているみたいで、ほんの漠然とした推測しか受け取れないんだ。あと、OPはモーニントン・クレセントの愛好者かもしれないね。あれもパスポート申請とルールの構造が似てるゲームなんだ。

そうそう、イギリスのシステムでは名前が流動的で、宣言なしで自由に変更できるんだ。だから母は、母の3回目の結婚の姓で私の出生を登録できたんだよ。出生証明書も特定の方法では不変だけど、全てが不変というわけではないんだ。パスポートオフィスは、私のパスポートに関する以前の決定を忘れちゃって、こういう姓の不一致が説明されてきたこともあるし。(母のパスポートのページに私が載ってるパスポートも含めて!)NPCたちは本当にイライラする。電話したり、メールしたりしたけど、毎回違う答えが返ってきた。まるでクソみたいなLLMみたいだったよ。申請後、同じ申請のバッチの中で、一人の娘は追加のUK書類が必要だったけど、もう一人は必要なかったって母に説明しなきゃいけなかったんだ。単に一人はイギリスで生まれて、もう一人はそうじゃなかったから。母は正当に怒って、議員に訴えて、1日で解決したんだ。

最初にHaskellについて疑問を持っていたんだけど、全体のモデルをひっくり返して、ユーザーが望む結果を定義し、システムが有効な入力を解決する制約システムとして扱えることに気づいたんだ。だから、ユーザーがどのフィールドを埋めるべきかを推測するのではなく、システムがすでに合法な組み合わせを知っているんだ。これは論理が決定論的で宣言的な場合にのみ機能するんだけど、Haskellはそれをネイティブにサポートしているから、これが理由の一つかもしれないし、このユースケースにはぴったりだと思うよ。