Подтвердить что ты не робот

Почему (каждая? String? []) Возвращает true?

Взглянув на исходный код для every?, понятно, почему

(every? string? []) => true

Это потому, что every? реализуется рекурсивно и использует (nil? (seq coll)) для завершения рекурсии. Но, на мой вопрос, какой смысл делает это поведение? Просто споткнулся об этом.

Я решил проблему, используя

(and (seq x) (every? string? x))
4b9b3361

Ответ 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, которые являются тождественными значениями для операторов умножения и сложения.