- 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
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 commeFalse, ce qui prête souvent à confusion.En Python, c’est le cas suivant.
all([]) == Trueall([[]]) == FalseC’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 queif not arr:.On peut aussi citer
if flag is False:à la place deif not flag:.Selon mes critères,
all([[]])gagnerait aussi en lisibilité s’il était réécrit sous la formeall([condition for ... in []]).Ah~ en Python, les listes vides sont des valeurs falsy, donc
all([[]])renvoieFalse. 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
niletfalsesont des valeurs falsy, doncEnum.all?([[]])renvoietrue.