Like add_builtin_program_clauses, but for DomainGoal::Normalize involving
a projection (e.g. <fn(u8) as FnOnce<(u8,)>>::Output)
For well known traits we have special hard-coded impls, either as an
optimization or to enforce special rules for correctness.
Returns type of the last field of the input struct, which is useful for Sized and related
traits. Returns None if the input is not a struct or it has no fields.
Given a trait ref T0: Trait and a list of types U0..Un, pushes a clause of the form
Implemented(T0: Trait) :- Implemented(U0: Trait) .. Implemented(Un: Trait)