]>
A subdomain S of a domain D is a domain consisting of
Every domain is a subdomain of itself, trivially satisfying the membership test: true.
Currently, there are only two system-defined subdomains in Axiom that receive substantial use. PositiveInteger and NonNegativeInteger are subdomains of Integer. An element of NonNegativeInteger is an integer that is greater than or equal to zero, that is, satisfies . An element of PositiveInteger is a nonnegative integer that is, in fact, greater than zero, that is, satisfies . Not all operations from Integer are available for these subdomains. For example, negation and subtraction are not provided since the subdomains are not closed under those operations. When you use an integer in an expression, Axiom assigns to it the type that is the most specific subdomain whose predicate is satisfied.
This is a positive integer.
This is a nonnegative integer.
This is neither of the above.
Furthermore, unless you are assigning an integer to a declared variable or using a conversion, any integer result has as type the most specific subdomain.
When necessary, Axiom converts an integer object into one belonging to a less specific subdomain. For example, in , the arguments to "-" are both elements of PositiveInteger, but this type does not provide a subtraction operation. Neither does NonNegativeInteger, so and are viewed as elements of Integer, where their difference can be calculated. The result is , which Axiom then automatically assigns the type PositiveInteger.
Certain operations are very sensitive to the subdomains to which their arguments belong. This is an element of PositiveInteger.
This is an element of Fraction Integer.
It makes sense then that this is a list of elements of PositiveInteger.
What should the type of [10**(i-1) for i in 2..5] be? On one hand, is always an integer greater than zero as ranges from to and so is also always a positive integer. On the other, is a very simple function of . Axiom does not try to analyze every such function over the index's range of values to determine whether it is always positive or nowhere negative. For an arbitrary Axiom function, this analysis is not possible.
So, to be consistent no such analysis is done and we get this.
To get a list of elements of PositiveInteger instead, you have two choices. You can use a conversion.
Or you can use pretend. pretend
The operation pretend is used to defeat the Axiom type system. The expression object pretend D means ``make a new object (without copying) of type D from object.'' If object were an integer and you told Axiom to pretend it was a list, you would probably see a message about a fatal error being caught and memory possibly being damaged. Lists do not have the same internal representation as integers!
You use pretend at your peril. peril
Use with great care! Axiom trusts you that the value is of the specified type.