P′′

P′′
パラダイム 命令型プログラミング, 構造化定理
登場時期 1964
設計者 コラド・ベーム(Corrado Böhm)
型付け なし
方言 Brainfuck
影響を与えた言語 Brainfuck
テンプレートを表示

P′′ (P double prime:ピーダブルプライム[1])は1964年にコラド・ベーム[2][3]によって作成された、チューリングマシンの一種を記述するための言語である。

チューリングマシンを記述するがゆえにその仕様は原始的である。チューリングマシンにもかかわらず、状態遷移はテープの内容とテープヘッドの位置だけで表現されるので、有限オートマトンの概念が希薄である。

定義

P {\textstyle {\mathcal {P}}^{\prime \prime }} (以下 P′′)は以下のように4つの命令アルファベット { R , λ , ( , ) } {\textstyle \{R,\lambda ,(,)\}} におけるワードの集合として形式的に定義される(formally defined)。

文法

  1. R {\textstyle R} λ {\textstyle \lambda } は P′′ のワードである。
  2. もしも q 1 {\textstyle q_{1}} q 2 {\textstyle q_{2}} が P′′ のワードならば、それらを繋げた q 1 q 2 {\textstyle q_{1}q_{2}} も P′′ のワードである。
  3. もしも q {\textstyle q} が P′′のワードならば、 ( q ) {\textstyle (q)} も P′′ のワードである。
  4. 以上の3つの法則から得られるワードだけが P′′ のワードである。

意味論

  • { , c 1 , c 2 , , c n } {\textstyle \{\Box ,c_{1},c_{2},\ldots ,c_{n}\}} は無限長のテープを搭載したチューリングマシンのテープ・アルファベット(テープに書かれるデータの種類)である。 {\textstyle \Box } は空白の記号であり、 c 0 {\textstyle c_{0}} と等価である。
  • P′′ の全命令は、全てのあり得るテープの構成の集合 X {\textstyle X} 順列である。つまり、テープの内容とテープヘッドの位置の両方を考慮した全てのあり得る構成である[注釈 1]
  • α {\textstyle \alpha } は述語(値を受け取ってから真偽が決定するもの)であり、現在位置のシンボルは {\textstyle \Box } ではないことを示している。これは命令ではなく、プログラム中で使用されない。しかし、その代わりとして言語の定義を補助するために使われる。
  • R {\textstyle R} は、(可能であれば)1セル分テープヘッドを右方向へ移動することを意味する。
  • λ {\textstyle \lambda } は、現在位置のシンボル c i {\textstyle c_{i}} c ( i + 1 ) mod ( n + 1 ) {\textstyle c_{(i+1){\bmod {(}}n+1)}} に置き換える(つまり、現在位置のシンボルが c n {\textstyle c_{n}} のときは c 0 {\textstyle c_{0}} に置き換えられる)。そして、テープヘッドを1セル分左方向へ移動することを意味する。
  • q 1 q 2 {\textstyle q_{1}q_{2}} 関数の合成 q 2 q 1 {\textstyle q_{2}\circ q_{1}} を意味する。言い換えると、命令 q 1 {\textstyle q_{1}} q 2 {\textstyle q_{2}} の前に実行される。
  • ( q ) {\textstyle (q)} は、条件 α {\textstyle \alpha } が成立している間だけ while ループで q {\textstyle q} を反復することを意味する。

他のプログラミング言語との関連

  • Brainfuck 言語は、P′′ の[注釈 2]非形式的な変種(informal variation)である(Brainfuck はテープの代わりにメモリを使うので、I/Oを扱わないところは異なる)。ベームはあらゆる計算可能関数を計算するのに十分な基本関数の集合のそれぞれに対して明確な P′′ のプログラムを提供している。使用したものは ( {\textstyle (} , ) {\textstyle )} そして4つのワード r λ R {\textstyle r\equiv \lambda R} r r n {\textstyle r^{\prime }\equiv r^{n}} (ここで r n {\textstyle r^{n}} r {\textstyle r} n {\textstyle n} 回の反復である)、 L r λ {\textstyle L\equiv r^{\prime }\lambda } R {\textstyle R} だけである。これらは6つの Brainfuck の命令 [, ], +, -, <, > と等価である。注意するべきは、 c n + 1 c 0 {\textstyle c_{n+1}\equiv c_{0}\equiv \Box } なので、現在位置のシンボルをn回インクリメントするとラップアラウンド( c n {\textstyle c_{n}} をインクリメントすると c 0 {\textstyle c_{0}} になること)する。そのため、一つの r {\textstyle r^{\prime }} によって、その結果は現在位置のシンボルをデクリメントすることになる(訳注:テープ・アルファベットは n+1 種類あるので、n回インクリメントするとラップアラウンドして1つ少ない数のテープ・アルファベットになる)。

プログラムの例

ベーム[2]は、x > 0 を満たす整数xの前の数 (x-1) を計算する以下のプログラムを提供している。

R ( R ) L ( r ( L ( L ) ) r L ) R r {\displaystyle R(R)L(r^{\prime }(L(L))r^{\prime }L)Rr}

これを等価のBrainfuckのプログラムに直接変換すると、

 >[>]<[[<[<]]<]>+

このプログラムは bijective base-k 記法で表現されているある一つの整数を想定している。 c 1 , c 2 , c k {\textstyle c_{1},c_{2}\ldots ,c_{k}} 1 , 2 , , k {\textstyle 1,2,\ldots ,k} にそれぞれエンコードされる。そして、数字列の前後に {\textstyle \Box } がある(例えば、bijective base-2 の場合、数字の8は c 1 c 1 c 2 {\textstyle \Box c_{1}c_{1}c_{2}\Box } とエンコードされる。なぜなら、bijective base-2 において8は112である)。計算の最初と最後に数字列の前にある {\textstyle \Box } の上にヘッドが位置することになる。

注釈

  1. ^ 原文は "All instructions in P′′ are permutations of the set X of all possible tape configurations; that is, all possible configurations of both the contents of the tape and the position of the tape-head." となっている。テープの内容とテープヘッドの位置の両方を考慮した全てのあり得る構成が命令になるとは理解し難い。
  2. ^ 英語版Wikipediaではこの部分に「a minor」という形容も付いているが、それは特に訳す意味は無いと思われる。

出典

  1. ^ https://github.com/Pbtflakes/pdbl
  2. ^ a b Böhm, C.: "On a family of Turing machines and the related programming language", ICC Bull. 3, 185-194, July 1964.
  3. ^ Böhm, C. and Jacopini, G.: "Flow diagrams, Turing machines and languages with only two formation rules", CACM 9(5), 1966. (Note: This is the most-cited paper on the structured program theorem.)