Question about None

Steven D'Aprano steven at REMOVE.THIS.cybersource.com.au
Mon Jun 15 00:27:18 EDT 2009


On Sun, 14 Jun 2009 18:02:54 +0100, Arnaud Delobelle wrote:

> Steven D'Aprano <steve at REMOVETHIS.cybersource.com.au> writes:
>> So-called "vacuous truth". It's often useful to have all([]) return
>> true, but it's not *always* useful -- there are reasonable cases where
>> the opposite behaviour would be useful:
>>
>> if all(the evidence points to the Defendant's guilt) then:
>>     the Defendant is guilty
>>     execute(the Defendant)
>>
>> sadly means that if there is no evidence that a crime has been
>> committed, the person accused of committing the imaginary crime will be
>> executed.
> 
> This is a bad example.  Someone is not convicted of a crime just because
> all the available evidence points towards their guilt.  There may be
> very little evidence altogether, or it might just be circumstancial, or
> unconvincing.  Even though it may all point towards the defendent's
> guilt, it doesn't mean they will be convicted.  There needs to be enough
> evidence to convince the jury.  So it would be something like:
> 
> if sum(guilt_weight(e) for e in evidence) > GUILT_THRESHOLD:
>    the defendant is guilty
>    ...

Not all trials are jury trials, and not all cultures have a presumption 
of innocence.

There are, in fact, many places where the government and police think 
little of falsifying evidence to convict innocent people, including 
people that they know are innocent of any crime (an extreme case was 
Stalin's show trials). But as far as I know, nobody ever argues that 
people are guilty based on the principle of Vacuous Truth: everybody 
agrees that if there is no evidence of a crime, the person should be 
considered innocent rather than guilty. Even Stalin manufactured evidence 
of crimes. (In most cases, that evidence was to torture people into 
confessing to crimes that did not, in fact, take place.)

To put it another way, logically:

all(the evidence is true)
not any(the evidence is false)

should be considered identical, but in practice, we treat:

evidence = [] # evidence of a crime
all(evidence)

as false instead of true, even in places with no presumption of innocence.

While:

not any(map(operator.not_, evidence))

is also treated as false.


In any case, I'm not arguing against vacuous truth -- it's clearly the 
right way to deal with empty sets *nearly always*. But it isn't entirely 
straight-forward, and leads to some difficulties, such as a vacuous truth 
X implies both Y and not Y at the same time.




-- 
Steven



More information about the Python-list mailing list