HN 日本語サマリー

← 一覧へ戻る
科学・技術

Unicodeの文字転写ルールはチューリング完全である

Unicode's transliteration rules are Turing-complete (seriot.ch)

106 pointsby beefburger30 コメント

要約

Unicodeの文字転写ルール(UTS #35)は、自然な無制限のセマンティクス下でチューリング完全であることが発見されました。これは、オペレーティングシステム、ブラウザ、ランタイム、データベースで広く使用されているICUライブラリに含まれるロケールデータとして提供されています。この発見は、文字転写ルールファイルが単なるデータではなく、実行時にレビューおよび制限されるべきプログラムコードである可能性を示唆しています。

全文翻訳

ニコラス・セリオ 計算 > Unicodeの文字転写ルールはチューリング完全である 🦄 Unicodeの文字転写ルールはチューリング完全である 2026年7月 関連情報: Jiraはチューリング完全である 目次 文字転写ルール 2-タグシステム コラッツ関数 正確性と普遍性 ICUのリライトガード ルール110 素数 結論 付録: ファイル 私はしばらくの間、Unicodeが普遍的な計算を可能にするかどうか疑問に思っていました。コアのUnicodeアルゴリズム(正規化、大文字小文字、bidi、照合)は意図的に制限されていますが、UTS #35の文字転写ルールは、その自然な無制限のセマンティクス下ではそうではありません。これは、私がまだ公開されていないと見つけた結果です。これらのルールは、ほとんどのオペレーティングシステム、ブラウザ、ランタイム、データベースで使用されている広く普及しているUnicode/グローバリゼーションライブラリであるICUのロケールデータとして提供されています。特定のルールファイルが特定の入力で終了するかどうかは決定不能です。 1. 文字転写ルール 文字転写子は通常、「é」を「e」に変換します。順序付けられたリライトルールのリストを使用します。 L { x } R > y ; ここで、xという部分文字列は、オプションのコンテキストLとRの間に配置されている場合にyに置き換えられます。リビジティング機能は、置換内に|を許可します。これはカーソルを新しいテキストの内部に配置するため、新しく書かれたマテリアルがさらなるルールをトリガーする可能性があります。 例:x > y | z ; za > w ; xa は y|za にリライトされます(カーソルはzの前)。エンジンは再スキャンし、zaが一致して yw を生成します。 PythonのPyICUモジュールを使用します。 from icu import Transliterator as T t = T.createFromRules("", "x > y|z; za > w;") print(t.transliterate("xa")) # yw これはラテン-カ夕カナ変換です。コンテキスト、キャプチャグループ、量指定子、カーソルを使用します。iまたはeの前に、cはsにリライトされ、カーソルが戻るため、sルールが再発火します。上記の同じリビジティングトリックは、本番のロケールデータに含まれています。 c } i → | s ; c } e → | s ; 2. 2-タグシステム UTS #35の普遍性を証明するために、普遍的であることが証明されているモデル(Cocke & Minsky, 1964)である2-タグシステム(Post, 1943)を文字転写ルールにコンパイルします。2-タグシステムは、文字ごとに1つのプロダクションを持ちます。各ステップは最初の2文字を削除し、最初の文字のプロダクションを付加します。2文字未満になると停止します。 3. コラッツ関数 私たちの例は、コラッツ関数(偶数 n → n/2、奇数 n → (3n+1)/2)のためのLiesbeth De Molによる2-タグシステムです。a → bc、b → a、c → aaa。これは、unaryワードaaa...aに対して行われます。読み取りマーカーMを単語の前に付け、マシンを先頭に固定します。Mでルールが一致しない場合、どこでもルールは一致しません。この構築は、文字ごとに1つのルールを使用します。 M a [abc] ([abc]*) > | M $1 b c ; M b [abc] ([abc]*) > | M $1 a ; M c [abc] ([abc]*) > | M $1 a a a ; 最初のルールはマーカー、文字a、さらに1文字に一致し、残りのすべての文字をキャプチャします。置換は次の構成を書き込み、カーソルをマーカーの前に戻すため、次のステップがすぐに発火します。文字クラス、キャプチャグループと$1、量指定子、カーソルは標準的なルール構文です(仕様のTransform Syntax Charactersテーブル)。 このマシンはuts35.pyで実行できます。collatz.txtは、|が削除された上記のリライトルールであり、各パスは正確に1つのタグステップを実行します。aaaから、実行はWikipediaのタグシステムページ(aaa、abc、cbc、caaa、aaaaa、...)の作業例を、値がaの連続として現れるように複製します。同じルールは、Pythonなしでも、ICUの標準uconv(uts35.sh)を通じて実行されます。test.shは、期待される出力に対してマシンをチェックします。 % python3 uts35.py collatz.txt aaa ICU 78.3 0 - Maaa # 3 1 - Mabc 2 - Mcbc 3 - Mcaaa 4 - Maaaaa # 5 5 - Maaabc 6 - Mabcbc 7 - Mcbcbc 8 - Mcbcaaa 9 - Mcaaaaaa 10 - Maaaaaaaa # 8 11 - Maaaaaabc 12 - Maaaabcbc 13 - Maabcbcbc 14 - Mbcbcbcbc 15 - Mbcbcbca 16 - Mbcbcaa 17 - Mbcaaa 18 - Maaaa # 4 19 - Maabc 20 - Mbcbc 21 - Mbca 22 - Maa # 2 23 - Mbc 24 - Ma # 1 4. 正確性と普遍性 最大で1つのルールが一致します。マーカーは正確に1つです。その後の文字がルールを選択します。([abc]*)は残りのすべての文字をキャプチャします。1つのリライトは正確に1つのタグステップです。文字xのルールは、マーカーがxと少なくとも1つの追加の文字に直面している場合にのみ一致します。置換は次の構成を構築します。停止は対応します。すべてのルールはマーカーの後に2文字を必要とするため、MaとMは不動点です。変換は、タグシステムが停止するときにのみ終了します。帰納法により、k回の書き換えの後、文字列は正確にMとkステップ後のタグシステムの単語になり、変換はタグシステムが停止するときにのみ不動点に達します。ここにあるものはコラッツに特有のものではありません。文字ごとの1つのルールは任意の2-タグシステムをコンパイルするため、普遍的なものは任意のチューリングマシンをシミュレートする固定ルールファイルをもたらし、初期単語にエンコードされます。 5. ICUのリライトガード ICUは、各transliterate()呼び出しをコードポイントあたり16リライト後に停止します(rbt.cppのloopLimit = span << 4; Javaポートも同じガードを持っています)。ただし、仕様自体は制限を定義していません。ガードは、終了が決定不能であるため、無限計算を防ぐためのICUの実用的な追加です。ここでは、各リライトは完全なタグステップを実行するため、文字列が安定するまで反復することは安全です。 6. ルール110 ランナーはタグシステムに限定されません。任意のルールファイルはプログラムです。rule110.txtは14ルールでルール110セルオートマトンを実装しています。セルは.(0)と*(1)で書かれます。ヘッドは前の2つのセルを運び、各セルをその場で書き換えます。1回のパスは1世代です。世代ごとに1つの燃料gがsに費やされ、燃料がなくなると実行は自己停止します。 % python3 uts35.py rule110.txt "ggggggggg*" ICU 78.3 0 - Mggggggggg* 1 - Mggggggggs**. 2 - Mgggggggss***.. 3 - Mggggggsss**.*... 4 - Mgggggssss*****.... 5 - Mggggsssss**...*..... 6 - Mgggssssss***..**...... 7 - Mggsssssss**.*.***....... 8 - Mgssssssss*******.* 9 - Msssssssss**.....***......... 7. 素数 primes.txtは、Wolframのリアルタイム素数生成セルオートマトン(A New Kind of Science, p. 640)です。16状態(0-f)と223変換ルールがあります。燃料の後の最初のセルは、素数のティックで正確に0になります。 8. 結論 文字転写ルールは、「é」を「e」に変換するために設計されました。そのうちの3行でコラッツ関数を計算できます。リビジティングカーソルによる無制限のリライトは、普遍性のための古いレシピです。驚くべきことは、それがすべてのOSに出荷されているロケールファイルのデータ形式に存在し、その仕様ではその可能性について言及されていないことです。上記の議論は、文字転写ルールファイルが単なるデータではなく、プログラムであることを示しています。外部から変換ルールを受け入れる場合、コードを受け入れていることになります。これは、ICUがすでに実行しているように、実行時にレビューおよび制限されるべきです。 付録: ファイル collatz.txt — 3ルールコラッツマシン(パスあたり1つのタグステップ) rule110.txt — 14ルールでのルール110 primes.txt — 223ルールでのWolframの素数生成セルオートマトン uts35.py — ランナー、PyICU uts35.sh — ランナー、ICUの標準uconv、Pythonなし test.sh — 自己チェック 環境: ICU 78.3, PyICU 2.16.2, macOS; Debian 12上のICU 72.1でも検証済み; 2026年7月