any() and all() on empty list?
Gerard Flanagan
grflanagan at yahoo.co.uk
Fri Mar 31 15:11:36 CEST 2006
Steve R. Hastings wrote:
> Therefore, I propose that all() should work as if it were written this way:
> def all(S):
> ret_val = False
>
> for x in S:
> ret_val = True
> if not x:
> return False
>
> return ret_val
>
> Comments?
Ant wrote:
> all(list) simply means "every element of the list evaluates to True".
> This is trivially true in the case of the empty list. This is logically
> equivalent to "There are no elements in the list which evaluate to
> False".
>
> any(list) simply means "at least one element of the list evaluates to
> true". This is trivially false for the empty list - there are no
> elements to be true.
>
> These are logical functions and should be mathematically sound. It's
> possible to add all sorts of problems if we just arbitrarily decide
> what "for all x" should mean. We may just as well decide that for
> convenience: math.pi == 3.
>
I agree.
Some amateur maths - applying the identities of a 'two-element Boolean
algebra' found here:
http://en.wikipedia.org/wiki/Two-element_Boolean_algebra
def any(S):
for x in S:
if x:
return True
return False
def all(S):
for x in S:
if not x:
return False
return True
#the identities don't hold if you use the alternative
##def all(S):
## ret_val = False
##
## for x in S:
## ret_val = True
## if not x:
## return False
##
## return ret_val
empty = []
universe = [ 0, 1 ]
one = all(empty)
zero = any(empty)
assert (one or one) == one
assert (one or zero) == one
assert (zero or one) == one
assert (zero or zero) == zero
assert (zero and zero) == zero
assert (zero and one) == zero
assert (one and zero) == zero
assert (one and one) == one
assert (not one) == zero
assert (not zero) == one
#on the other hand
one = all(universe)
zero = any(universe)
#de Morgan - swap 'and' and 'or' and complement the result
assert not(one and one) != one
assert not(one and zero) != one
assert not(zero and one) != one
assert not(zero and zero) != zero
assert not(zero or zero) != zero
assert not(zero or one) != zero
assert not(one or zero) != zero
assert not(one or one) != one
assert not(not one) != zero
assert not(not zero) != one
----------------------------------------------------------------------
Gerard
More information about the Python-list
mailing list