A sort is a set of classified elements.

Sorts are declared between [ and ] as follows:

[ <sort-name> ... <sort-name> ]

[Convention] The first letter of a sort name is capitalized, e.g. Nat, Int, String.

Plural sorts can be declared with space separation.

The following is a declaration of Sort Node and Sort Edge:

[ Node Edge ]


A partial order over sets of sorts can be defined. For example, consider Sorts Nat and Int for natural numbers and integers respectively. All elements belonging to Nat also belongs to Int. In this case, Nat is called a subsort of Int, and Int is called a supersort of Nat. A sort cannot be a subsort of itself.

A partial order over sets of sorts is declared with the keyword < as follows:

[ <subsort-name> < <supersort-name> ]


[ NzInt < Int ]

Sort NzInt is subsort of Sort Int, where NzInt stands for the set of all integers except zero. Subsorts are often used for defining partial functions. For example, multiplication * should be defined for all integers, but the domain of the second argument of division / should be the set of non-zero integers. Those operators can be defined as follows:

  op _*_ : Int Int -> Int
  op _/_ : Int NzInt -> Int

Original Copyright © Takahiro Seino, all rights reserved.