If you want to write your own parser that works that way, I’d be interested to see it. (I mean, seriously. I like new parsers. But it’d be a lot of work.)
That’s not the way the Inform parser works, though, and I’m not sure if there are other parsers that work that way. When the user enters “look hat” it resolves “hat” against every object in scope. If there is a hat not in scope, it doesn’t check it. So when it hits the parser error, it doesn’t know that “hat” matches something not in scope.
There can be some grammar tokens that match against every object in the world whether it’s in scope or not, but that requires looping over every object in the world when it’s parsing the command, which takes time.
And then your suggestion about the “silver teapot”… phew. Now if the player types “look top hat” and there’s no top hat in sight, the parser is to respond “You don’t see a hat here,” unless presumably there’s a hat that’s not a top hat there, in which case it had better be “You don’t see a top hat here.” And if the player typed “x silver” (no noun) then it needs to print “You don’t see anything silver here,” which means the parser has to individually keep track of which words are adjectives and which words are nouns instead of referring to the object. This is hard.
Whereas keeping track of individual objects and which ones the player has seen is relatively doable and allows “x silver” to sensibly respond “You last saw the tarnished silver teapot in the mudroom” if the player has seen the teapot, or “You haven’t seen anything that can be described that way” if they haven’t.