12 pontos por ohyecloudy 2023-12-17 | 3 comentários | Compartilhar no WhatsApp
  • O valor de retorno da função Enum.all? para uma lista vazia é true
    • As funções all do Haskell, all do Python e every? do Clojure também funcionam da mesma forma
  • Retornar true para uma lista vazia facilita a implementação
    • true && f(elem1) && f(elem2) ...
    • Mas ela não foi implementada assim apenas por conveniência
    • Ela foi implementada para estar de acordo com a definição lógica de verdade vacuamente verdadeira
  • Para entender a verdade vacuamente verdadeira, é preciso observar a condicional material
    • Se p é falso, então p → q é sempre verdadeiro
    • “Se a Estátua da Liberdade estiver em Seul, então a Torre Eiffel está em Pohang” é uma afirmação verdadeira
      • Porque p, ou seja, “a Estátua da Liberdade está em Seul”, é falso
    • Nessa condicional material, quando p é falso e por isso a afirmação se torna automaticamente verdadeira, isso é chamado de verdade vacuamente verdadeira
  • Na verdade vacuamente verdadeira, qualquer proposição sobre um conjunto vazio passa a ser verdadeira
    • Usando como exemplo “todos os celulares da sala estão desligados”
    • x é tudo o que está na sala
    • P(x) é “x é um celular”
    • Q(x) é “x está desligado”
    • Como x é vazio, P(x) é falso. Pela verdade vacuamente verdadeira, a afirmação é sempre verdadeira.
  • Portanto, o valor de retorno da função Enum.all? para uma lista vazia é true.

3 comentários

 
tapu1125 2023-12-18

Estou aprendendo com isso haha, obrigado por compartilhar.
Mesmo que a abordagem matemática e de ciência da computação seja essa, na hora de programar parece meio confuso, então acho melhor não usar assim kkk
Principalmente em if, isso confunde bastante porque uma lista vazia é tratada como False.

Em Python, é assim:
all([]) == True
all([[]]) == False

 
p0rygon 2023-12-18

Por isso, eu prefiro escrever as condições de forma explícita para quem vai ler o código.
Algo como if len(arr) == 0: em vez de if not arr:.
Também daria para citar um exemplo como if flag is False: em vez de if not flag:.

Pelos meus critérios, no caso de all([[]]), reescrever como all([expressão condicional for ... in []]) tornaria o código mais legível.

 
ohyecloudy 2023-12-18

Ah~ então no Python, como listas vazias são valores falsy, o valor de retorno de all([[]]) é False. Como os valores truthy e falsy variam de linguagem para linguagem, às vezes acabo cometendo esse tipo de erro quando uso outra linguagem. :)

Só como referência, no Elixir apenas nil ou false são valores falsy, então Enum.all?([[]]) retorna true.