Language Reference/Basic Concepts/Types and Subtypes

Types
Visual Prolog types are divided into object types and value types. Objects have mutable state, whereas values are immutable.

Object types are defined by interface definitions.

The value types include, and  and  (also known as algebraic data types). Simpler forms of compound domains are structure and enumeration types, whereas more complex forms represents tree structures.

Subtypes
Types are organized in a subtype hierarchy. Subtypes are used to introduce subsumption-polymorphism: Any context that expects a value of some type will equally well accept a value of any subtype. Or if we turn it around, we can say, that values of a certain type are automatically converted to any super-type where needed and can thus be used as having the super-type without explicit type conversion.

Subtypes can be derived from any value type, except from algebraic data types. Types derived from algebraic data types are synonym types rather than subtypes, i.e. they are the same type rather than a subtype.

The notion of subtypes relates closely to the notion of subsets. But it is important to notice that even though a type is &quot;mathematically&quot; a subset of another type it need not be a subtype. A type is only subtype of another type if it is declared to be so.

domains t1 = [1..17]. t2 = [5..13]. t3 = t1 [5..13].

t1 is an integral type whose values are the integers from 1 to 17 (both inclusive). Likewise, t2 contains the values from 5 to 13. So t2 is a subset of t1, but t2</vp> is not a subtype of t1</vp>. On the other hand, t3</vp> (which contains the same values as t2</vp>) is a subtype of t1</vp>, because it is declared to be so.

The language contains a few implicit subtype relations, but otherwise subtype relations are explicitly stated in type definitions.

Object types are organized in a subtype hierarchy rooted in the predefined object type object, i.e. any object type is a subtype of object. Object subtypes are defined by means of stating that one interface supports another. If an object has an interface/object type that supports a certain other interface, then the object also has that type and can without further interference be used as such an object.

See also: