Почему (каждая? String? []) Возвращает true?
Взглянув на исходный код для every?
, понятно, почему
(every? string? []) => true
Это потому, что every?
реализуется рекурсивно и использует (nil? (seq coll))
для завершения рекурсии. Но, на мой вопрос, какой смысл делает это поведение? Просто споткнулся об этом.
Я решил проблему, используя
(and (seq x) (every? string? x))
Ответы
Ответ 1
Потому что он функционирует так же, как forall-quantifier. То есть, это изначально считается истинным, и каждое приложение предиката является попыткой доказать его ложность. Экзистенциальный квантификатор (который называется some
, а не any?
в Clojure для несогласованности) работает противоположным образом - он принимает ложные значения, и каждое приложение предиката является попыткой доказать его истинность.
Другими словами, всегда верно, что что-то истинно для всех из них, и оно всегда ложно, что что-то истинно для некоторых из них.
Ответ 2
Функция every?
реализует универсальную количественную оценку .
Из (every? string? []) => false
следует, что []
содержит объект x
такой, что (string? x) => false
(это как negation универсального квантификатора). Это приводит к противоречию, поэтому (every? string? [])
должен возвращать true
.
Ответ 3
В математике определено так, что для этого есть веская причина. Это будет непротиворечивость, если every?
был определен любым другим способом.
При текущем определении результат конкатенации удовлетворяет every? foo
тогда и только тогда, когда все конкатенированные коллекции также удовлетворяют every? foo
. Создание every?
return false
в пустых списках нарушит эту удобную эквивалентность, а множество других (например, удаление элемента иногда приводит к переключению every?
от true
до false
.)
Ответ 4
Или лучше спросить, почему (every? string? [])
дает false
? Оба варианта приводят к неправильному ответу в определенных требованиях. Но, очевидно, это лучше, чем получить ошибку в пустой последовательности.
Ответ 5
Мой ответ пустой истины.
Wiki хорошо его охватывает, поэтому я просто процитирую текущий первый абзац:
В математике и логике пустая истина - это утверждение, которое утверждает что все члены пустого множества обладают определенным свойством. Для Например, утверждение "все сотовые телефоны в комнате отключены" будет истинным, если в комнате нет сотовых телефонов. В этом случае, утверждение "все сотовые телефоны в комнате включены" будет также должны быть справедливыми, как и соединение двух: "все ячейки телефоны в комнате включены и выключены".
Ответ 6
Это сводится к значениям идентичности для операций "и" и "или". Для любого булева B в этом случае B имеет то же значение, что и B & T
. Таким образом, значение "и" не должно быть истинным. Точно так же верно и то, что B | F
имеет то же значение, что и B, поэтому значение "или" не имеет значения false.
В аналогичном ключе произведение без термов равно 1, а сумма без термов равна 0, которые являются тождественными значениями для операторов умножения и сложения.