これまでの動作を記憶し、再実行が中止された場合に目標に向けて継続するプログラムを作成しようとしています。これは粘り強いプログラムです。これは、不揮発性メモリを使用して、実行全体の情報をいくつかのcitとして格納します。これは、アボート時に発生することを考慮したビットです。私はかつて、N citsを使用して、いくつかの小さな固定Kで長さ2 (NK)までの任意の目標が達成可能であると推測しました。今、目標を達成できないと考えることに傾倒しています:-(
目標で粘り強いプログラムに尋ねられましたが、それはすでに重要な目標です 01
ます。または不可能性の厳密な証拠。
粘り強いプログラムは、1そのように定義されます。
- runを実行するときは常に、入力なしで同じエントリポイントから実行を実行し、
N
cits(以下で定義)のみを使用してrun間で情報を共有できます。他のすべての情報は、各実行の開始時に同じ内容であるか、実行の開始時に予測できない内容であるか、変更できない(プログラム自体)か、読み取り不可能(以前の出力と値)のいずれかです。 - セッション内で実行すると、その言語の機能を使用して、実行が開始されてからある程度の遅延の範囲内で、中止されない限り、明らかに停止します。前に中止さに停止します。アボートは任意の瞬間に発生し、別の実行(ある場合)まで操作を阻止します。
- それが出力する文字の時系列での連結は、プログラムが停止するまで実行されたままの少なくとも1つの実行を含む任意のセッションの任意のセッションで同じ有限文字列(目標)と同じです。
- 出力は、そのデバイスを使用して文字アトミックは:受信値 0 1 2 3の間で PUTをプログラムすることによって、出力
0
(それぞれ1
)の値を0または2(それぞれ1または3)の間であれば、その値は、以前と異なる場合にのみ値プット。セッションの最初のプットでは0と見なされます。
粘り強いプログラムが存在します!有効な固定値を固定回数だけ単純に入力してから停止するプログラムは、目標が空(数値または値が0の0
場合)、(数値が正で値が2の場合)、または1
(それ以外の場合)粘り強くなります。それ以上の目標にはNVMが必要です。
各citは、citへの書き込み中に中止された実行の影響を考慮して、1つのNVMビットをモデル化します。いつでも、citは3つの可能な状態の0
1
いずれかになりU
ます。citから読み取られる値は常に0または1です。それ以外の場合も州と一致しますU
。citは0
セッションでの最初の実行前の状態に初期化されます。それ以外の場合は、プログラムによる書き込みがコマンドによって指示されたときにのみ状態が変化します。これは、書き込まれた内容、書き込み中に実行が中止されたかどうか、およびcitの以前の状態:
Former state 0 1 U Rationale given by hardware guru
Operation
Write 0 completed 0 0 0 Discharging returns cit to 0
Write 0 aborted 0 U U Aborted discharging leaves cit unspecified
Write 1 aborted U 1 U Aborted charging leaves cit unspecified
Write 1 completed 1 1 U Charging a non-discharged cit is inhibited
上記のHALは、Cで次のように宣言されています。
/* file "hal.h" unspecified parameter values give undefined behavior */
#define N 26 /* number of cits */
void p(unsigned v); /* put value v; v<4 */
unsigned r(unsigned i); /* read from cit at i; returns 0 or 1; i<N. */
void w(unsigned i, unsigned b); /* write b to cit at i; b is 0 or 1; i<N. */
/* all functions return in bounded time unless aborted */
目標を掲げた粘り強いプログラムでの最初の試み01
は次のとおりです。
#include "hal.h" /* discount this line's length */
main(){ /* entry point, no parameters or input */
if (r(3)==0) /* cit 3 read as 0, that is state 0 or U */
w(3,0), /* write 0 to cit 3, to ensure state 0 */
p(2); /* put 2 with output '0' initially */
w(3,1), /* mark we have output '0' (trouble spot!) */
p(1); /* put 1 with output '1' */
} /* halt (but we can be re-run) */
マーフィーは最初のセッションを作成し、最初の実行を停止してセッションを終了します。セッションの出力は単一実行の出力01
です。ここまでは順調ですね。
別のセッションで、マーフィーはの最初の実行を中止し、w(3,1)
citを状態のままにしますU
。2回目の実行では、マーフィーはそれr(3)
を1(citは状態にあるU
)と決定し、プログラムの実行を停止します(w(3,1)
citの状態がどのように変更されなかったかに注意してください)。3回目の実行で、マーフィーはそれr(3)
を0と決定し、の後p(2)
で打ち切り、セッションを終了します。
2番目のセッションの連結出力は010
(実行ごとに1文字)ですが01
、最初のセッションとは異なるため、プログラムは粘り強くなく、条件3が満たされていません。
言語は無料です。言語に合わせてCインターフェイスを調整してください。私は、使用されるcitの最小数に基づいて最良の答えを選択します。次に、実行から出力(または出力がない場合は停止)への書き込みの最悪の場合の最小数。次に、打ち切りなしのセッションで停止する前の書き込みの最小数。次に最短のプログラム。呼び出しコードのみをカウントし、インターフェースやその実装はカウントしません。これは不要です。不可能性の厳密な証明はプログラムを排除します(そして私には驚きです)。把握するのに最も簡単なものを選択します。
中止の数と瞬間に関係なく、プログラムが3の目標を本当に達成していることをトリプルチェックしてください。難しい!
更新:候補者の回答を追加しました。それを切り捨ててください。ああ、ハンマーは体系的なプログラムを使用して数分でそれを行いました!
ステータス:これまでのところ、解決策はありません。1つまたは2つのcitで解決策がないことを確実に知ってください。しかし、3つ以上のcitで不可能であることの証明はありません。この文はあいまいではありません。citマトリックスをわずかに変更した場合(たとえば、右下を1にすると、上記の例が正しい場合)、問題は解決します。