login  home  contents  what's new  discussion  bug reports     help  links  subscribe  changes  refresh  edit

Edit detail for SandBoxAbelianDuck revision 1 of 8

1 2 3 4 5 6 7 8
Editor: Bill Page
Time: 2008/07/27 14:02:32 GMT-7
Note: ducks

changed:
-
During the Aldor/Axiom Workshop 2008 at RISC in one of his
presentations Stephen Watt began with:

Q: When is a duck not a Duck?
A: When it is an AbelianDuck!

This is in reference to the problem of defining appropriate
categories for domains such as 'Integer' which have a monoid
consisting of (*,1) as well as a monoid consisting of (+,0)
(or more specifically, a commutative group which is contained
in such a monoid). The issue is: Why should we be required to
use different names for categories like 'Monoid' to mean just
(*,1) and 'AbelianGroup' to mean (+,0).

But an AbelianDuck really is a Duck!

Here is another (still unsuccessful) attempt to express this
in SPAD code. The error during compile suggests a compiler
error, but the specifications of the language are not clear
on exactly whether this sort of construction is really intended
to work.

\begin{spad}
)abbrev category ASSOC Associative
-- m(m(a,b),c) = m(a,m(b,c))
Associative(m:Symbol):Category == with
       m:(%,%) -> %

)abbrev category COM Commutative
-- m(a,b) = m(b,a)
Commutative(m:Symbol):Category == with
       m:(%,%) -> %

)abbrev category ID Identity
-- m(u,a)=a and m(a,u)=a
Identity(u:Symbol,m:Symbol):Category == Commutative(m) with
       u: () -> %

)abbrev category INV Inverse
-- m(inv(a),a) = u and m(a,inv(a)) = u
Inverse(m:Symbol,inv:Symbol,u:Symbol):Category == Join(Commutative(m),Identity(u)) with
       inv: % -> %

)abbrev category DIST Distributes
-- m(a,s(b,c)) = s(m(a,b),m(a,c))
-- m(s(a,b),c) = s(m(a,c),m(b,c))
Distributes(m,s):Category == with nil

)abbrev category MONOID Monoid
Monoid(m:Symbol,u:Symbol): Category
   == Join(Associative(m),Identity(u))
 
)abbrev category GROUP Group
Group(m:Symbol,inv:Symbol,u:Symbol): Category
   == Join(Monoid(m,u),Inverse(m,inv,u))

)abbrev category ABELG AbelianGroup
AbelianGroup(m:Symbol,inv:Symbol,u:Symbol): Category
   == Joint(Group(m,inv,u),Commutative(m))

)abbrev category RING Ring
Ring(s:Symbol,inv:Symbol,z:Symbol, m:Symbol,u:Symbol): Category
   == Join(AbelianGroup(s,inv,z),Monoid(m,u),Distributes(m,s))
\end{spad}

\begin{axiom}
)sh Ring("+","-","0",*,"1")
Ring("+","-","0","*","1") has commutative("+")
\end{axiom}

Let's try this ...
\begin{axiom}
)sh Ring(a,b,c,d,e)
Ring(a,b,c,d,e) has commutative(a)
\end{axiom}
Interesting! Is it somewhere written that "has" can have a category as its first argument?

OK, we are going to implement...
\begin{spad}
)abbrev domain MYINT MyInteger
MyInteger: Ring(a,b,c,d,e) == add
  Rep:=Integer
  a(x: %, y: %): % == x
  b(x: %): % == x
  c(): % == 0 pretend %
  d(x: %, y: %): % == x
  e(): % == 0 pretend %
\end{spad}



During the Aldor/Axiom Workshop 2008 at RISC in one of his presentations Stephen Watt began with:

Q: When is a duck not a Duck? A: When it is an AbelianDuck?!

This is in reference to the problem of defining appropriate categories for domains such as Integer which have a monoid consisting of (*,1) as well as a monoid consisting of (+,0) (or more specifically, a commutative group which is contained in such a monoid). The issue is: Why should we be required to use different names for categories like Monoid to mean just (*,1) and AbelianGroup to mean (+,0).

But an AbelianDuck? really is a Duck!

Here is another (still unsuccessful) attempt to express this in SPAD code. The error during compile suggests a compiler error, but the specifications of the language are not clear on exactly whether this sort of construction is really intended to work.

spad
)abbrev category ASSOC Associative
m(m(a,b),c) = m(a,m(b,c)) Associative(m:Symbol):Category == with m:(%,%) -> %
)abbrev category COM Commutative -- m(a,b) = m(b,a) Commutative(m:Symbol):Category == with m:(%,%) -> %
)abbrev category ID Identity -- m(u,a)=a and m(a,u)=a Identity(u:Symbol,m:Symbol):Category == Commutative(m) with u: () -> %
)abbrev category INV Inverse -- m(inv(a),a) = u and m(a,inv(a)) = u Inverse(m:Symbol,inv:Symbol,u:Symbol):Category == Join(Commutative(m),Identity(u)) with inv: % -> %
)abbrev category DIST Distributes -- m(a,s(b,c)) = s(m(a,b),m(a,c)) -- m(s(a,b),c) = s(m(a,c),m(b,c)) Distributes(m,s):Category == with nil
)abbrev category MONOID Monoid Monoid(m:Symbol,u:Symbol): Category == Join(Associative(m),Identity(u))
)abbrev category GROUP Group Group(m:Symbol,inv:Symbol,u:Symbol): Category == Join(Monoid(m,u),Inverse(m,inv,u))
)abbrev category ABELG AbelianGroup AbelianGroup(m:Symbol,inv:Symbol,u:Symbol): Category == Joint(Group(m,inv,u),Commutative(m))
)abbrev category RING Ring Ring(s:Symbol,inv:Symbol,z:Symbol, m:Symbol,u:Symbol): Category == Join(AbelianGroup(s,inv,z),Monoid(m,u),Distributes(m,s))
spad
   Compiling FriCAS source code from file 
      /var/zope2/var/LatexWiki/9120812264571396571-25px001.spad using 
      old system compiler.
   ASSOC abbreviates category Associative 
------------------------------------------------------------------------
   initializing NRLIB ASSOC for Associative 
   compiling into NRLIB ASSOC 
;;; *** |Associative| REDEFINED Time: 0 SEC.
finalizing NRLIB ASSOC Processing Associative for Browser database: --->-->Associative((m (% % %))): Not documented!!!! --->-->Associative(constructor): Not documented!!!! --->-->Associative(): Missing Description ------------------------------------------------------------------------ Associative is now explicitly exposed in frame initial Associative will be automatically loaded when needed from /var/zope2/var/LatexWiki/ASSOC.NRLIB/code
COM abbreviates category Commutative ------------------------------------------------------------------------ initializing NRLIB COM for Commutative compiling into NRLIB COM
;;; *** |Commutative| REDEFINED Time: 0 SEC.
finalizing NRLIB COM Processing Commutative for Browser database: --->-->Commutative((m (% % %))): Not documented!!!! --->-->Commutative(constructor): Not documented!!!! --->-->Commutative(): Missing Description ------------------------------------------------------------------------ Commutative is now explicitly exposed in frame initial Commutative will be automatically loaded when needed from /var/zope2/var/LatexWiki/COM.NRLIB/code
ID abbreviates category Identity ------------------------------------------------------------------------ initializing NRLIB ID for Identity compiling into NRLIB ID
;;; *** |Identity| REDEFINED Time: 0 SEC.
finalizing NRLIB ID Processing Identity for Browser database: --->-->Identity((u (%))): Not documented!!!! --->-->Identity(constructor): Not documented!!!! --->-->Identity(): Missing Description ------------------------------------------------------------------------
>> System error: |Identity;| [or a callee] requires more than one argument.

axiom
)sh Ring("+","-","0",*,"1")
The constructor Ring takes 0 arguments and you have given 5 . Ring("+","-","0","*","1") has commutative("+")
The constructor Ring takes 0 arguments and you have given 5 .

Let's try this ...

axiom
)sh Ring(a,b,c,d,e)
The constructor Ring takes 0 arguments and you have given 5 . Ring(a,b,c,d,e) has commutative(a)
The constructor Ring takes 0 arguments and you have given 5 .

Interesting! Is it somewhere written that "has" can have a category as its first argument?

OK, we are going to implement...

spad
)abbrev domain MYINT MyInteger MyInteger: Ring(a,b,c,d,e) == add Rep:=Integer a(x: %, y: %): % == x b(x: %): % == x c(): % == 0 pretend % d(x: %, y: %): % == x e(): % == 0 pretend %
spad
   Compiling FriCAS source code from file 
      /var/zope2/var/LatexWiki/4007632824524312372-25px004.spad using 
      old system compiler.
   MYINT abbreviates domain MyInteger 
------------------------------------------------------------------------
   initializing NRLIB MYINT for MyInteger 
   compiling into NRLIB MYINT 
>> System error: EVAL [or a callee] requires less than five arguments.