# [Haskell-cafe] and [] = True; or [] = False

Jochem Berndsen jochem at functor.nl
Mon Apr 26 08:23:55 EDT 2010

```Bjorn Buckwalter wrote:
> Dear all,
>
> Does it make good sense that 'and []' returns 'True' and 'or []'
> returns 'False'? The Haskell Road to Logic, Maths and Programming says
> so:
>
> "The function or takes a list of truth values and returns True if at
> least one member of the list equals True, while and takes a list of
> truth values and returns True if all members of the list equal True."
>
> "Should the conjunction of all elements of [] count as true or false?
> As true, for it is indeed (trivially) the case that all elements of []
> are true. So the identity element for conjunction is True. Should the
> disjunction of all elements of [] count as true or false? As false,
> for it is false that [] contains an element which is true. Therefore,
> the identity element for disjunction is False."
>
> While the above reasoning is fine, and allows straight-forward
> implementations, it isn't extremely convincing. In particular, it
> isn't clear that, while simple, the definitions of the first paragraph
> are the most sensible. Perhaps one of the more mathematically versed
> readers on the Cafe could enlighten me?

The empty sum is regarded to be zero. The empty product is equal to one.
The empty conjunction is True. The empty disjunction is False.

The reason for this is that these are the neutral elements, i.e.
0 + x = x
1 * x = x
True AND x = x
False OR x = x

This allows some laws to hold also in degenerate cases, and it is quite
useful in general to accept these conventions. An example of such a law is
(∀ x : x ∈ A : P(x)) ∧ (∀ x : x ∈ B : P(x))
==
(∀ x : x ∈ A ∪ B : P(x)).

This also works if A or B is empty, provided that we say that the empty
conjunction is true.

In Haskell, we now have that

(and xs) && (and ys)
==
and (xs ++ ys),

even if xs or ys is the empty list.

Cheers, Jochem
--
Jochem Berndsen | jochem at functor.nl
```