|
|
last edited 16 years ago by Bill Page |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | ||
Editor: Bill Page
Time: 2008/07/09 09:17:50 GMT-7 |
||
Note: domains and categories |
added:
From BillPage Wed Jul 9 09:17:50 -0700 2008
From: Bill Page
Date: Wed, 09 Jul 2008 09:17:50 -0700
Subject: domains and categories
Message-ID: <20080709091750-0700@axiom-wiki.newsynthesis.org>
*On Tue, Jul 8, 2008 at 3:06 PM Gabriel Dos Reis wrote:*
I'll be using the word *specification* in an informal sense that I
hope is clear from context.
A **category** is a collection of specifications. A **domain** is a
collection of implementations. An **object** is any computational
values in an OpenAxiom program. An object has a representation given
by a domain. An object 'O' is said to have type 'd' if 'd' implements
the reprsentation for the object 'O'.
A category constructor is a category-valued function, defined with
the term 'Category' as its return type.
A domain constructor is a domain-valued function, defined with a
category as its return type.
Category contructors and domain constructors may be parameterized by
domains and categories. Furthermore, domains and categories have
runtime representations, e.g. they are reflected as objects in
OpenAxiom. In particular, domains objects have type 'Domain', and
category objects have type 'Category'. And 'Domain' and 'Category'
are indeed domains, because they implement specifications and provide
object representations.
I did not discuss the notion of **package**, as it is almost like
a domain - it implements specifications - except that it does not
provide object representation.
-- Gaby
There seems to be different understandings of Type, domain, category, Category, etc. around. Here is an attempt to collect all these different opinions in order to make discussion about them clearer.
Some related referemces in the email list archives:
A category is an L-type whose type is the language-defined constant Category
.
A domain is an L-type whose type is a category.
An L-type is either a category, a domain or the language-defined constants Category
and Type
.
Any L-type is of type Type
.
I wrote L-type to mean type in the language, either Aldor or SPAD.
That conflicts the above statement that Type
is a domain, but is in line with the
two-level domain/category model.
See also Sections 7.8 (Domains) and 7.9 (Categories) of the Aldor User Guide.
I haven't (yet) found a sentence that says that Type
or Category
are domains.
Every value in Aldor is a member of a unique domain which determines the interpretation of its data.
All type values have ``Type'' as their unique base type. As with all other values, it is the unique base type which determines how values are to be represented.
The language allows categories to be treated as normal values and allows names to refer to categories. A category (by definition) is a value of the Aldor built-in type Category.
I have nothing againstType
being a type. But Type
is not an Aldor-domain.
Maybe it is a domain in a broader sense, but that sense is only vaguely defined, if at all.
I would like not to use domain and type interchangeably.
The fact that Type
is a domain certainly does not make domain
and type interchangeable. Objects of the domain Type
are
themselves either domains or categories, so type and domain
are still not interchangeable since categories are not domains.
Could you explain why you claim that "Type is not an Aldor-domain". Is this only a personal preference? To me: "If it talks like a duck and it looks like a duck, its a duck...". In this case the compiler output, the library definitions, and quotations from the primary developer all agree:
Type has with {};
returns true.
I simply have not found an explicit statement in the AUG that says thatType
and Category
are domains. How else could I claim that they are?
And regardless of what others say, could you give your definitions similar
to what I started at the beginning of this page? Let's first collect the status,
before we argue, what implications it would have if Type
would be a domain.
Maybe in the end it doesn't matter whether or not Category
and Type
are domains.
Personally I think Aldor is a brilliant distillation and crystallization of the concepts that evolved from SPAD in Axiom. It's novel "categorical" alternative to the class/subclass concepts of the object-oriented paradigm is probably still under-appreciated by language designers. The discipline of programming language design in the meantime has largely moved on to other issues but this tradition can be carried on in Axiom by the OpenAxiom project.
This is a first draft in point form of how I think domains and categories should work in at least OpenAxiom:
E.g.:
a:A := new()$A
declares a
as a variable with values in domain A returned by
an operation called new
in A.
E.g.:
d:Domain := A
declares d
as a variable whose value is the domain A. The
domain Domain provides some additional reflective and
syntactical operations on domains such as equality.
E.g.:
(d = A)@Boolean
is true only if d
has the value A.
E.g.:
X:Category == with f: A -> B
By "subdomain" is meant that the domains in Domain are also values in some category only if they reference that category by name and implement the required exported operations.
E.g.:
D:X == add f(x) == ...
As subdomains of Domain, categories are themselves domains and can be used in declarations of variables and parameters.
E.g.:
a:X := A #:X->Integer
Categories are organized into a lattice by referring to other categories by name.
E.g.:
Y:Category == X with g: B -> A
or:
Z:Category == Join(X,Y)
The list of exported operations is the union of all exported
operations of the categories to which it refers plus those
give after with
.
=
and has
.E.g.:
has:(Union(Category,Domain),Category) -> Boolean A has X
is true if A refers to X or to a category that refers to X applied recursively.
I'll be using the word specification in an informal sense that I hope is clear from context.
A category is a collection of specifications. A domain is a
collection of implementations. An object is any computational
values in an OpenAxiom program. An object has a representation given
by a domain. An object O
is said to have type d
if d
implements
the reprsentation for the object O
.
A category constructor is a category-valued function, defined with
the term Category
as its return type.
A domain constructor is a domain-valued function, defined with a
category as its return type.
Category contructors and domain constructors may be parameterized by
domains and categories. Furthermore, domains and categories have
runtime representations, e.g. they are reflected as objects in
OpenAxiom. In particular, domains objects have type Domain
, and
category objects have type Category
. And Domain
and Category
are indeed domains, because they implement specifications and provide
object representations.
I did not discuss the notion of package, as it is almost like a domain - it implements specifications - except that it does not provide object representation.
-- Gaby