Incidentally, Goedel’s Incompleteness Theorem is actually really simple to prove; seeing this proof may, hopefully, wipe off the pseudomystical allure it is all too easy to misguidedly ascribe to the result.
The core idea is this: suppose Alice is a show-off, know-it-all who has an answer ready to go for any yes/no question you might want to toss at her. Let’s try and show that she has to get at least one question wrong.
One easy example is “What’s the opposite of Alice’s answer to this question?”. Obviously, any answer given by Alice to this will be wrong.
But you might object that it’s unfair to allow the term “this question” to appear in there. Alright. We’ll suppose Alice only works within a more restrictive language which doesn’t directly allow for such self-referential constructions. Can we still get the same effect by other means, by cleverly replacing “this question” by something else?
Yes, actually. For example, we can use “What’s the opposite of Alice’s answer to the result of substituting ‘What’s the opposite of Alice’s answer to the result of substituting _____ into its own blank?’ into its own blank?”. It’s a bit more longwinded, but it’s easy enough to see that it acts exactly the same way as the above question; once again, any answer given by Alice to this will be wrong.
[One alternative way to think about yes/no questions with blanks in them is as describing properties an object might have; for example, the question “Is ____ a male with children?” corresponds to the property of being a father. So, another way to formulate the above is as follows: let us say that a property-description is Alice-heterological if Alice says “No” when asked whether it holds of itself (for example, presumably “the property of being six words long” and “the property of being a palindrome” are Alice-heterological, while “the property of being seven words long” is not). A straightforward translation of the above paragraph yields that Alice cannot correctly answer the question as to whether “the property of being Alice-heterological” is Alice-heterological.]
What all did it take for us to be able to pull this off? Just that the language being used was capable of speaking about opposites in some way (e.g., logical negation), as well as about the question-answering method under investigation [specifically, a method purporting to be able to answer questions of the form “Does object X define a property which object Y has?”, where the two objects are of the same type]. Thus, we can basically conclude, no language L is capable of defining a method to correctly answer every question of the form “Does L-term X define a property which L-term Y doesn’t have?”.
For particular special languages (e.g., your favorite programming language), and particular definitions within those languages (e.g., your favorite mechanical theorem prover), this result has particular consequences, but it applies rather generally as well.