Hi guys,
I got back to doing a small Abella development recently, and got frustrated by bad error messages on failed apply/backchain. I eventually understood that some of those surprising failures were caused by a gap between concrete and abstract syntax; at least that's how I perceived it. It's what the subject of this mail says, demonstrated in this example:
Theorem test : (forall (x:olist) y, x = y) -> (forall (x:olist) y, x = y).
intros.
backchain H1. % everything works fine
Theorem test : (forall (x:olist), forall y, x = y) -> (forall (x:olist), forall y, x = y).
intros. % just as before, good
backchain H1. % unify failure
I have never really looked at Abella's code, but it should be relatively easy to fix this: just normalize both inputs to the same synthetic AST.
Also, it's not nice that the user sees (Failure "List.iter2") when not providing the right number of arguments to apply.
Cheers,
David