Great meeting! There weren't many exercises, but the time we spent comparing solutions was constructive.
I then showed some recent work I've done on my proof checker, with the rationale behind it. I discussed the issues surrounding scope in checking the conditions for the forall-introduction rule, and found a bug in my code int the process! I also asked the more philosophical question of how we know what the correct criteria are for applying rules. The rough answer is that too few criteria will allow rules to be applied when they shouldn't, violating soundness. And too many criteria will prevent the rule from being applied when it could be, violating completeness.
We also discussed whether variables, constants, or both should be allowed to be the term that is abstracted over to produce a quantification. That is, if we have
and conclude
, is
supposed to be a variable, a constant, or can it be either? Chiswell & Hodges say it can be either. But I don't see anything lost in the logic if we restrict it to only constants. Restricting it to constants allows us to maintain a neat property that variables are always bound. But, it also requires us to have enough constants in our language. If we only have, say, 0 as a constant, then any time we want to introduce a universal quantifier, we must first prove something about 0. And any time we do existential elimination, we must use 0 as the constant. But we can't do that if we have any other assumptions about 0, such as
.
We can of course add arbitrary constants to the language to satisfy this need. It's interesting to note that the completeness proof for first-order logic relied on the idea of adding arbitrary constants. And it was argued there that adding constants doesn't change what you can prove. But if constants are the only thing that you can use as witnesses in existential elimination or universal introduction, then it does make a difference. Suddenly we can prove things that we couldn't before! Perhaps that points out a fault in my restriction.
You could make similar arguments about variables. What if you only have one variable in your language? Then there's no way you can express, say, a transitivity property, because that requires three variables. So, adding variables allows you to prove more things. I wonder whether it would be possible, in a language with only one or two variables, to create statements that are valid semantically, but can't be proven, due to the lack of sufficient variables?
To put it more succinctly: Are we sure in the completeness proof that we've properly handled the cases where the language has a very limited set of constants and/or variables?
Perhaps it's fine. Perhaps the fact that you can't express transitivity in a proof with only one or two variables means you can't express it semantically either, so there's no true statement that can't be proven.