{-
Use Scrap-Your-Boilerplate to recursively apply our substutitions
to our expression, bottom-up
-}
subExpForArrName :: (Data a) => [(Name, Expression)] -> Expression -> a -> a
subExpForArrName names subExp = let
    subAll = everywhere  (mkT $ subOneLevelArr names subExp)
    fixAllForalls = everywhere (mkT $ fixForall subExp )
  in (subAll . fixAllForalls)
subExpForArrName :: (Data a) => [(Name, Expression)] -> Expression -> a -> a
subExpForArrName names subExp = let
    subAll = everywhere  (mkT $ subOneLevelArr names subExp)
    fixAllForalls = everywhere (mkT $ fixForall subExp )
  in (subAll . fixAllForalls)
subExpForArrName names subExp = let
    subAll = everywhere  (mkT $ subOneLevelArr names subExp)
    fixAllForalls = everywhere (mkT $ fixForall subExp )
  in (subAll . fixAllForalls)