thanks, Tom!

indeed, for that old thread on an alternative translation, which forked from an even older thread, I put aside all my wishlist and simply focussed on removing what I considered anomalies in the operationalisation of type classes with FDs via CHR in the old translation. the CHR resulting from the alternative translation should not allow any new constraints to be proven, it should only make sure that any FD-based information is fully used in any results, completing any incomplete deductions in the old system.

I found it highly irregular that whether or not an FD was respected by the CHR system resulting from the original translation could depend on reduction strategies - the only way for real implementations to work around this shortcoming would be to iterate improvement before continuing reduction, which puts additional constraints on the implementer in an already complex system; and the only way for a formal system based on this incomplete translation to be safe was to try and cover all the possible holes with a
set of restrictions that backfire by complicating the language design and
making the whole idea of FDs look more tricky than it needs to be.

there are interesting problems in FDs, but it seems that the confluence
problems were merely problems of the old translation, not anything
inherent in FDs! I really had hoped we had put that phantom to rest.

(btw, in a real implementation, I wouldn't expect the memo constraints to enter the constraint store at all - they are just a CHR-based way to express a memo table, hence the name; as, in fact, I explained before even starting that alternative translation thread..).

cheers,
claus

OK, so you want to modify the usual instance reduction rule by recording
functional dependencies from the head.  That is, you get confluence by
remembering all the choices you had along the way, so you can still take
them later.

My problem with this scheme is that it makes FDs an essential part of
the semantics, rather than just a shortcut, as they are in the original
system.  With the old system, one can understand instances using a
Herbrand model, determined by the instance declarations alone.  If the
instances respect FDs, types can be made more specific using improvement
rules justified by that semantics.  With your system, there's only the
operational semantics.

The logical semantics of the original CHR program and that of Claus with the memoization is really the same, I'm sure. The justifiable improvemetns are exactly the same. The main difference is that the memoization makes the rules confluent in more cases, i.e. the difference is in the operational semantics. For that matter the operational semantics of the confluent program would be considered to capture more completely the logical semantics and justifiable improvements.

To understand types, programmers must operate
the rewriting system.

Not at all. The confluent program is really more intuitive, because more of the logically justifiable improvements are done.

And the constraint store they must work with will
be quite cluttered with all these memoized FDs.

This is more of an implementation issue than a conceptual one, isn't it?
I can think of a number of optimizations already to reduce the overhead.

_______________________________________________
Haskell-prime mailing list
[email protected]
http://haskell.org/mailman/listinfo/haskell-prime

Reply via email to