FDs and confluence

Martin Sulzmann sulzmann at comp.nus.edu.sg
Mon Apr 10 05:49:15 EDT 2006


Ross Paterson writes:
 > (see the FunctionalDependencies page for background omitted here)
 > 
 > One of the problems with the relaxed coverage condition implemented
 > by GHC and Hugs is a loss of confluence.  Here is a slightly cut-down
 > version of Ex. 18 from the FD-CHR paper:
 > 
 > 	class B a b | a -> b
 > 	class C a b c | a -> b
 > 
 > 	instance B a b => C [a] b Bool
 > 
 > Starting from a constraint set C [a] b Bool, C [a] c d, we have two
 > possible reductions:
 > 
 > 1) C [a] b Bool, C [a] c d
 > 	=> c = b, C [a] b Bool, C [a] b d	(use FD on C)
 > 	=> c = b, B a b, C [a] b d		(reduce instance)
 > 
 > 2) C [a] b Bool, C [a] c d
 > 	=> C a b, C [a] c d			(reduce instance)
           ^^^^^
should be  B a b


 > The proposed solution was to tighten the restrictions on instances to
 > forbid those like the above one for C.  However there may be another
 > way out.
 > 
 > The consistency condition implies that there cannot be another
 > instance C [t1] t2 t3: a substitution unifying a and t1 need not
 > unify b and t2.  Thus we could either
 > 
 > 1) consider the two constraint sets equivalent, since they describe
 >    the same set of ground instances, or
 > 

That's troublesome for (complete) type inference.
Two constraint stores are equivalent if they are equivalent
for any satisfying ground instance? How to check that?

 > 2) enhance the instance improvement rule: in the above example, we
 >    must have d = Bool in both cases, so both reduce to
 > 
 > 	c = b, d = Bool, B a b
 > 
 >    More precisely, given a dependency X -> Y and an instance C t, if
 >    tY is not covered by tX, then for any constraint C s with sX = S tX
 >    for some substitution S, we can unify s with S t.
 > 

I'm not following you here, you're saying?

rule C [a] b d ==> d=Bool

Are you sure that you're not introducing further "critical pairs"?

 >    We would need a restriction on instances to guarantee termination:
 >    each argument of the instance must either be covered by tX or be
 >    a single variable.  That is less restrictive (and simpler) than
 >    the previous proposal, however.
 > 
 > Underlying this is an imbalance between the two restrictions on instances.
 > In the original version, neither took any account of the context of the
 > instance declaration.  The implementations change this for the coverage
 > condition but not the consistency condition.  Indeed the original form of
 > the consistency condition is necessary for the instance improvement rule.
 > 

Maybe, you found a "simple" solution (that would be great)
but I'not 100% convinced yet.


The problem you're addressing only arises for non-full FDs.
Aren't such cases very rare in practice?

Martin




More information about the Haskell-prime mailing list