derived types are completely substitutable for their base types
that functions which use those base types can be reused with impunity,
and the derived types can be changed with impunity.
ex:when 'car(derived from vehicle)' is a 'vehicle',
'car' should be well substitutable whereever vehicle is used.