[isabelle-dev] functions over abstract data
Alexander Krauss
krauss at in.tum.de
Sat Aug 24 23:20:19 CEST 2013
Hi Chris,
[...]
> When defining a function "f", whose result type is "T", it might be
> necessary to "peek under the hood" in order to show termination. When
> doing this manually, we destroy the abstraction and always have to
> reason about the raw-level and even worse, also all the existing
> constants with result type T have to be deconstructed in the definition.
I discussed similar ideas with John Matthews around 2007/8, where we
also had a recursive specification of a value that could "internally" be
expressed as a recursive function, even though it was not of function
type itself. The (single) motivation at the time was the attempt to
define infinite streams, modelled basically as "nat => 'a". However, I
abandoned the approach as too complicated. For streams, I believe they
should be more naturally defined corecursively. The same might hold for
your parsers if you find a good way of expressing it: Your "par"
definition is well-formed because the recursive call is wrapped into
something else... This looks more like a productivity argument then a
termination one, even though, when unfolding, one can be seen as the other.
Do you know the work of Nils Anders Danielsson on parsers, in particular
http://www.cse.chalmers.se/~nad/publications/danielsson-parser-combinators.pdf
?
I'm not sure what this would mean in HOL, but it is certainly relevant.
[...]
> Here comes my suggestion
[...]
What you are proposing would add substantial complexity to pretty much
everything in the function package. While it might be possible to do
such a thing ("no obvious deficiencies"), you would pay later when
maintaining the stuff. This is too much for what seems to me like a
"one-man-feature".
> PS: I started to dive into the function package. My first hurdle is that
> for "f" not of function type (as in "par"), no recursive calls are
> generated, since "Function_Ctx_Tree.mk_tree" says that "No cong rules
> could be found".
The analysis in the function package assumes basically a form where the
arguments of recursive calls can be extracted explicitly. This is a hard
assumption, and I see no chance of getting rid of it. The only sensible
way of lifting this restriction is to build some sort of wrapper that
reduces some other format to a normal function definition.
Alex
More information about the isabelle-dev
mailing list