Re: assert() and precondition and invariant
河野真治 @ 琉球大学情報工学です。
In article <YAS.04Sep11171406@kirk.is.tsukuba.ac.jp>, yas@is.tsukuba.ac.jp (Yasushi Shinjo) writes
> この辺りに検証が使えないという問題の本質があるかもね。C言語
> でプログラムを書く時と assert() のレベルは近い。けど、
> validity とかsatisfiablity というのレベルとは違う。違うレベ
> ルで書く事が難し。
まったく違いますね。このあたりが、ハードウェアの信頼性とソフ
トウェアの信頼性の差を生んでいる原因だと思います。僕は、ある
時点で、検証されないソフトウェアが受けいられなくなると思う。
動くソフトと、ちゃんと動くソフトの差は結構大きい。
> assert() の記述から検証用の条件を自動生成できれば、いいんじゃ
> ないですか。
それはあったと思います。つうか、最近はそういうのが主流かも。
なんだけど、自動生成したものが検証可能かどうかはわからないと
思う。なんかの制限が必要ですね。
> 昔、「実行可能な仕様」というのがあったけど、あれはどうなった
> んだろう。
> > [] (ボタンが押される -> <> 反応変数がセット)
> こんな感じにハンドアセンブルしないとだめなのね。今の段階では。
> おまけに、このハンドアセンブルが正しいかどうかも不明です。
そういう言い方するのか。この作業は、
プログラムがちゃんと動くということはどういうことなのか
っていうのを定義していく作業なんです。それが仕様を書く、ある
いは、検証可能なプロパティを決める、あるいは、十分なテストを
書くってことですよね。
僕は、それができないプログラマは、もう役に立たないと思う。
> それで、最後は、この検証に通ったものを正しいとすると定義する
> しかなくなって、トートロジーっぽくなるわけです。
例えば、ループインバリアントって、あんまり自明じゃないですよ
ね。だけど、ループインバリアントをチェックするのは、トートロ
ジーっぽいよね。でも、そのループの正しさって実は、ループイン
バリアントで定義されるわけだよね。検証は、どっちかっていうと、
インバリアントを見付ける作業です。
---
Shinji KONO @ Information Engineering, University of the Ryukyus
河野真治 @ 琉球大学工学部情報工学科
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