[Aldor-l] a little category theory and inductive types

Ralf Hemmecke ralf at hemmecke.de
Sat May 12 14:14:27 EDT 2007


Hi Bill,

>> http://wiki.axiom-developer.org/SandBoxLimitsAndColimits

>> What you have actually done is a restricted implementation
>> of Record with the addition of the (unique) arrow from
>> (A, f:A->X, g:A->Y)  into the product X \times Y.

OK, let me give the following definition.

extend Record(T: Tuple Type): with {
	product(A: Type, f: MAP(A -> ?)(T)) -> (A -> %);
} == add {
	product(...): A -> % ==
}

Maybe you can guess what I wanted.

You have
     product: (A:Type, A->X,A->Y) -> (A->%)
for the bivariate case.

I wanted to put (A->X, A->Y) into a generic tuple. (Which would be 
constructed by this MAP constructor (wishful thinking) which maps the 
function U -> (A->U) over the tuple T.

So if T=(X,Y) then MAP(A -> ?)(T) should be the same as (A->X,A->Y).

Unfortunately, Aldor doesn't allow such a constructor. (Or if somebody 
happens to know how to define MAP, then let me know.) Hence, I cannot 
extend Record in the above fashion. That is clearly a limitation of Aldor.

> You are speaking here about the limit called Product. Of
> course similar (dual) comments also follow concerning the
> co-limit Sum. Duality is one of the fundamental properties
> of this categorical approach - you always get two
> constructions for the price of one. In any given situation
> you are often in a position of wondering about the meaning
> and use of the dual construction.

That is an interesting thought. I wonder if it could be build into a 
programming language. Then one would could simply say

Sum == Dual(Product).

I guess it's a bit problematic since the projection functions are called 
"project" and the injection functions "inject". How would "Dual" know 
how to rename?

>> You probably see yourself, that your Product implementation 
>> has a number of limitations in contrast to Record.
>>
>> 1) Suppose you have A=X=Y=Integer and
>>     f(a: A): X == a,
>>     g(a: A): X == a+1,
>>     Then construct for P ==> Product(Integer, Integer)
>>       h: A -> P := product(Integer, f, g)
>>     What result do you expect for project(h 0)?
>>
> 
> Yes that is easily remedied by defining the projections as
> 'project1', 'project2', ... similarly 'inject1', 'inject2'.
> I should have done it this way.
>  
>>     For Record(a:A,b:B,...) the projection functions are
>>     basically
>>       apply: (%, 'a') -> A
>>       apply: (%, 'b') -> B
>>     ...
>>     and thus all have different names.

> This use of enumerators seem awkward to me when what I really
> want is a cross product and disjoint union. I don't really
> want to have to specify these sort of "tags". But if the
> definition of Record(a:A,b:B, ... ) actually defined a, b,
> ... as the projections:
> 
>   a: Record(a:A,b:B, ...) -> A
>   b: Record(a:A,b:B, ...) -> A
> 
> then I would have much less complaint. Similarly
> 
>   a: A -> Union(a:A,b:B ...)
>   b: A -> Union(a:A,b:B ...)
> 
> would be the injections (union function) into the Union.
> But this would be a substantial change to the syntax and
> semantics of Aldor and Spad.

Unfortunately, Aldor exports

   apply: (%, 'a') -> A

by default. If that were

   apply: ('a', %) -> A

instead, one should be able to write x: A := a(p) where p is an element 
of Record(a: A, b: B, ...);


Ralf



More information about the Aldor-l mailing list