I will try to explain the idea behind splitting the 6 *core packages*:

**homalg****Modules****HomalgToCAS****IO_ForHomalg****RingsForHomalg****ExamplesForHomalg**

The following is an attempt to explain the 6=2+4 split.

The package **homalg** is logically independent from all other packages in the project. And among the six core packages it is together with **Modules** the only package that has to do with mathematics. The remaining four packages are of technical nature. More precisely, **homalg** is a stand alone package, that offers abstract homological constructions for computable Abelian categories. But since the ring of integers (at least up till now) is the only ring which for the purposes of homological algebra is *sufficiently supported* in **GAP** (--> Modules: Rings supported in a sufficient way), **Modules** can put the above mentioned abstract constructions into action only for the ring of integers and by generic (but of course non-efficient) methods for any of its residue class rings (Simon Görtzen's package **Gauss** adds the missing sufficient support for \(ℤ/p^n\) and \(ℚ\) to **GAP** and his other package **GaussForHomalg** makes this support visible to **Modules**).

The package **Modules** uses rings and matrices over these rings as a black box, enabling other packages to "abuse" **homalg** to compute over rings other than the ring of integers by simply providing the appropriate black boxes. And whether these rings and matrices are inside or outside **GAP** is not at all the concern of **homalg**. Even the **GAP** representation for external rings, external ring elements, and external matrices are declared in the package **HomalgToCAS** and not in homalg.

One of the main concepts of the **homalg** project is that high level and low level computations in homological algebra can and *should* be separated. So splitting **homalg** from the remaining 4 core packages is just emphasizing this concept. Moreover, **homalg** is up till now by far the biggest package in the project and will probably keep growing by supporting more basic homological constructions, whereas the other 4 packages will remain stable over longer time intervals.

The following is meant to justify the remaining 4=1+1+1+1 split.

The package **HomalgToCAS** (which needs the **homalg** package) includes all what is needed to let the black boxes used by **homalg** reside in external computer algebra systems. So as mentioned above, **HomalgToCAS** is the right place to declare the three **GAP** representations external rings, external ring elements, and external matrices. Still, **HomalgToCAS** is independent from the external computer algebra system with which **GAP** will communicate *and* independent of how this communication physically looks like.

The package **IO_ForHomalg** (which needs **HomalgToCAS**) allows **GAP** to communicate via I/O-streams with computer algebra systems that come with a terminal interface. **IO_ForHomalg** uses Max Neunhöffer's **IO** package, yet it is independent from the specific computer algebra system, as long as the latter provides a terminal interface. Splitting **IO_ForHomalg** from **HomalgToCAS** gives the freedom to replace the former by another package that lets **GAP** communicate with an external system using a different technology. So making **IO_ForHomalg** a package of its own makes it clear for developers of a new communication method which package of the **homalg** project has to be imitated/replaced. To be concrete, Thomas Bächler wrote a package called **MapleForHomalg** that enables **GAP** to communicate with **Maple** without the need for a terminal interface.

The package **RingsForHomalg** (which needs **HomalgToCAS**) provides the details of the black boxes **homalg** relies on. The details of the black boxes of course depend on the external computer algebra system (**Singular**, **MAGMA**, **Macaulay2**, **Maple**, **Sage**, ...), but are independent from the way the communication takes place. So it can be used either with **IO_ForHomalg**, with **MapleForHomalg**, or with any future communication package.

If someone needs to support a ring in some computer algebra system that **GAP** can already communicate with, but where the ring is not supported by **RingsForHomalg** yet, she or he needs to imitate/replace **RingsForHomalg** (as Simon Görtzen did with his **GaussForHomalg**, where the computer algebra system was **GAP** itself, extended by his package **Gauss**). Any substitute for **RingsForHomalg** -- as it only needs **HomalgToCAS** -- will again be independent from the way how **GAP** communicates with the computer algebra system that hosts the ring. This should encourage people to link more external systems to **homalg** without being forced to join the development of the package **RingsForHomalg**. They can simply write their own package and get the full credit for it.

The package **ExamplesForHomalg** (which needs **RingsForHomalg**) contains example scripts over various rings that are written in a universal way, i.e. independent from the system that hosts the rings. These examples cannot be part of the **homalg** package as they are defined over rings that **GAP** does not support. The package **ExamplesForHomalg** is meant to be the package where anyone can contribute interesting examples using **homalg** without necessarily contributing to the code of any of the remaining core packages.

Splitting the core packages is part of documenting the project. The complete manuals of the **homalg** and **ExamplesForHomalg** packages (maybe apart from the appendices) can then be free from any non-mathematical technicalities the average user is not interested in. A documentation of the three packages **HomalgToCAS**, **IO_ForHomalg**, and **RingsForHomalg** will be rather technical and of interest mainly for developers.

Everyone is encouraged to contribute to the **homalg** project. The project follows the philosophy of avoiding huge monolithic packages and splitting unrelated tasks. This should enable contributers to write their own packages (building on other existing packages) and getting the full credit for their work, which can then be easily distinguished from the work of others.

A huge monolithic package can never stabilize, even though parts of it will stay frozen for a long period of time. The splitting makes it likely that parts of the project together with their documentation quickly reach a stable state.

generated by GAPDoc2HTML