% Description: This module defines all functions necessary to pass from the % intermediate representation to OpenMath. They print out the % OpenMath expression on the screen. % % Date: 2 May 2000 % % Author: Luis Alvarez Sobreviela % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % The following tables are used by the functions in this file % % in order to map properly intermediate representation tokens % % to OpenMath elements and symbols. % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% mmltypes!*:= '((complex_cartesian . (complex_cartesian_type)) (complex_polar . (complex_polar_type)) (constant . (constant_type)) (integer . (integer_type)) (list . (list_type)) (matrix . (matrix_type)) (rational . (rational_type)) (real . (real_type)) (set . (set_type))); % Maps MathML attribute values % to OpenMath symbols interval!*:= '((open . (interval_oo)) (closed . (interval_cc)) (open!-closed . (interval_oc)) (closed!-open . (interval_co))); % Maps MathML constants to OpenMath constant symbols % and their CDs. constantsOM!*:= '((!&ImaginaryI!; . (nums1 i)) (!&ExponentialE!; . (nums1 e)) (!&pi!; . (nums1 pi)) (!&NotANumber!; . (nums1 nan)) (!&gamma!; . (nums1 gamma)) (!&infin!; . (nums1 infinity)) (!&false!; . (logic1 false)) (!&true!; . (logic1 true))); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % The function ir2om starts the process of translating intermediate % % representation into OpenMath IR->OpenMath % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% symbolic procedure ir2om( elem ); begin; ind:=2; indent:=0; printout(""); indent!* t; objectOM( elem ); indent!* nil; printout(""); end; symbolic procedure objectOM(elem); begin; if PAIRP elem then << if (aa:=assoc(car elem, ir2om_mml!*)) then << apply(cadddr aa, list elem) >> else fnOM(elem); >> else basicOM(elem); end; symbolic procedure strOM(elem); begin; printout " ";princ cadr elem; princ " "; end; % Recieves an element which is not a list % and prints out OpenMath accordingly. symbolic procedure basicOM(elem); begin; if NUMBERP elem then << if FIXP elem then integerOM(elem); if FLOATP elem then floatOM(elem) >> else if IDP elem then variableOM(elem); end; % Prints out integers symbolic procedure integerOM(elem); begin; printout(" "); princ elem; princ " " end; % Prints out decimal floats symbolic procedure floatOM(elem); begin; printout(""; end; % Prints out OpenMath variables symbolic procedure variableOM(elem); begin scalar aa; aa:=assoc(intern elem, constantsOM!*); if aa neq nil then << printout(""; >> else << if elem neq nil then << printout(""; >> >>; end; % Prints out all OpenMath symbols of 1, 2, or more arguments % constructed by application. symbolic procedure printOM(elem); begin scalar cd, name; name:=car elem; if name='var then name:='variance; cd := assoc(name, valid_om!*); if cd neq nil then cd:=cadr cd; % Special cases multiset and unary_minus. % We manipulate the IR a little bit... if cadr elem neq nil then << if cadr elem = 'multiset then cd:=cadr elem; >>; if name = 'minus AND length elem = 3 then name:='unary_minus; printout ""; indent:=indent+2; printout ""; multiOM(cddr elem); indent:=indent-2; printout ""; end; symbolic procedure multiOM(elem); begin; if ((length elem)=1) then objectOM( car elem ) else <> end; % Prints out the OpenMath matrix_selector or % vector_selector symbols symbolic procedure selectOM(elem); begin scalar name; if caaddr elem ='matrix then name:='matrix_selector else name:='vector_selector; printout ""; indent:=indent+2; printout ""; multiOM(cdddr elem); objectOM caddr elem; indent:=indent-2; printout ""; end; % Prints out elements which are % containers in MathML. symbolic procedure containerOM(elem); begin scalar cd, att, name; att:=cadr elem; name:=car elem; printout ""; indent!* t; if name = 'vectorml then name:= 'vector; cd := cadr assoc(name, valid_om!*); if car elem = 'set and PAIRP att then << if intern cadr car att='multiset then cd:='multiset1; name:='multiset; >>; if car elem = 'vectorml then name:= "vector"; if car elem = 'vectorml then elem:= 'vector . cdr elem; printout ""; multiOM(cddr elem); indent!* nil; printout ""; end; % Prints out OpenMath intervals symbolic procedure intervalOM(elem); begin scalar att, name, cd; att:=cadr elem; name:=car elem; if name = 'lowupperlimit then <>; cd := cadr assoc(name, valid_om!*); if att neq nil then << aa:=assoc(intern cadr car att, interval!*); name:=cadr aa; >>; printout ""; indent!* t; printout ""; multiOM(cddr elem); indent!* nil; printout ""; end; % Prints matrices according to the definition % in CD linalg1 symbolic procedure matrixOM(elem); begin; printout ""; indent!* t; printout ""; matrixrowOM(cadddr elem); indent!* nil; printout ""; end; symbolic procedure matrixrowOM(elem); begin; if elem neq nil then << printout ""; indent!* t; printout ""; multiOM(car elem); indent!* nil; printout ""; matrixrowOM cdr elem; >>; end; % Prints out variables which posses % an attribute symbolic procedure ciOM(elem); begin; printout ""; indent!* t; printout ""; indent!* t; printout ""; printout ""; indent!* nil; printout ""; objectOM(caddr elem); indent!* nil; printout ""; end; % Prints out constants such as pi, gamma etc... symbolic procedure numOM(elem); begin; printout ""; indent!* t; printout ""; objectOM cadr elem; if car elem='based_integer then strOM cadr caddr elem else objectOM caddr elem; indent!* nil; printout ""; end; symbolic procedure fnOM(elem); begin; printout ""; indent!* t; printout ""; indent!* t; printout ""; indent!* t; printout ""; printout ""; indent!* nil; printout ""; objectOM car elem; indent!* nil; printout ""; multiOM(cddr elem); indent!* nil; printout ""; end; % Prints out partial differentiation expressions symbolic procedure partialdiffOM(elem); begin scalar cd, var, fun, int, name; cd := assoc(car elem, valid_om!*); if cd neq nil then cd:=cadr cd; name:=car elem; var:=cdr reverse cddr elem; fun:=car reverse elem; if length var = 1 then symbolsOM('diff . cdr elem); end; % Prints out elements such as sum, prod, diff and int. symbolic procedure symbolsOM(elem); begin scalar cd, var, fun, int, name; cd := assoc(car elem, valid_om!*); if cd neq nil then cd:=cadr cd; name:=car elem; var:=caddr elem; fun:=car reverse elem; if name neq 'diff then int:=cadddr elem; % This error states that a will not be translated to MathML if int neq nil then if car int = 'condition then errorML(" tag not supported in MathML", 1); printout ""; indent!* t; if int neq nil AND name='int then name:='defint; printout ""; if int neq nil then objectOM int; lambdaOM ('lambda . nil . var . list fun); indent!* nil; printout ""; end; % Prints out lambda expressions symbolic procedure lambdaOM(elem); begin scalar var, fun; var:= cadr caddr elem; fun:=car reverse elem; printout ""; indent!* t; printout ""; printout ""; indent!* t; objectOM var; indent!* nil; printout ""; objectOM fun; indent!* nil; printout ""; end; % Does not work... symbolic procedure semanticOM(elem); begin scalar sem; printout ""; indent!* t; sem:=cadr cadr elem; list2string sem; multiOM cddr elem; indent!* nil; printout ""; end; % Prints roots symbolic procedure rootOM(elem); begin; printout ""; indent!* t; objectOM car reverse elem; objectOM cadr caddr elem; indent!* nil; printout ""; end; % Prints out limit expressions symbolic procedure limitOM(elem); begin scalar limit, fun, var, tendsto; var:=caddr elem; limit:=cadddr elem; fun:=car reverse elem; printout ""; indent!* t; printout ""; if car limit = 'lowlimit then << objectOM cadr limit; printout "" >>; if car limit = 'condition then << objectOM car reverse cadr limit; tendsto:= cadr car cadr cadr limit; printout "" >>; lambdaOM ('limit . nil . var . list fun); indent!* nil; printout ""; end; % Prints out OpenMath quantifiers symbolic procedure quantOM(elem); begin; if cadr reverse elem neq nil then errorML("condition tag not supported in MathML ", 2); printout ""; indent!* t; printout ""; printout ""; indent!* t; bvarOM cddr elem; indent!* nil; printout ""; objectOM car reverse elem; indent!* nil; printout ""; end; symbolic procedure bvarOM(elem); begin; if PAIRP car elem then if car car elem = 'bvar then <>; end; % This is the function the user types to % translate MathML to OpenMath symbolic procedure mml2om(); begin; a:=mml2ir(); terpri!* t; princ "Intermediate representation: "; terpri!* t; print a; ir2om a; end; lisp operator mml2om;