Re: assert() and precondition and invariant
新城です。loop invariant は、けっこう厳しい。
In article <3990496news.pl@rananim.ie.u-ryukyu.ac.jp>
kono@ie.u-ryukyu.ac.jp (Shinji KONO) writes:
> 例えば、ループインバリアントって、あんまり自明じゃないですよ
> ね。だけど、ループインバリアントをチェックするのは、トートロ
> ジーっぽいよね。でも、そのループの正しさって実は、ループイン
> バリアントで定義されるわけだよね。検証は、どっちかっていうと、
> インバリアントを見付ける作業です。
「ループの正しさがループインバリアントで定義される」というの
は、同意しません。まだ見つかってないかもしれませんが、もっと
まともな方法があると思います。
簡単なループです。data[0] から data[9] の和を求めるループです。
s=0;
for( i=0; i<10; i++ )
{
s+= data[i];
}
これの loop invariant と言われても、あんまりパッとするものか
出てきません。
(1) bool式の i<10
(2) ループの前にj=10、ループの中の最後に j--; を入れて数式 j+i が不変
(3) s の値が data[0..i] の和になっている。
どれとっても、せいぜいトートロジーです。もっと他に、何か役に
たちそうな loop invariant はありますか。
In article <3990496news.pl@rananim.ie.u-ryukyu.ac.jp>
kono@ie.u-ryukyu.ac.jp (Shinji KONO) writes:
> 動くソフトと、ちゃんと動くソフトの差は結構大きい。
日本語でそう書いてしまうとそうなんだけど、問題は2つあります。
(1) 「ちゃんと動く」というのをプログラミング言語並に形式的に
書くこと(仕様を記述すること)が大変。
(2) そう書いた仕様が、元々やりたかった事と一致している事を調
べる方法が、存在しない。
> > この辺りに検証が使えないという問題の本質があるかもね。C言語
> > でプログラムを書く時と assert() のレベルは近い。けど、
> > validity とかsatisfiablity というのレベルとは違う。違うレベ
> > ルで書く事が難し。
> まったく違いますね。このあたりが、ハードウェアの信頼性とソフ
> トウェアの信頼性の差を生んでいる原因だと思います。僕は、ある
> 時点で、検証されないソフトウェアが受けいられなくなると思う。
ハードウェアの設計では、形式的な証明の技術を使っているのですか。
\\ 新城 靖 (しんじょう やすし) \\
\\ 筑波大学 電子・情報 \\
Fnews-brouse 1.9(20180406) -- by Mizuno, MWE <mwe@ccsf.jp>
GnuPG Key ID = ECC8A735
GnuPG Key fingerprint = 9BE6 B9E9 55A5 A499 CD51 946E 9BDC 7870 ECC8 A735