Если моя дорога пуста, я не могу утверждать, что все машины, припаркованные там, красные.
Рассмотрим следующие утверждения.
S1
: Моя дорога пуста.
S2
: Все машины, припаркованные на моей дороге, красные.
Я утверждаю, что S1
подразумевает S2
. То есть утверждение S1 => S2
верно. Я сделаю это, показав, что его отрицание ложно. В этом случае отрицание S1 => S2
равно S1 ^ ~S2
; это потому, что S1 => S2
ложно, только если S1
верно и S2
ложно. Что такое отрицание S2
? Это
~S2
: На моей дороге припаркована машина, которая не красного цвета.
Какое значение истинности S1 ^ ~S2
? Давайте выпишем это
S1 ^ ~S2
: Моя дорога пуста, и на моей дороге припаркована машина, которая не красного цвета.
Единственный способ, которым S1 ^ ~S2
может быть истиной, - это если оба значения S1
и ~S2
верны. Но S1
говорит, что моя дорога пуста, а S2
говорит, что на моей дороге есть машина. Моя подъездная дорога не может быть как пустой, так и содержать машину. Таким образом, S1
и ~S2
не могут быть правдой. Следовательно, S1 ^ ~S2
ложно, поэтому отрицание S1 => S2
верно.
Поэтому, если ваша подъездная дорога пуста, вы можете утверждать, что все припаркованные там автомобили красные.
Итак, давайте рассмотрим IEnumerable<T> elements
и Predicate<T> p
. Предположим, что elements
пусто. Мы хотим раскрыть значение
bool b = elements.All(x => p(x));
Давайте рассмотрим его отрицание
bool notb = elements.Any(x => !p(x));
Чтобы notb
было истинным, должен быть хотя бы один x
в elements
, для которого !p(x)
является истинным. Но elements
пусто, поэтому невозможно найти x
, для которого !p(x)
верно. Поэтому notb
не может быть истинным, поэтому оно должно быть ложным. Поскольку notb
ложно, его отрицание верно. Следовательно, b
- это истина, а elements.All(x => p(x))
должно быть, если elements
пусто.
Вот еще один способ думать об этом. Предикат p
равен true, если для all x
в elements
вы не можете найти любой , для которого он равен false. Но если в elements
нет элементов, то невозможно найти любой , для которого он ложен. Таким образом, для пустой коллекции elements
, p
верно для все x
в elements
А как насчет elements.Any(x => p(x))
, когда elements
- это пустое IEnumerable<T>
, а p
- это Predicate<T>
, как указано выше? Мы уже знаем, что результат будет ложным, потому что мы знаем, что его отрицание верно, но давайте все равно рассуждаем; интуиция ценна. Чтобы elements.Any(x => p(x))
было истинным, должен быть хотя бы один x
в elements
, для которого p(x)
является истинным. Но если нет любого x
в elements
, невозможно найти любого x
, для которого p(x)
истинно. Следовательно, elements.Any(x => p(x))
ложно, если elements
пусто.
Наконец, вот связанное объяснение о том, почему s.StartsWith(String.Empty)
является истинным, когда s
является ненулевым экземпляром string
: