アカウント名:
パスワード:
falseが正解と書いてる人が居るので念のために言っておくが"true"が正解。これは論理学的には「Vacuous truth」で「全ての集合は空集合を部分集合として含む」「前提が偽なら命題は真(爆発律)」のように正当化される。空の場合は「全てが条件を満たす」で日本語的にもあってる。要素数が1兆・1億・1まで真な関数が0になると急に偽を返すのも直感に反する。プログラマーとしても最初はtrueで宣言したboolに&=したり、while(){}内でreturn false、外で`return true`したり、どう考えてもtrue。
論理学なんかクソくらえと思うかもしれないが、論理学的にそうなら実務でも一貫してる。具体的な状況は、
逆に空でfalseを返すべき状況は個数判定をすれば十分で、また0個が特別な意味を持つと考えた方が自然なケース。
(なお単に「trueを返す」という条件だと空でもtrueが一貫してると言おうと思ったが、「falseを返す」だと空でfalseを返しそう。)
個人的にはどうしても0個のケースを意識させたいならfalseや例外じゃなくてコールバック関数版を追加でもして欲しいところ。例外はJavaのように検査例外を採用してないと見逃す。こんな挙動は予想できん。falseはキレられ損害賠償でも当然。
「条件を満たすなら」の条件によっては1個も満たしてないでしょ・すべての配列が3桁の数字であることっていう条件設定だったら空配列ではFalseでしょ
条件っていってるのになんで条件を無視するのか
> 1個も満たしてない「1個は満たすこと」という条件はどっから出てきたんだ?条件は明示されてるのになんで存在しない条件を勝手に加えるのか1個あるかどうかの話するなら当然条件式全体も等価に変換しろつまり「すべて」ではなく「いずれか」の条件式に変換
すべての配列(内の要素)が3桁の数字であること=いずれかの要素が3桁の数字ではないことがないこと
はい、空集合ならtrueなのが明白だなベン図でも書いてみろ
空なんだから0個の全てが満たしてるじゃないの。「存在しないもの」は任意の条件を満たす。「現在のフランス王は禿頭である」。「3桁の数字が一つでもあること」ならfalseが正しく、実際一般的実装でもそうなってる。
いや、一般実装じゃなくって態々プログラマの良さが分かるって話なのだから一般実装以外で作成するわけでなにがしかの有意なチェック処理が実装されるわけなのだから文脈から考えてしまうと満たすものが一つもないものはFalseが正しい論理学で考えるとTrueが正しいのだと思う
別ACだけど、ここで言う「全て」は要素それぞれを判定して結果を論理積するって言うことだから、日常会話の「全て」とは少し違う。別コメでも書かれているけど、「配列が」ではなく「配列の要素それぞれが」と言う感じ。
論理演算的には(空) & 要素1 & 要素2 & ...になるから、(空) はtrueでないと成り立たない。
階乗の0!が1なのも同じような理由
・「配列の全ての要素」とは「全N個中のN個」である。・「条件」は配列にではなく個々の要素に課される。・配列は要素数N=0を許す。
これで理解できないでしょうか?
空配列がfalseであるとする場合、そもそもの命題に「その配列に要素があり、かつ」という条件を新たに増やしています。
おおむね同意。ただし、「関数の定義」と「論理式の評価」を混同している点でいただけない。なので少し補足。
今回の関数の目的が、論理式の評価ではなく、数学的な証明手段だった場合は、ご自身で書かれている通り「前提が偽」なので、空集合のときは前提不十分、それ以外の場合には…と条件ごとに解を書かないと正しくない。一般的には、数学なら、問題の前提条件に、∃x、つまり空集合ではない、と明記する。これをプログラミングで言うと、あなたが結語にまとめた通り、前提が不十分だから未定義例外を飛ばす位置付けだろう。
論理学・数学の問題か
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
UNIXはただ死んだだけでなく、本当にひどい臭いを放ち始めている -- あるソフトウェアエンジニア
trueが正解 (スコア:2, 参考になる)
falseが正解と書いてる人が居るので念のために言っておくが"true"が正解。
これは論理学的には「Vacuous truth」で「全ての集合は空集合を部分集合として含む」「前提が偽なら命題は真(爆発律)」のように正当化される。
空の場合は「全てが条件を満たす」で日本語的にもあってる。
要素数が1兆・1億・1まで真な関数が0になると急に偽を返すのも直感に反する。
プログラマーとしても最初はtrueで宣言したboolに&=したり、while(){}内でreturn false、外で`return true`したり、どう考えてもtrue。
論理学なんかクソくらえと思うかもしれないが、論理学的にそうなら実務でも一貫してる。具体的な状況は、
逆に空でfalseを返すべき状況は個数判定をすれば十分で、また0個が特別な意味を持つと考えた方が自然なケース。
(なお単に「trueを返す」という条件だと空でもtrueが一貫してると言おうと思ったが、「falseを返す」だと空でfalseを返しそう。)
個人的にはどうしても0個のケースを意識させたいならfalseや例外じゃなくてコールバック関数版を追加でもして欲しいところ。
例外はJavaのように検査例外を採用してないと見逃す。こんな挙動は予想できん。
falseはキレられ損害賠償でも当然。
Re: (スコア:0)
「条件を満たすなら」の条件によっては1個も満たしてないでしょ
・すべての配列が3桁の数字であること
っていう条件設定だったら空配列ではFalseでしょ
条件っていってるのになんで条件を無視するのか
Re:trueが正解 (スコア:1)
> 1個も満たしてない
「1個は満たすこと」という条件はどっから出てきたんだ?
条件は明示されてるのになんで存在しない条件を勝手に加えるのか
1個あるかどうかの話するなら当然条件式全体も等価に変換しろ
つまり「すべて」ではなく「いずれか」の条件式に変換
すべての配列(内の要素)が3桁の数字であること=いずれかの要素が3桁の数字ではないことがないこと
はい、空集合ならtrueなのが明白だな
ベン図でも書いてみろ
Re: (スコア:0)
空なんだから0個の全てが満たしてるじゃないの。
「存在しないもの」は任意の条件を満たす。「現在のフランス王は禿頭である」。
「3桁の数字が一つでもあること」ならfalseが正しく、実際一般的実装でもそうなってる。
Re: (スコア:0)
いや、一般実装じゃなくって態々プログラマの良さが分かるって話なのだから
一般実装以外で作成するわけでなにがしかの有意なチェック処理が実装されるわけなのだから
文脈から考えてしまうと満たすものが一つもないものはFalseが正しい
論理学で考えるとTrueが正しいのだと思う
Re: (スコア:0)
別ACだけど、ここで言う「全て」は要素それぞれを判定して結果を論理積するって言うことだから、日常会話の「全て」とは少し違う。
別コメでも書かれているけど、「配列が」ではなく「配列の要素それぞれが」と言う感じ。
論理演算的には
(空) & 要素1 & 要素2 & ...
になるから、(空) はtrueでないと成り立たない。
階乗の0!が1なのも同じような理由
Re: (スコア:0)
・「配列の全ての要素」とは「全N個中のN個」である。
・「条件」は配列にではなく個々の要素に課される。
・配列は要素数N=0を許す。
これで理解できないでしょうか?
空配列がfalseであるとする場合、そもそもの命題に
「その配列に要素があり、かつ」という条件を新たに増やしています。
Re: (スコア:0)
おおむね同意。ただし、「関数の定義」と「論理式の評価」を混同している点でいただけない。なので少し補足。
今回の関数の目的が、論理式の評価ではなく、数学的な証明手段だった場合は、ご自身で書かれている通り「前提が偽」なので、空集合のときは前提不十分、それ以外の場合には…と条件ごとに解を書かないと正しくない。一般的には、数学なら、問題の前提条件に、∃x、つまり空集合ではない、と明記する。これをプログラミングで言うと、あなたが結語にまとめた通り、前提が不十分だから未定義例外を飛ばす位置付けだろう。
論理学・数学の問題か