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

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の中には特定のモデル(モナドやレンズ)を参照する構文があって、それを持っていない読者にはどんな文法もその知識を与えることはできないからね。

Hacker Newsで議論の続きを見る