Subtyping is the “is-a” relation made precise: A <: B means a value of type A may be used anywhere a B is expected. For records it is width subtyping — {x, y, z} is a subtype of {x, y} because it has (at least) the fields B demands. The Liskov Substitution Principle raises this from structure to behavior: a subtype must honor the supertype's contract, not merely its shape. Subtyping is what lets one piece of code serve many concrete types — and where variance, the trickiest corner of type systems, lives.
Two record types by their field sets. The demo checks width subtyping: does the wider record supply every field the narrower one requires? live demo
“Subtyping is inheritance.” — inheritance is one way to get it; subtyping is the substitutability itself, and it can be purely structural (having the right fields) with no class hierarchy at all. The relation is about use, not lineage. cited
Substitutability is a contract, not a shape: a subtype may have more, but it must never demand more or promise less. Break the contract and the “is-a” is a lie the type checker cannot catch. Liskov-Wing 1994
On the canonical compiler, with fields as a bitmask, {x,y,z}=7 <: {x,y}=3 holds (1) but the reverse fails (0) — the narrower record lacks z: