Stackylogicは、前の課題で作成したプログラミング言語です:Stackylogicを実行します。詳細と例については、その投稿を読んでください。しかし、次のように機能します。
Stackylogicは、入力用に
0
とを取り1
、単一0
または1
完了時に出力します。プログラムは、文字のみを含む行で構成さ
01?
だけでなく、正確に一つとして<
ラインの1の終わりに。行は空ではないかもしれないとして行が<
少なくとも一つ持っている必要があります0
、1
または?
それ以前に。2ビットのNANDを計算するサンプルプログラムを次に示します。
1 ?< 11 ? 0
プログラム内のすべての行はスタックと見なされ、左が下、右が上になります。暗黙的に、プログラムの最初の行の前と最後の行の後に空のスタック(つまり空の行)があります。
<
プログラムが実行されたときに、カーソルと呼ばれ、マークスタックは上を開始します。実行は次のように進行します。
カーソルが現在指しているスタックから先頭の文字をポップします。
- 文字がの場合、
?
ユーザーにa0
またはa を要求し、それが文字であるかのよう1
に動作します。- 文字がの場合、
0
カーソルを1スタック上に(現在の行の上の行に)移動します。- 文字がの場合、
1
カーソルを1スタック下に(現在の行の下の行に)移動します。カーソルの移動先のスタックが空の場合、スタックからポップされた最後の値(常にa
0
または1
)を出力し、プログラムを終了します。それ以外の場合、カーソルの移動先のスタックが空でない場合は、手順1に戻ってプロセスを繰り返します。
この課題を実現するために重要なことは、すべてのStackylogicプログラムが真理値表と同等であることです。所定の数のブール値が入力され、正確に1つのブール値が確定的に出力されます。
したがって、あなたのタスクは、満たすかシミュレートするStackylogicプログラムを作成することです。つまり、与えられた真理値表と同じ出力を持ちます。しかし、Stackylogic が任意の真理値表をシミュレートできることは明らかではないため、ここに帰納法による証明があります。
規範事例
2つの0入力の真理値表は、常に
0
またはを 出力する表です1
。これらのテーブルに相当するStackylogicは0<
、1<
それぞれです。誘導ステップ
Stackylogicが任意のN入力真理値表をシミュレートできると仮定します。M = N + 1とします。
M入力テーブルTは、2つのN入力テーブルT 0およびT 1に追加の入力ビットBを加えて表現できます。Bが0の場合、T 0の結果が使用されます。Bが1の場合、T 1の結果が使用されます。
たとえば、擬似コードに対応する3入力の真理値表
if B: result = x OR y else: result = x NAND y
は
B x y | result 0 0 0 | 1 0 0 1 | 1 0 1 0 | 1 0 1 1 | 0 1 0 0 | 0 1 0 1 | 1 1 1 0 | 1 1 1 1 | 1
これは実際には、NANDとORの2つの2入力真理値表であり、多重化ビットBで互いに積み重ねられています。
S 0とS 1をそれぞれT 0とT 1を満たすStackylogicプログラムとします(これらは最初の仮定に基づいて存在することがわかっています)。Tを満たすプログラムSは、次のように構築できます。
[lines of S0 excluding the cursor, with 0 appended to all lines below the cursor] ?< [lines of S1 excluding the cursor, with 1 appended to all lines above the cursor]
この配置は、(lineからの)最初の入力ビットに基づいて、S 0とS 1の間を効果的に多重化し
?<
ます。そうである0
場合、カーソルは追加0
されたものをS 0の元のカーソル位置まで移動し、空のスタックによって上下に境界付けられるため、元のS 0とまったく同じように実行されます。同様に、1
が入力された場合、カーソルはの 位置1
からS 1のカーソル位置に移動し、単独であるかのように実行を開始します。たとえば、ORおよびNANDのStackylogicプログラムは
? ?<
そして
1 ?< 11 ? 0
それらを組み合わせてシミュレートできます
if B: result = x OR y else: result = x NAND y
そのようです:
1 ? 110 ?0 00 0 ?< ?1 ?
したがって、Stackylogicプログラムで真理値表をシミュレートできます。
チャレンジ
Nの入力真理値表(N> 0)を2 Nブール値のリストの形式で取得するプログラムまたは関数を作成します。これは、テーブルの出力をバイナリの昇順で表します。
妥当な入力形式であれば問題ありません。例:OR真理値表
x y | OR
0 0 | 0
0 1 | 1
1 0 | 1
1 1 | 1
これらのスタイルの入力のいずれでも問題ありません。
0111
0, 1, 1, 1
0
1
1
1
[False, True, True, True]
真理値表を満たす、つまり、同じ入力に対してまったく同じ出力を持つStackylogicプログラムを出力または返します。そのテーブルを満たす有限プログラムはすべて有効な出力です。帰納的証明の構築方法に従う必要はありません。Stackylogicプログラムは、最適に短くする必要はありません。
たとえば、入力がの場合11100111
、1つの有効な出力は
1
?
110
?0
00
0
?<
?1
?
しかし、他にもたくさんあります。
バイト単位の最短コードが優先されます。
通訳が必要な場合は、元のStackylogicチャレンジをご覧ください。