S
Steven D'Aprano
Steven D'Aprano said: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.