public static ImmutableDictionary <string, T> Compose <T>( this ImmutableDictionary <string, T> left, ImmutableDictionary <string, T> right ) where T : IUnifiable <T> => left .Select(kvp => KeyValuePair.Create(kvp.Key, right.Apply(kvp.Value))) .Where(kvp => !(kvp.Value is Variable v && v.Name == kvp.Key))