GAP 4.8.9 installation with standard packages -- copy to your CoCalc project to get it
########################################################################### ## #W omput.gd OpenMath Package Andrew Solomon #W Marco Costantini #W Alexander Konovalov ## #Y Copyright (C) 1999, 2000, 2001, 2006 #Y School Math and Comp. Sci., University of St. Andrews, Scotland #Y Copyright (C) 2004, 2005, 2006 Marco Costantini ## ## Writes a GAP object to an output stream, as an OpenMath object ## ########################################################################### DeclareGlobalVariable("OpenMathRealRandomSource"); ########################################################################### ## ## Declarations for OpenMathWriter ## ## <#GAPDoc Label="IsOpenMathWriter"> ## <ManSection> ## <Filt Name="IsOpenMathWriter" Type="Category" /> ## <Filt Name="IsOpenMathXMLWriter" Type="Category" /> ## <Filt Name="IsOpenMathBinaryWriter" Type="Category" /> ## <Description> ## <Ref Filt="IsOpenMathWriter"/>is a category for &OpenMath; writers. ## It has two subcategories: <Ref Filt="IsOpenMathXMLWriter"/> and ## <Ref Filt="IsOpenMathBinaryWriter"/>. ## </Description> ## </ManSection> ## <#/GAPDoc> DeclareCategory( "IsOpenMathWriter", IsObject ); DeclareCategory( "IsOpenMathXMLWriter", IsOpenMathWriter ); DeclareCategory( "IsOpenMathBinaryWriter", IsOpenMathWriter ); OpenMathWritersFamily := NewFamily( "OpenMathWritersFamily" ); ########################################################################### ## ## <#GAPDoc Label="OpenMathBinaryWriter"> ## <ManSection> ## <Func Name="OpenMathBinaryWriter" Arg="s" /> ## <Description> ## for a stream <A>s</A>, returns an object in the category ## <Ref Filt="OpenMathBinaryWriter"/>. ## </Description> ## </ManSection> ## <#/GAPDoc> DeclareGlobalFunction ( "OpenMathBinaryWriter" ); ########################################################################### ## ## <#GAPDoc Label="OpenMathXMLWriter"> ## <ManSection> ## <Func Name="OpenMathXMLWriter" Arg="s" /> ## <Description> ## for a stream <A>s</A>, returns an object in the category ## <Ref Filt="IsOpenMathXMLWriter"/>. ## </Description> ## </ManSection> ## <#/GAPDoc> DeclareGlobalFunction ( "OpenMathXMLWriter" ); DeclareRepresentation( "IsOpenMathWriterRep", IsPositionalObjectRep, [ ] ); OpenMathBinaryWriterType := NewType( OpenMathWritersFamily, IsOpenMathWriterRep and IsOpenMathBinaryWriter ); OpenMathXMLWriterType := NewType( OpenMathWritersFamily, IsOpenMathWriterRep and IsOpenMathXMLWriter ); ########################################################################### ## #F OMPutObject( <stream>, <obj> ) #F OMPutObjectNoOMOBJtags( <stream>, <obj> ) ## ## <#GAPDoc Label="OMPutObject"> ## ## <ManSection> ## <Func Name="OMPutObject" Arg="stream obj" /> ## <Func Name="OMPutObjectNoOMOBJtags" Arg="stream obj" /> ## <Description> ## <Ref Func="OMPutObject" /> writes (appends) the XML &OpenMath; ## encoding of the &GAP; object <A>obj</A> to output stream <A>stream</A> ## (see <Ref BookName="ref" Oper="InputTextFile" />, ## <Ref BookName="ref" Oper="OutputTextUser" />, ## <Ref BookName="ref" Oper="OutputTextString" />, ## <Ref BookName="scscp" Oper="InputOutputTCPStream" Label="for client" />, ## <Ref BookName="scscp" Oper="InputOutputTCPStream" Label="for server" />). ## <P/> ## The second version does the same but without <OMOBJ> ## tags, what may be useful for assembling complex &OpenMath; objects. ## <Example> ## <![CDATA[ ## gap> g := [[1,2],[1,0]];; ## gap> t := ""; ## "" ## gap> s := OutputTextString(t, true);; ## gap> w:=OpenMathXMLWriter( s ); ## <OpenMath XML writer to OutputTextString(0)> ## gap> OMPutObject(w, g); ## gap> CloseStream(s); ## gap> Print(t); ## <OMOBJ xmlns="http://www.openmath.org/OpenMath" version="2.0"> ## <OMA> ## <OMS cd="linalg2" name="matrix"/> ## <OMA> ## <OMS cd="linalg2" name="matrixrow"/> ## <OMI>1</OMI> ## <OMI>2</OMI> ## </OMA> ## <OMA> ## <OMS cd="linalg2" name="matrixrow"/> ## <OMI>1</OMI> ## <OMI>0</OMI> ## </OMA> ## </OMA> ## </OMOBJ> ## ]]> ## </Example> ## ## </Description> ## </ManSection> ## <#/GAPDoc> ## DeclareGlobalFunction("OMPutObject"); DeclareGlobalFunction("OMPutObjectNoOMOBJtags"); DeclareOperation("OMPutOMOBJ", [ IsOpenMathWriter ] ); DeclareOperation("OMPutEndOMOBJ", [ IsOpenMathWriter ] ); ########################################################################### ## #O OMPut(<stream>,<obj> ) ## ## DeclareOperation("OMPut", [IsOpenMathWriter, IsObject ]); ########################################################################### ## #F OMPrint( <obj> ) ................. Print <obj> as OpenMath object ## ## <#GAPDoc Label="OMPrint"> ## <ManSection> ## <Func Name="OMPrint" Arg="obj" /> ## <Description> ## OMPrint writes the default XML &OpenMath; encoding of &GAP; ## object <A>obj</A> to the standard output. ## <P/> ## One can try it with different &GAP; objects to see if they ## can be converted to &OpenMath; and learn how their &OpenMath; ## representation looks like. Here we show the encoding for lists ## of integers and rationals: ## <Example> ## <![CDATA[ ## gap> OMPrint( [ 1, 1/2 ] ); ## <OMOBJ xmlns="http://www.openmath.org/OpenMath" version="2.0"> ## <OMA> ## <OMS cd="list1" name="list"/> ## <OMI>1</OMI> ## <OMA> ## <OMS cd="nums1" name="rational"/> ## <OMI>1</OMI> ## <OMI>2</OMI> ## </OMA> ## </OMA> ## </OMOBJ> ## ]]> ## </Example> ## Strings are encoded using <C><OMSTR></C> tags: ## <Example> ## <![CDATA[ ## gap> OMPrint( "This is a string" ); ## <OMOBJ xmlns="http://www.openmath.org/OpenMath" version="2.0"> ## <OMSTR>This is a string</OMSTR> ## </OMOBJ> ## ]]> ## </Example> ## Cyclotomics may be encoded in different ways dependently on their properties: ## <Example> ## <![CDATA[ ## gap> OMPrint( 1-2*E(4) ); ## <OMOBJ xmlns="http://www.openmath.org/OpenMath" version="2.0"> ## <OMA> ## <OMS cd="complex1" name="complex_cartesian"/> ## <OMI>1</OMI> ## <OMI>-2</OMI> ## </OMA> ## </OMOBJ> ## gap> OMPrint(E(3)); ## <OMOBJ xmlns="http://www.openmath.org/OpenMath" version="2.0"> ## <OMA> ## <OMS cd="arith1" name="plus"/> ## <OMA> ## <OMS cd="arith1" name="times"/> ## <OMI>1</OMI> ## <OMA> ## <OMS cd="algnums" name="NthRootOfUnity"/> ## <OMI>3</OMI> ## <OMI>1</OMI> ## </OMA> ## </OMA> ## </OMA> ## </OMOBJ> ## ]]> ## </Example> ## Various encodings may be used for various types of groups: ## <Example> ## <![CDATA[ ## gap> OMPrint( Group( (1,2) ) ); ## <OMOBJ xmlns="http://www.openmath.org/OpenMath" version="2.0"> ## <OMA> ## <OMS cd="permgp1" name="group"/> ## <OMS cd="permutation1" name="right_compose"/> ## <OMA> ## <OMS cd="permut1" name="permutation"/> ## <OMI>2</OMI> ## <OMI>1</OMI> ## </OMA> ## </OMA> ## </OMOBJ> ## gap> OMPrint( Group( [ [ [ 1, 2 ],[ 0, 1 ] ] ] ) ); ## <OMOBJ xmlns="http://www.openmath.org/OpenMath" version="2.0"> ## <OMA> ## <OMS cd="group1" name="group_by_generators"/> ## <OMA> ## <OMS cd="linalg2" name="matrix"/> ## <OMA> ## <OMS cd="linalg2" name="matrixrow"/> ## <OMI>1</OMI> ## <OMI>2</OMI> ## </OMA> ## <OMA> ## <OMS cd="linalg2" name="matrixrow"/> ## <OMI>0</OMI> ## <OMI>1</OMI> ## </OMA> ## </OMA> ## </OMA> ## </OMOBJ> ## gap> OMPrint( FreeGroup( 2 ) ); ## <OMOBJ xmlns="http://www.openmath.org/OpenMath" version="2.0"> ## <OMA> ## <OMS cd="fpgroup1" name="free_groupn"/> ## <OMI>2</OMI> ## </OMA> ## </OMOBJ> ## ]]> ## </Example> ## </Description> ## </ManSection> ## <#/GAPDoc> ## DeclareGlobalFunction("OMPrint"); ########################################################################### ## ## OMString( <obj> ) ........ returns string with <obj> as OpenMath object ## ## <#GAPDoc Label="OMString"> ## <ManSection> ## <Func Name="OMString" Arg="obj" /> ## <Description> ## OMString returns a string with the default XML &OpenMath; ## encoding of &GAP; object <A>obj</A>. ## If used with the <K>noomobj</K> option, then initial and ## final <OMOBJ> tags will be omitted. ## <Example> ## <![CDATA[ ## gap> OMString(42); ## "<OMOBJ xmlns=\"http://www.openmath.org/OpenMath\" version=\"2.0\"> <OMI>42</OMI> </OMOBJ>" ## gap> OMString([1,2]:noomobj); ## "<OMA> <OMS cd=\"list1\" name=\"list\"/> <OMI>1</OMI> <OMI>2</OMI> </OMA>" ## ]]> ## </Example> ## </Description> ## </ManSection> ## <#/GAPDoc> ## DeclareGlobalFunction("OMString"); ########################################################################### ## #F OMWriteLine( <stream>, <list> ) ## ## Auxiliary function for OMPut functions. ## Takes a list of string arguments and outputs them ## to a single line with the correct indentation. ## ## Input : List of arguments to print ## Output: \t ^ OMIndent, arguments ## DeclareGlobalFunction("OMWriteLine"); ########################################################################### ## #F OMPutSymbol( <stream>, <cd>, <name> ) ## ## Input : cd, name as strings ## Output: <OMS cd="<cd>" name="<name>" /> ## DeclareOperation("OMPutSymbol", [ IsOpenMathWriter, IsString, IsString ] ); ########################################################################### ## #F OMPutForeign( <stream>, <encoding>, <string> ) ## ## Input : encoding and string representing the foreighn object ## DeclareOperation("OMPutForeign", [ IsOpenMathWriter, IsString, IsString ] ); ########################################################################### ## #F OMPutVar( <stream>, <name> ) ## ## Input : name as string ## Output: <OMV name="<name>" /> ## DeclareOperation("OMPutVar", [ IsOpenMathWriter, IsObject ] ); ########################################################################### ## #M OMPutApplication( <stream>, <cd>, <name>, <list> ) ## ## Input : cd, name as strings, list as a list ## Output: ## <OMA> ## <OMS cd=<cd> name=<name>/> ## OMPut(<list>[1]) ## OMPut(<list>[2]) ## ... ## </OMA> ## DeclareGlobalFunction("OMPutApplication"); DeclareOperation("OMPutOMA", [ IsOpenMathWriter ] ); DeclareOperation("OMPutOMAWithId", [ IsOpenMathWriter , IsString ] ); DeclareOperation("OMPutEndOMA", [ IsOpenMathWriter ] ); ########################################################################### ## ## Tags for attributions and attribution pairs ## DeclareOperation("OMPutOMATTR", [ IsOpenMathWriter ] ); DeclareOperation("OMPutEndOMATTR", [ IsOpenMathWriter ] ); DeclareOperation("OMPutOMATP", [ IsOpenMathWriter ] ); DeclareOperation("OMPutEndOMATP", [ IsOpenMathWriter ] ); ########################################################################### ## #M OMPutBinding( <stream>, <cd>, <name>, <listbvars>, <object> ) ## ## Input : cd, name, list of bvars, object ## Output: ## <OMBIND> ## <OMS cd=<cd> name=<name>/> ## OMPut(<list>[1]) ## OMPut(<object) ## ... ## </OMBIND> ## #DeclareGlobalFunction("OMPutBinding"); DeclareOperation("OMPutOMBIND", [ IsOpenMathWriter ] ); DeclareOperation("OMPutOMBINDWithId", [ IsOpenMathWriter , IsString ] ); DeclareOperation("OMPutEndOMBIND", [ IsOpenMathWriter ] ); ########################################################################### ## ## Tags for binding vars ## DeclareOperation("OMPutOMBVAR", [ IsOpenMathWriter ] ); DeclareOperation("OMPutEndOMBVAR", [ IsOpenMathWriter ] ); ########################################################################### ## #M OMPutError( <stream>, <cd>, <name>, <list> ) ## ## Input : cd, name as strings, list as a list ## Output: ## <OME> ## <OMS cd=<cd> name=<name>/> ## OMPut(<list>[1]) ## OMPut(<list>[2]) ## ... ## </OME> ## DeclareGlobalFunction("OMPutError"); DeclareOperation("OMPutOME", [ IsOpenMathWriter ] ); DeclareOperation("OMPutEndOME", [ IsOpenMathWriter ] ); DeclareAttribute( "OMReference", IsObject ); DeclareOperation( "OMPutReference", [ IsOpenMathWriter, IsObject ] ); ########################################################################### ## #O OMPutByteArray( <stream>, <bitlist> ) ## ## Put bitlists into byte arrays ## DeclareGlobalFunction("OMPutByteArray"); ########################################################################### ## #O OMPutList(<stream>,<obj> ) ## ## Tries to render this as an OpenMath list ## DeclareOperation("OMPutList", [ IsOpenMathWriter, IsObject ]); # Determines the indentation of the next line to be printed. OMIndent := 0; ########################################################################### # # Declarations for OMPlainString objects # ## <#GAPDoc Label="OMPlainString"> ## <ManSection> ## <Func Name="OMPlainString" Arg="string" /> ## <Description> ## <Ref Func="OMPlainString" /> wraps the string into a &GAP; object of a ## special kind called an &OpenMath; plain string. Internally such object is ## represented as a string, but <Ref Func="OMPutObject" /> threat it in a ## different way: instead of converting it into a <OMSTR> object, an ## &OpenMath; plain string will be plainly substituted into the output (this ## explains its name) without decorating it with <OMSTR> tags. ## <P/> ## It is assumed that &OpenMath; plain string contains valid &OpenMath; code; ## no actual validation is performed during its creation. Such functionality ## may be useful to compose some &OpenMath; code at the &GAP; level to ## communicate it to the other system, in particular, to send there symbols ## which are not supported by &GAP;, for example: ## <Example> ## <![CDATA[ ## gap> s:=OMPlainString("<OMS cd=\"nums1\" name=\"pi\"/>"); ## <OMS cd="nums1" name="pi"/> ## gap> OMPrint(s); ## <OMOBJ xmlns="http://www.openmath.org/OpenMath" version="2.0"> ## <OMS cd="nums1" name="pi"/> ## </OMOBJ> ## ]]> ## </Example> ## ## </Description> ## </ManSection> ## <#/GAPDoc> ## DeclareCategory( "IsOMPlainString", IsObject ); OMPlainStringsFamily := NewFamily( "OMPlainStringsFamily" ); DeclareGlobalFunction ( "OMPlainString" ); DeclareRepresentation( "IsOMPlainStringRep", IsPositionalObjectRep, [ ] ); OMPlainStringDefaultType := NewType( OMPlainStringsFamily, IsOMPlainStringRep and IsOMPlainString ); ########################################################################### #E