SEM MaybeName [ | | isNothing : Bool name : { Maybe Name } ]
    | Nothing             lhs.isNothing = True
                          lhs.name      = Nothing
    | Just                lhs.isNothing = False
                          lhs.name      = Just @name.self
    --  name                     : Name
    
SEM MaybeNames [ | | names : { Maybe [Name] } ]
    | Nothing             lhs.names = Nothing
    | Just                lhs.names = Just @names.names
    --  name                     : Name

ATTR Names [ | | names : {[Name]} ]

SEM Names
    | Cons     lhs.names = @hd.self : @tl.names
    | Nil      lhs.names = []

ATTR FunctionBinding FunctionBindings LeftHandSide [ | | name:Name ]

SEM FunctionBindings 
  | Cons  lhs . name = @hd.name
  | Nil   lhs . name = internalError "ToCoreName.ag" "n/a" "empty FunctionBindings"

SEM LeftHandSide
  | Function  lhs . name = @name.self
  | Infix     lhs . name = @operator.self
