Hi Florian,

> An example could be something like
> 
> primitive_recursion card :: "'a set => nat"
> where
>  "card {} = 0"
>  "card (insert x A) = Suc (card A)"
> proof -
>  show "!!x y. insert x o insert y = insert y o insert x"
>  show "!!x. insert x o insert x = insert x"
> qed
> 
> thm card.simps -- {*
>  "card {} = 0"
>  "finite A ==> card (insert x A) = Suc (card A)"
> *}
> 
> using Finite_Set.fold internally.

Andy answered this much better than I could have. :)

> Apart from that aside, are separated keywords for primrec and primcorec
> really needed, or can they be distinguished just syntactically?

They can be distinguished syntactically, but I see no good reason _not_ to use 
a different keyword. It's not as if keywords were expensive, and it would feel 
wrong to type "primrec" when ones mean "primcorec" or vice versa.

Have you ever programmed in C/C++? If so, you would surely have noticed that 
the reuse of keywords there (esp. "static", which has something like four 
distinct meanings). The C/C++ motivation for this reuse was to avoid breaking 
applications, which matters a lot when there are billions of LOCs out there, 
but in Isabelle we have a more reasonable amount of users and also a 
distinction between outer and inner syntax that makes most clashes harmless 
(and who is going to call anything "primcorec" anyway?).

> I guess (co)primrec(_new) has no problem with performance.

Nothing worse than quadratic in the number of constructors, I believe.

> We have still some recdef applications not migrated yet to function due to
> performance issues.

Right.

Jasmin

_______________________________________________
isabelle-dev mailing list
isabelle-...@in.tum.de
https://mailmanbroy.informatik.tu-muenchen.de/mailman/listinfo/isabelle-dev

Reply via email to