- PR -

プログラムの書き方でご指導お願いします。

投稿者投稿内容
未記入
ぬし
会議室デビュー日: 2004/09/17
投稿数: 667
投稿日時: 2005-11-11 17:09
引用:

たしか「ゲーデルの不完全性定理」ですね。


がるがるさんが説明してくれないので、google 先生に「ゲーデルの不完全性定理」について訊いてきました。流し読みしただけですが、一言でまとめてしまうと「公理系のすべての命題を証明することはできない」ということらしいです。

「すべての命題を証明することはできない」というのが肝だと思うのですが、これは「命題をひとつも証明できない」という意味ではなく「証明できない命題がひとつ以上存在する」という意味。公理系には証明できない命題が必ず含まれるので、公理系(つまり全体ということですね)としては常に不完全性を持っている、ということかな。

※ 自己言及のパラドクスのような命題が系の完全性を崩す反例になるそうです。

これはつまり、全体としては不完全だけど、個々の命題に着目すれば、証明可能なものも数多くあるということになると思います。

それで。「true は false ではない」、「false は true ではない」はどちらも証明可能な命題ですね。どちらも、系を不完全とする証明不能な命題(反例)ではありません。ですから、ここで不完全性定理の話を持ち出すのはどうもスジが違うのではないかと思います。

がるがるさんが不完全性定理を説明して、true と false の関係に言及していたとしても、きっと説得力はなかったでしょうね。だからこそ、チラ見せにとどめていたのだと思いますが。
lalupin4
大ベテラン
会議室デビュー日: 2004/07/26
投稿数: 163
投稿日時: 2005-11-11 23:21
引用:

不完全性定理とかの概念から考察していただけると。



 どのみち論理学の用語を援用するなら、「排中律」をもってきたほうがよいです。

すなわち「命題Aが排中律を満たす」というとき:

((A) または (not A))を満たす

と、いうことです。なんだかBoolean型っぽい定義です。

 問題は、(not A)の解釈で、
定義に従えば
1. trueとtrueでないものという実装

2. trueかfalseかという実装
もアリです。

 で、Javaはどっちですの?
ラフィン
ぬし
会議室デビュー日: 2002/05/23
投稿数: 809
お住まい・勤務地: 外野
投稿日時: 2005-11-12 16:20
引用:

未記入さんの書き込み (2005-11-11 17:09) より:

それで。「true は false ではない」、「false は true ではない」はどちらも証明可能な命題ですね。どちらも、系を不完全とする証明不能な命題(反例)ではありません。ですから、ここで不完全性定理の話を持ち出すのはどうもスジが違うのではないかと思います。


 ちゅうか、わかってて書いてるんですよね?

引用:

未記入さんの書き込み (2005-11-10 17:17) より:
if(is_true()) {
  ...
} else if(is_false()) {
  ...
} else {
  ...
}


 「is_true() == true」と「is_true() == false」をたすと100%です。
 「is_true() == false」の時は仕様上必ず「is_false == true」です。
 でも「is_true() == false」と「is_false == true」はイコールではないです。
 それは「is_true() == false」が現時点の仕様ではありえない「else」を含むからです。

 「is_true() == true」と「is_false == true」は現時点での仕様上、たすと100%のはずですが、
はじめから拡張を考慮するという名目の元に、たすと100%と考えることは厳禁なんです。

 こういう考えを仕様に盛り込んでいいのはせめて3分岐から、って気がするんですけどね。
 でないと、後から訳のわからない不具合がでそうで怖いです。
未記入
ぬし
会議室デビュー日: 2004/09/17
投稿数: 667
投稿日時: 2005-11-12 20:02
意味不明です。(おそらくあなたの説明が不十分なので)

引用:

「is_true() == false」の時は仕様上必ず「is_false == true」です。
でも「is_true() == false」と「is_false == true」はイコールではないです。


この 2行は矛盾(前者は肯定、後者は否定)しているように見えます。もっと、はっきりと書いてください。そうしたら読んであげます。上記 2行について、私が不足していると考える言葉は「業務設計上」「言語仕様上」「現時点」「将来的」「可能性」です。

1行目に「業務設計上」(仕様上という言葉だと何の仕様か不明瞭なので)、2行目に「言語仕様上」という言葉を付加して良いですか? そしたら、少しは読める文章になります。(そして、それが私の推測したあなたの意図です。)

また、1行目には「現時点では」という注意書きも必要になると考えますが、どうでしょうか。私はあなたの意図を正しく推測できているでしょうか。

引用:
「is_true() == true」と「is_false == true」は現時点での仕様上、たすと100%のはずですが、はじめから拡張を考慮するという名目の元に、たすと100%と考えることは厳禁なんです。


だからこそ、最後の else 節を付けているのですよ。足して、100% になると考えていたら、最後の else 節は不要ですから。最後の else 節は、言語仕様上の到達可能性によるものではなく、業務設計上の将来的な拡張時の保護措置です。

引用:

こういう考えを仕様に盛り込んでいいのはせめて3分岐から、って気がするんですけどね。でないと、後から訳のわからない不具合がでそうで怖いです。


これには同意します。三分岐以上もしくは、三分岐以上になることが強く想定される場合ですね。そもそも boolean で設計された戻り値が、三値に拡張されるなんてことは通常考えられませんから。

引用:

ちゅうか、わかってて書いてるんですよね?


何がですか? 恥ずかしながら、私は不完全性定理という言葉をまったく知りませんでしたし、何か間違ったことを書いているかもしれませんね。この点についても「わかってて書いてるんですよね?」という書き方ではなく、直接書いていただけると助かります。

もう、このスレッドの流れに疲れました。このスレッドで、言葉足らず・不明瞭な内容には、今後反応いたしません。
ラフィン
ぬし
会議室デビュー日: 2002/05/23
投稿数: 809
お住まい・勤務地: 外野
投稿日時: 2005-11-12 21:36
引用:

この 2行は矛盾(前者は肯定、後者は否定)しているように見えます。もっと、はっきりと書いてください。そうしたら読んであげます。上記 2行について、私が不足していると考える言葉は「業務設計上」「言語仕様上」「現時点」「将来的」「可能性」です。



>上記 2行について、私が不足していると考える言葉は
>「業務設計上」「言語仕様上」「現時点」「将来的」「可能性」です。

 ええ、十分すぎるほど正解です。

 こういう風に相対的にスキルが高い人からフォローが入ると話が早いですねー。

 もし、

>この 2行は矛盾(前者は肯定、後者は否定)しているように見えます。
>もっと、はっきりと書いてください。

 だけだったらメゲていたかもしれません。

 もしくは、

>そうしたら読んであげます。

 に対して無礼にも、「読んでくれなくて結構です。」と返したかもしれません。


 何はともあれ、ありがとうございました。

 意味不明な文章でご迷惑をおかけしましたが、できましたらこんなところでお疲れにならないように。
ほげた
ベテラン
会議室デビュー日: 2002/05/08
投稿数: 67
お住まい・勤務地: なごやん
投稿日時: 2005-11-13 05:30
議論の本筋と違うところで、どうしても気になることが・・・

引用:

未記入さんの書き込み (2005-11-11 17:09) より:
引用:

たしか「ゲーデルの不完全性定理」ですね。


がるがるさんが説明してくれないので、google 先生に「ゲーデルの不完全性定理」について訊いてきました。流し読みしただけですが、一言でまとめてしまうと「公理系のすべての命題を証明することはできない」ということらしいです。

「すべての命題を証明することはできない」というのが肝だと思うのですが、これは「命題をひとつも証明できない」という意味ではなく「証明できない命題がひとつ以上存在する」という意味。公理系には証明できない命題が必ず含まれるので、公理系(つまり全体ということですね)としては常に不完全性を持っている、ということかな。

※ 自己言及のパラドクスのような命題が系の完全性を崩す反例になるそうです。


そのとおりです。完全な公理系においては、「真か偽か確定すること」は証明できるが、「真か偽か」を証明することはできない命題を構成できる、ということです。

で、気になるのは、この有名な定理がソフトウェアの世界とどう関係するかという点です。未記入さんの仰るように単なるチラ見せなのか、がるがるさんには面白いネタがあるのか・・・


それと、(値の)拡張性を考慮した場合に IsXXX としてよいのか、
という点ですが、「拡張性を考慮して」作られているならば、
第3の判定を追加する場合、それは以下のどちらかであるべきです。
 ・IsTrue/IsFalse とは独立している
 ・IsTrueまたはIsFalseのサブステータス
これ以外の可能性を含む場合、つまり、IsTrue/IsFalse の判定自体が変化するような変更は非常に危険ですよね。利用側の分岐条件自体が変更されてしまうのですから・・・ 拡張性を考慮するというのは、そのようなインパクトを与えずに変更が可能、という状態にしておくということです。

実際、どんな作り方をしても私に迷惑がかからなければいいですが・・・


で、ぼのぼのさんの疑問に対する私の意見は、(2)もしくは(4)です。
みなさんの反論があれば意見が変わるかもしれませんが、
現在のところ私は以下のようなポリシーです。
 ・check()メソッドの役割は、状態を満たしているか否かの判断のみ
  したがって、判断結果を例外で通知することは間違いで、判断できないケースにおいてのみ例外を送出すべき。状態を満たさないことをエラーとするか否かは、呼び出し元が決めること。
 ・満たしている/いないの排他的な状態を判断したいだけであれば、boolの戻り値とすべき。排他的に3値以上の状態を取りうる場合は、enum を戻り値とする
 ・呼び出し側は、bool の場合 if〜else、enum の場合 switch+default を使用する

で、
状態Aと状態Bがあり、「両方の状態を満たしている時」があるのならば、それは排他的ではなく、独立(お互いに関係なく状態が変わる)、もしくは従属(片方は、他方のサブステータス)な状態です。それぞれ以下のようにします。
 独立 → おのおのの bool check() メソッドを作る。(2)です。
 従属 → bool check() と、サブステータスの bool check() または enum status()
現在は排他的だが、将来的に(排他的関係を維持したまま状態数が)増えるという場合は enum status() です。戻り値を bool にすることはありえません。(4)です。

bool の場合、if〜elseの分岐条件が変化しません。
enum を使用した場合、default でアサートするなどして意図しない変更時に、問題となることを検出できます。
コナン
ベテラン
会議室デビュー日: 2005/01/31
投稿数: 98
投稿日時: 2005-11-13 16:35
こんにちわ。

引用:

lalupin4さんの書き込み (2005-11-11 23:21) より:

 問題は、(not A)の解釈で、
定義に従えば
1. trueとtrueでないものという実装

2. trueかfalseかという実装
もアリです。

 で、Javaはどっちですの?


排中律って真理値を推論するときしか使わないので、
実装とは関係ないように思うのですが。(推論させるかどうかは、設計の問題のような気がします)
1でも2でも真/偽の2値で表せることには変わりないですし。

引用:

ほげたさんの書き込み (2005-11-13 05:30) より:

そのとおりです。完全な公理系においては、「真か偽か確定すること」は証明できるが、「真か偽か」を証明することはできない命題を構成できる、ということです。

で、気になるのは、この有名な定理がソフトウェアの世界とどう関係するかという点です。未記入さんの仰るように単なるチラ見せなのか、がるがるさんには面白いネタがあるのか・・・


チューリングマシンというやつに関係してるようです。(名前しか聞いたことないですが…)
余談ですが、不完全性定理って、真とか偽とかの真理値は関係ないと思います。
あくまでも形式的に導出できるかどうかなのではないですか?

スキルアップ/キャリアアップ(JOB@IT)