12 points par ohyecloudy 2023-12-17 | 3 commentaires | Partager sur WhatsApp
  • La valeur de retour de la fonction Enum.all? sur une liste vide est true
    • Les fonctions all de Haskell, all de Python et every? de Clojure se comportent de la même manière
  • Renvoyer true pour une liste vide facilite l’implémentation
    • true && f(elem1) && f(elem2) ...
    • Mais ce n’est pas implémenté ainsi uniquement par commodité
    • L’implémentation suit en fait la définition logique de la vérité vacue
  • Pour comprendre la vérité vacue, il faut examiner l’implication matérielle
    • Si p est faux, alors p → q est toujours vrai
    • « Si la statue de la Liberté se trouve à Séoul, alors la tour Eiffel se trouve à Pohang » est une proposition vraie
      • Parce que p, « la statue de la Liberté se trouve à Séoul », est faux
    • Dans ce type d’implication matérielle, lorsque p est faux et que la proposition devient donc automatiquement vraie, on parle de vérité vacue
  • Avec la vérité vacue, toute proposition concernant un ensemble vide est vraie
    • Prenons l’exemple de « tous les téléphones portables dans la pièce sont éteints »
    • x désigne tous les objets dans la pièce
    • P(x) signifie « x est un téléphone portable »
    • Q(x) signifie « x est éteint »
    • Comme x est vide, P(x) est faux. Par vérité vacue, la proposition est donc toujours vraie.
  • C’est pourquoi la valeur de retour de la fonction Enum.all? sur une liste vide est true.

3 commentaires

 
tapu1125 2023-12-18

J’apprends quelque chose, merci pour le partage.
L’approche mathématique et informatique se tient, mais en codant ça reste déroutant, donc il vaut mieux éviter de l’utiliser dans la pratique haha.
Surtout dans les if, où une liste vide est considérée comme False, ce qui prête souvent à confusion.

En Python, c’est le cas suivant.
all([]) == True
all([[]]) == False

 
p0rygon 2023-12-18

C’est pourquoi je préfère écrire les conditions de manière explicite pour les personnes qui liront le code.
Par exemple, if len(arr) == 0: plutôt que if not arr:.
On peut aussi citer if flag is False: à la place de if not flag:.

Selon mes critères, all([[]]) gagnerait aussi en lisibilité s’il était réécrit sous la forme all([condition for ... in []]).

 
ohyecloudy 2023-12-18

Ah~ en Python, les listes vides sont des valeurs falsy, donc all([[]]) renvoie False. Comme les valeurs truthy et falsy diffèrent selon les langages, je fais parfois ce genre d’erreur quand j’en utilise un autre. :)

À titre indicatif, en Elixir, seules nil et false sont des valeurs falsy, donc Enum.all?([[]]) renvoie true.