Shape

A shape describes which values are allowed. Int is a shape; so is Int & >= 18 (the integers from 18 up), :standard | :premium (one of two atoms), and {name: String, age: Int & >= 0} (a record with two fields).

A shape with named fields is a structural shape; the others are atomic. Giving a structural shape a name makes a structural type.

Shapes are values. You can bind one with let, return it from a function, and combine shapes with unification (&):

bondy
let adult = Int & >= 18
age & adult     %% the age if it is 18 or more; a failure saying why, if not

Not to be confused with a role (relation, constraint, event, fluent): a shape says which values are allowed, a role says what those values are doing.