if you look at it as a programmer, vacuously true makes sense.
In js if I write:
const allHatsGreen = hats.every(hat => hat.color === 'green');
it will be true if hats is empty. Same thing for C# Linq. Imo this makes sense, because if I write: const matchAllConditions = conditions.every(condition => condition.matches(item))
In some condition matcher (lets say I want to check rules before an user is allowed to post), the correct behavior is the result to be true, when the array is empty.I'm not well versed, in functional programming, but in Ocaml (of F#, hehe) it would be
let rec all_hats_green = function
| [] -> true
| hat::rest -> hat.color = "green" && all_hats_green rest
so in a recursive implementation, this is the behavior that makes sense.