12 ポイント 投稿者 ohyecloudy 2023-12-17 | 3件のコメント | WhatsAppで共有
  • 空のリストに対する Enum.all? 関数の戻り値は true
    • Haskell の all、Python の all、Clojure の every? 関数も同じように動作
  • 空のリストに対して true を返すと実装しやすい
    • true && f(elem1) && f(elem2) ...
    • ただし、実装上の都合だけでそのように実装されているわけではない
    • 論理学における空虚真 (vacuous truth) の定義に合うように実装されている
  • 空虚真を理解するには、実質含意を見てみる必要がある
    • p が偽なら p → q は常に真
    • 「自由の女神像がソウルにあるなら、エッフェル塔は浦項にある」は真
      • p である「自由の女神像がソウルにある」が偽だから
    • このような実質含意で、p が偽であるため無条件に真になることを空虚真という
  • 空虚真では、空集合 (set) についてはいかなる命題も真になる
    • 「部屋の中のすべての携帯電話の電源が切れている」を例にすると
    • x は部屋の中にあるすべてのもの
    • P(x) は「x は携帯電話である」
    • Q(x) は「x は電源が切れている」
    • x が空であるため P(x) は偽。空虚真によって常に真になる。
  • したがって、空のリストに対する Enum.all? 関数の戻り値は true になる。

3件のコメント

 
tapu1125 2023-12-18

勉強になりました、共有ありがとうございます。
数学的・計算機科学的なアプローチはこうだとしても、コーディング時には混乱しやすいので、活用しないほうがよさそうに思えます(笑)。
特にif文では空のリストをFalseとして認識するので、かなり混乱します。

Pythonでは以下の通りです。
all([]) == True
all([[]]) == False

 
p0rygon 2023-12-18

だから私は、コードを読む人のために条件を明示的に書く方向を好みます。
if not arr: よりは if len(arr) == 0: のように。
if not flag: の代わりに if flag is False: といった例もありますね。

私の基準では、all([[]])all([条件式 for ... in []]) と書き換えたほうが、コードがより読みやすくなると思います。

 
ohyecloudy 2023-12-18

ああ、Python では空のリストが falsy value なので、all([[]]) の戻り値が False になるんですね。言語ごとに Truthy、Falsy value が違うので、別の言語を使うときにたまにミスしてしまいます。 :)

参考までに、Elixir は nil または false だけが Falsy value なので、Enum.all?([[]]) の値は true になります。