{-# LANGUAGE AllowAmbiguousTypes, TypeFamilies #-}

module T5837 where

type family TF a :: *
type instance TF (a,b) = (TF a, TF b)

t :: (a ~ TF (a,Int)) => Int
t = undefined

{-

         [G] a ~ TF (a,Int)               -- a = a_am1
-->
         [G] TF (a,Int) ~ fsk             -- fsk = fsk_am8

inert    [G] fsk ~ a

---> reduce
         [G] fsk ~ (TF a, TF Int)

inert    [G] fsk ~ a

---> substitute for fsk and flatten
         [G] TF a ~ fsk1
         [G] TF Int ~ fsk2

inert    [G] fsk ~ a
         [G] a ~ (fsk1, fsk2)

---> (substitute for a in first constraint)
         TF (fsk1, fsk2) ~ fsk1     (C1)
         TF Int ~ fsk2

inert    a ~ (fsk2, TF Int)
inert    fsk ~ (fsk2, TF Int)


------- At this point we are stuck because of
--      the recursion in the first constraint C1
--      Hooray

-- Before, we reduced C1, which led to a loop

---> (top-level reduction, re-orient)
         fsk2 ~ (TF fsk2, TF Int)
inert    a ~ (fsk2, TF Int)
inert    fsk ~ (fsk2, TF Int)

---> (attempt to flatten (TF fsk2) to get rid of fsk2
         TF fsk2 ~ fsk3
         fsk2 ~ (fsk3, TF Int)
inert    a   ~ (fsk2, TF Int)
inert    fsk ~ (fsk2, TF Int)

--->
         TF fsk2 ~ fsk3
inert    fsk2 ~ (fsk3, TF Int)
inert    a   ~ ((fsk3, TF Int), TF Int)
inert    fsk ~ ((fsk3, TF Int), TF Int)

-}
