12 Punkte von ohyecloudy 2023-12-17 | 3 Kommentare | Auf WhatsApp teilen
  • Der Rückgabewert der Funktion Enum.all? für eine leere Liste ist true
    • Auch Haskells all, Pythons all und Clojures every? verhalten sich genauso
  • Wenn für eine leere Liste true zurückgegeben wird, ist die Implementierung einfacher
    • true && f(elem1) && f(elem2) ...
    • Aber sie ist nicht nur aus Bequemlichkeit in der Implementierung so umgesetzt
    • Sie ist so implementiert, dass sie der Definition der vakuosen Wahrheit in der Logik entspricht
  • Um vakuose Wahrheit zu verstehen, muss man sich materiale Implikationen ansehen
    • Wenn p falsch ist, dann ist p → q immer wahr
    • „Wenn die Freiheitsstatue in Seoul steht, dann steht der Eiffelturm in Pohang“ ist wahr
      • Denn p, also „Die Freiheitsstatue steht in Seoul“, ist falsch
    • Dass bei einer solchen materialen Implikation p falsch ist und die Aussage deshalb immer wahr wird, nennt man vakuose Wahrheit
  • Bei der vakuosen Wahrheit wird für die leere Menge (set) jede beliebige Aussage wahr
    • Nehmen wir als Beispiel: „Alle Mobiltelefone im Zimmer sind ausgeschaltet“
    • x sind alle Dinge im Zimmer
    • P(x) ist „x ist ein Mobiltelefon“
    • Q(x) ist „x ist ausgeschaltet“
    • Weil x leer ist, ist P(x) falsch. Durch vakuose Wahrheit ist die Aussage immer wahr.
  • Deshalb ist der Rückgabewert der Funktion Enum.all? für eine leere Liste true.

3 Kommentare

 
tapu1125 2023-12-18

Wieder was gelernt, danke fürs Teilen.
Der mathematische bzw. informatiktheoretische Ansatz mag zwar so sein, aber beim Coden ist es trotzdem verwirrend, daher scheint es besser, das nicht aktiv so zu nutzen, haha.
Besonders in if-Anweisungen führt es oft zu Verwirrung, weil eine leere Liste als False erkannt wird.

In Python gilt Folgendes:
all([]) == True
all([[]]) == False

 
p0rygon 2023-12-18

Deshalb bevorzuge ich es, Bedingungen für die Personen, die den Code lesen werden, explizit zu formulieren.
Also eher if len(arr) == 0: als if not arr:.
Ein weiteres Beispiel wäre if flag is False: statt if not flag:.

Nach meinem Maßstab würde es den Code besser lesbar machen, all([[]]) als all([Bedingungsausdruck for ... in []]) umzuschreiben.

 
ohyecloudy 2023-12-18

Ah~ in Python, leere Listen sind falsy values, daher ist der Rückgabewert von all([[]]) False. Da sich Truthy- und Falsy-Werte je nach Sprache unterscheiden, mache ich beim Arbeiten mit anderen Sprachen manchmal solche Fehler. :)

Zur Referenz: In Elixir sind nur nil oder false Falsy values, daher ergibt Enum.all?([[]]) den Wert true.