GAP 4.8.9 installation with standard packages -- copy to your CoCalc project to get it
#############################################################################
##
#W circle.gd The CIRCLE package Alexander Konovalov
## Panagiotis Soules
##
## Let R be an associative ring, not necessarily with a unit element. The
## set of all elements of R forms a monoid with neutral element 0 from R
## under the operation r * s = r + s + rs for all r and s of R. This monoid
## is called the adjoint semigroup of R and is denoted R^ad. The group of
## all invertible elements of this monoid is called the adjoint group of R
## and is denoted by R^*.
##
## This file contains declarations for circle objects.
##
#############################################################################
#############################################################################
##
## InfoCircle
##
## We declare new Info class for Circle algorithms.
## It has 2 levels - 0 (default) and 1
## To change Info level to k, use command SetInfoLevel(InfoCircle, k)
DeclareInfoClass("InfoCircle");
#############################################################################
##
#C IsCircleObject( <obj> )
#C IsCircleObjectCollection( <obj> )
##
## An object lies in `IsCircleObject' if and only if it lies in a family
## constructed by `CircleFamily'. Since circle objects can be multiplied
## via * with elements in their family, and we want to have operations
## `One' and `Inverse' (which may return `fail' for a given circle object)
## to study groups generated by circle objects, circle objects will belong
## to the category `IsMultiplicativeElementWithInverse'. We also need
## `IsAssociativeElement' to be able to construct semigroups generated by
## circle objects.
##
DeclareCategory( "IsCircleObject", IsAssociativeElement and IsMultiplicativeElementWithInverse);
DeclareCategoryCollections( "IsCircleObject" );
#############################################################################
##
#A CircleFamily( <Fam> )
##
## is a family $F$ in bijection with the family <Fam>,
## but with the circle multiplication as infix multiplication.
## That is, for $x$, $y$ in <Fam>, the product of the images in $F$ will be
## the image of $ x + y + x \* y $.
##
## The standard type of objects in a Lie family <F> is `<F>!.CircleType'.
##
DeclareAttribute( "CircleFamily", IsFamily );
#############################################################################
##
#R IsPositionalObjectOneSlotRep( <obj> )
##
DeclareRepresentation( "IsPositionalObjectOneSlotRep",
IsPositionalObjectRep, [ 1 ] );
DeclareSynonym( "IsDefaultCircleObject",
IsCircleObject and IsPositionalObjectOneSlotRep );
#############################################################################
##
#A CircleObject( <obj> )
##
## Let <obj> be a ring element. Then `CircleObject( <obj> )' is the
## corresponding circle object. If <obj> lies in the family <F>,
## then `CircleObject( <obj> )' lies in the family CircleFamily( <F> )
## (see~"CircleFamily").
##
DeclareAttribute( "CircleObject", IsRingElement );
#############################################################################
##
#O UnderlyingRingElement( <obj> )
##
## Let <obj> be a circle object. Then `UnderlyingRingElement( <obj> )'
## is the corresponding ring element.
##
DeclareAttribute("UnderlyingRingElement", IsCircleObject );
#############################################################################
##
#E
##