1 | initial version |
Maxima's solver (= default Sage solver) solves this system, but Sage is currently unable to translate it : Aftee running :
Vars=var('N p x y c M H W V')
eq0 = N-187 == 0
eq1 = (sqrt((16*c^4*N+24*c^4+c^2*M+c^2-2*c^2*sqrt(24*c^2+M))/(c^4))-8)/16 - x == 0
eq2 = (sqrt((16*c^4*N+24*c^4+c^2*H+c^2+2*c^2*sqrt(24*c^2+H))/(c^4))-8)/16 - x ==0
eq3 = (4*x+2)^2-(2*y-1)^2 - N == 0
eq4 = M*(8*y^2-8*y-1) - (8*W^2-8*W-1) == 0
eq5 = H*(8*y^2-8*y-1) - (8*V^2-8*V-1) == 0
eq6 = (W-V) - (2*y-1) ==0
eq7 = 4*x+1-2*(y-1)-p == 0
eq8 = 1 - c == 0
Sys = [eq0,eq1,eq2,eq3,eq4,eq5,eq6,eq7,eq8]
one can solve the system in Maxima :
sage: %time foo=maxima_calculus("Sol:to_poly_solve(%s, %s);"%tuple(map(lambda u:repr(maxima(u)), (Sys, Vars))))
CPU times: user 2min 42s, sys: 1.05 s, total: 2min 43s
Wall time: 1min 58s
This answer is complex :
sage: maxima_calculus("part(Sol,0);")
%union
It is a set of many solutions. Examine the first :
sage: maxima_calculus("part(Sol,1);")
%if((-%pi/2 < parg(%c2423837)) %and (-%pi/2 < parg(%c2423837+2)) %and (-%pi/2 < parg(-sqrt(%c2423837^2+2*%c2423837+2993))) %and (parg(%c2423837) <= %pi/2) %and (parg(%c2423837+2) <= %pi/2) %and (parg(-sqrt(%c2423837^2+2*%c2423837+2993)) <= %pi/2),[_SAGE_VAR_H = %c2423837^2-24,_SAGE_VAR_M = %c2423837^2+4*%c2423837-20,_SAGE_VAR_N = 187,_SAGE_VAR_V = (%c2423837^2+%c2423837-20)/8,_SAGE_VAR_W = (%c2423837^2+3*%c2423837-18)/8,_SAGE_VAR_c = 1,_SAGE_VAR_p = -(sqrt(%c2423837^2+2*%c2423837+2993)+%c2423837+1)/4,_SAGE_VAR_x = -(sqrt(%c2423837^2+2*%c2423837+2993)+8)/16,_SAGE_VAR_y = (%c2423837+5)/8],%union())
Two parts : a condituon and a solution. The condition :
sage: maxima_calculus("part(Sol,1,1);")
(-%pi/2 < parg(%c2423837)) %and (-%pi/2 < parg(%c2423837+2)) %and (-%pi/2 < parg(-sqrt(%c2423837^2+2*%c2423837+2993))) %and (parg(%c2423837) <= %pi/2) %and (parg(%c2423837+2) <= %pi/2) %and (parg(-sqrt(%c2423837^2+2*%c2423837+2993)) <= %pi/2)
The solution : sage: maxima_calculus("part(Sol,1,2);") [_SAGE_VAR_H = %c2423837^2-24,_SAGE_VAR_M = %c2423837^2+4%c2423837-20,_SAGE_VAR_N = 187,_SAGE_VAR_V = (%c2423837^2+%c2423837-20)/8,_SAGE_VAR_W = (%c2423837^2+3%c2423837-18)/8,_SAGE_VAR_c = 1,_SAGE_VAR_p = -(sqrt(%c2423837^2+2%c2423837+2993)+%c2423837+1)/4,_SAGE_VAR_x = -(sqrt(%c2423837^2+2%c2423837+2993)+8)/16,_SAGE_VAR_y = (%c2423837+5)/8]
This solution can be translated by Sage :
sage: maxima_calculus("part(Sol,1,2);").sage()
[H == c2423837^2 - 24,
M == c2423837^2 + 4*c2423837 - 20,
N == 187,
V == 1/8*c2423837^2 + 1/8*c2423837 - 5/2,
W == 1/8*c2423837^2 + 3/8*c2423837 - 9/4,
c == 1,
p == -1/4*c2423837 - 1/4*sqrt(c2423837^2 + 2*c2423837 + 2993) - 1/4,
x == -1/16*sqrt(c2423837^2 + 2*c2423837 + 2993) - 1/2,
y == 1/8*c2423837 + 5/8]
The solution cannot :
sage: maxima_calculus("part(Sol,1,1);").sage()
---------------------------------------------------------------------------
SyntaxError Traceback (most recent call last)
File /usr/local/sage-10/src/sage/calculus/calculus.py:2403, in symbolic_expression_from_maxima_string(x, equals_sub, maxima)
2402 SRM_parser._callable_constructor().set_names(function_syms)
-> 2403 return SRM_parser.parse_sequence(s)
2404 except SyntaxError:
File /usr/local/sage-10/src/sage/misc/parser.pyx:571, in sage.misc.parser.Parser.parse_sequence()
570
--> 571 cpdef parse_sequence(self, s):
572 """
File /usr/local/sage-10/src/sage/misc/parser.pyx:587, in sage.misc.parser.Parser.parse_sequence()
586 cdef Tokenizer tokens = Tokenizer(s)
--> 587 all = self.p_sequence(tokens)
588 if tokens.next() != EOS:
File /usr/local/sage-10/src/sage/misc/parser.pyx:653, in sage.misc.parser.Parser.p_sequence()
652 elif token == c'(':
--> 653 obj = self.p_tuple(tokens)
654 elif token == EOS:
File /usr/local/sage-10/src/sage/misc/parser.pyx:721, in sage.misc.parser.Parser.p_tuple()
720 tokens.reset(start)
--> 721 return self.p_eqn(tokens)
722
File /usr/local/sage-10/src/sage/misc/parser.pyx:750, in sage.misc.parser.Parser.p_eqn()
749 """
--> 750 lhs = self.p_expr(tokens)
751 cdef int op = tokens.next()
File /usr/local/sage-10/src/sage/misc/parser.pyx:790, in sage.misc.parser.Parser.p_expr()
789 cdef int op
--> 790 operand1 = self.p_term(tokens)
791 op = tokens.next()
File /usr/local/sage-10/src/sage/misc/parser.pyx:824, in sage.misc.parser.Parser.p_term()
823 cdef int op
--> 824 operand1 = self.p_factor(tokens)
825 op = tokens.next()
File /usr/local/sage-10/src/sage/misc/parser.pyx:867, in sage.misc.parser.Parser.p_factor()
866 tokens.backtrack()
--> 867 return self.p_power(tokens)
868
File /usr/local/sage-10/src/sage/misc/parser.pyx:895, in sage.misc.parser.Parser.p_power()
894 """
--> 895 operand1 = self.p_atom(tokens)
896 cdef int token = tokens.next()
File /usr/local/sage-10/src/sage/misc/parser.pyx:962, in sage.misc.parser.Parser.p_atom()
961 if token != c')':
--> 962 self.parse_error(tokens, "Mismatched parentheses")
963 return expr
File /usr/local/sage-10/src/sage/misc/parser.pyx:1040, in sage.misc.parser.Parser.parse_error()
1039 cdef parse_error(self, Tokenizer tokens, msg="Malformed expression"):
-> 1040 raise SyntaxError(msg, tokens.s, tokens.pos)
1041
SyntaxError: Mismatched parentheses
During handling of the above exception, another exception occurred:
TypeError Traceback (most recent call last)
Cell In [74], line 1
----> 1 maxima_calculus("part(Sol,1,1);").sage()
File /usr/local/sage-10/src/sage/interfaces/interface.py:1121, in InterfaceElement.sage(self, *args, **kwds)
1102 def sage(self, *args, **kwds):
1103 """
1104 Attempt to return a Sage version of this object.
1105
(...)
1119 [0 0]
1120 """
-> 1121 return self._sage_(*args, **kwds)
File /usr/local/sage-10/src/sage/interfaces/maxima_abstract.py:1254, in MaximaAbstractElement._sage_(self)
1199 """
1200 Attempt to make a native Sage object out of this Maxima object.
1201 This is useful for automatic coercions in addition to other
(...)
1251 (True, False)
1252 """
1253 import sage.calculus.calculus as calculus
-> 1254 return calculus.symbolic_expression_from_maxima_string(self.name(),
1255 maxima=self.parent())
File /usr/local/sage-10/src/sage/calculus/calculus.py:2405, in symbolic_expression_from_maxima_string(x, equals_sub, maxima)
2403 return SRM_parser.parse_sequence(s)
2404 except SyntaxError:
-> 2405 raise TypeError("unable to make sense of Maxima expression '%s' in Sage" % s)
2406 finally:
2407 is_simplified = False
TypeError: unable to make sense of Maxima expression '(-pi/2 < parg(c2423837)) and (-pi/2 < parg(c2423837+2)) and (-pi/2 < parg(-sqrt(c2423837^2+2*c2423837+2993))) and (parg(c2423837) <= pi/2) and (parg(c2423837+2) <= pi/2) and (parg(-sqrt(c2423837^2+2*c2423837+2993)) <= pi/2)' in Sage
One nan note that the elements of the condition can be translated :
sage: maxima_calculus("length(part(Sol,1,1));")
6
sage: [maxima_calculus("part(Sol,1,1,%d);"%u).sage() for u in (1..6)]
[-1/2*pi < parg(c2423837),
-1/2*pi < parg(c2423837 + 2),
-1/2*pi < parg(-sqrt(c2423837^2 + 2*c2423837 + 2993)),
parg(c2423837) <= 1/2*pi,
parg(c2423837 + 2) <= 1/2*pi,
parg(-sqrt(c2423837^2 + 2*c2423837 + 2993)) <= 1/2*pi]
but that the logical expressuibn using Maxima's and
cannot :
sage: maxima_calculus("x>0 and y<1")
x > 0 and y < 1
sage: maxima_calculus("x>0 and y<1").sage()
---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
File /usr/local/sage-10/src/sage/misc/parser.pyx:1092, in sage.misc.parser.LookupNameMaker.__call__()
1091 try:
-> 1092 return self.names[name]
1093 except KeyError:
KeyError: 'and'
During handling of the above exception, another exception occurred:
KeyError Traceback (most recent call last)
File /usr/local/sage-10/src/sage/calculus/calculus.py:2494, in _find_var(name, interface)
2493 try:
-> 2494 return SR(sage.all.__dict__[name])
2495 except (KeyError, TypeError):
KeyError: 'and'
During handling of the above exception, another exception occurred:
ValueError Traceback (most recent call last)
Cell In [95], line 1
----> 1 maxima_calculus("x>0 and y<1").sage()
File /usr/local/sage-10/src/sage/interfaces/interface.py:1121, in InterfaceElement.sage(self, *args, **kwds)
1102 def sage(self, *args, **kwds):
1103 """
1104 Attempt to return a Sage version of this object.
1105
(...)
1119 [0 0]
1120 """
-> 1121 return self._sage_(*args, **kwds)
File /usr/local/sage-10/src/sage/interfaces/maxima_abstract.py:1254, in MaximaAbstractElement._sage_(self)
1199 """
1200 Attempt to make a native Sage object out of this Maxima object.
1201 This is useful for automatic coercions in addition to other
(...)
1251 (True, False)
1252 """
1253 import sage.calculus.calculus as calculus
-> 1254 return calculus.symbolic_expression_from_maxima_string(self.name(),
1255 maxima=self.parent())
File /usr/local/sage-10/src/sage/calculus/calculus.py:2403, in symbolic_expression_from_maxima_string(x, equals_sub, maxima)
2401 SRM_parser._variable_constructor().set_names(var_syms)
2402 SRM_parser._callable_constructor().set_names(function_syms)
-> 2403 return SRM_parser.parse_sequence(s)
2404 except SyntaxError:
2405 raise TypeError("unable to make sense of Maxima expression '%s' in Sage" % s)
File /usr/local/sage-10/src/sage/misc/parser.pyx:571, in sage.misc.parser.Parser.parse_sequence()
569 return expr
570
--> 571 cpdef parse_sequence(self, s):
572 """
573 Parse a (possibly nested) set of lists and tuples.
File /usr/local/sage-10/src/sage/misc/parser.pyx:587, in sage.misc.parser.Parser.parse_sequence()
585 """
586 cdef Tokenizer tokens = Tokenizer(s)
--> 587 all = self.p_sequence(tokens)
588 if tokens.next() != EOS:
589 self.parse_error(tokens)
File /usr/local/sage-10/src/sage/misc/parser.pyx:660, in sage.misc.parser.Parser.p_sequence()
658 return all
659 else:
--> 660 obj = self.p_eqn(tokens)
661 PyList_Append(all, obj)
662 token = tokens.next()
File /usr/local/sage-10/src/sage/misc/parser.pyx:761, in sage.misc.parser.Parser.p_eqn()
759 return lhs <= self.p_expr(tokens)
760 elif op == c'>':
--> 761 return lhs > self.p_expr(tokens)
762 elif op == GREATER_EQ:
763 return lhs >= self.p_expr(tokens)
File /usr/local/sage-10/src/sage/misc/parser.pyx:790, in sage.misc.parser.Parser.p_expr()
788 # Note: this is left-recursive, so we can't just recurse
789 cdef int op
--> 790 operand1 = self.p_term(tokens)
791 op = tokens.next()
792 while op == c'+' or op == c'-':
File /usr/local/sage-10/src/sage/misc/parser.pyx:830, in sage.misc.parser.Parser.p_term()
828 tokens.backtrack()
829 while op == c'*' or op == c'/':
--> 830 operand2 = self.p_factor(tokens)
831 if op == c'*':
832 operand1 = operand1 * operand2
File /usr/local/sage-10/src/sage/misc/parser.pyx:867, in sage.misc.parser.Parser.p_factor()
865 else:
866 tokens.backtrack()
--> 867 return self.p_power(tokens)
868
869 # power ::= (atom | atom!) ^ factor | atom | atom!
File /usr/local/sage-10/src/sage/misc/parser.pyx:895, in sage.misc.parser.Parser.p_power()
893
894 """
--> 895 operand1 = self.p_atom(tokens)
896 cdef int token = tokens.next()
897 if token == c'^':
File /usr/local/sage-10/src/sage/misc/parser.pyx:957, in sage.misc.parser.Parser.p_atom()
955 else:
956 tokens.backtrack()
--> 957 return self.variable_constructor(name)
958 elif token == c'(':
959 expr = self.p_expr(tokens)
File /usr/local/sage-10/src/sage/misc/parser.pyx:1095, in sage.misc.parser.LookupNameMaker.__call__()
1093 except KeyError:
1094 if self.fallback is not None:
-> 1095 return self.fallback(name)
1096 raise NameError(f"Unknown variable: '{name}'")
File /usr/local/sage-10/src/sage/calculus/calculus.py:2597, in <lambda>(x)
2592 parser._callable_constructor().set_names({k[0]: v for k, v in syms.items()
2593 if _is_function(v)})
2594 return parse_func(s)
-> 2597 parser_make_Mvar = LookupNameMaker({}, fallback=lambda x: _find_var(x, interface='maxima'))
2599 SRM_parser = Parser(make_int=lambda x: SR(Integer(x)),
2600 make_float=lambda x: SR(RealDoubleElement(x)),
2601 make_var=parser_make_Mvar,
2602 make_function=parser_make_function)
2604 SR_parser_giac = Parser(make_int=lambda x: SR(Integer(x)),
2605 make_float=lambda x: SR(create_RealNumber(x)),
2606 make_var=LookupNameMaker({}, fallback=lambda x: _find_var(x, interface='giac')),
2607 make_function=parser_make_function)
File /usr/local/sage-10/src/sage/calculus/calculus.py:2496, in _find_var(name, interface)
2494 return SR(sage.all.__dict__[name])
2495 except (KeyError, TypeError):
-> 2496 return var(name)
File /usr/local/sage-10/src/sage/symbolic/ring.pyx:1358, in sage.symbolic.ring.var()
1356 ValueError: The name "3" is not a valid Python identifier.
1357 """
-> 1358 return SR.var(name, **kwds)
1359
1360
File /usr/local/sage-10/src/sage/symbolic/ring.pyx:889, in sage.symbolic.ring.SymbolicRing.var()
887 for s in names_list:
888 if not isidentifier(s):
--> 889 raise ValueError(f'The name "{s}" is not a valid Python identifier.')
890 # warn on bad symbol names, but only once
891 # symbol... names are temporary variables created with
ValueError: The name "and" is not a valid Python identifier.
This is not a new problem : Sage does not (yet) have logical functions : these are not difficult toimplement, but intterfacing such expressions with Maxima turned out more difficult than initially thought.
Contributions are welcome...
2 | No.2 Revision |
Maxima's solver (= default (which Sage solver) defaults to) solves this system, but Sage is currently unable to translate it : Aftee running :it.
After running:
Vars=var('N p x y c M H W V')
eq0 = N-187 == 0
eq1 = (sqrt((16*c^4*N+24*c^4+c^2*M+c^2-2*c^2*sqrt(24*c^2+M))/(c^4))-8)/16 - x == 0
eq2 = (sqrt((16*c^4*N+24*c^4+c^2*H+c^2+2*c^2*sqrt(24*c^2+H))/(c^4))-8)/16 - x ==0
eq3 = (4*x+2)^2-(2*y-1)^2 - N == 0
eq4 = M*(8*y^2-8*y-1) - (8*W^2-8*W-1) == 0
eq5 = H*(8*y^2-8*y-1) - (8*V^2-8*V-1) == 0
eq6 = (W-V) - (2*y-1) ==0
eq7 = 4*x+1-2*(y-1)-p == 0
eq8 = 1 - c == 0
Sys = [eq0,eq1,eq2,eq3,eq4,eq5,eq6,eq7,eq8]
one can solve the system in Maxima :
sage: %time foo=maxima_calculus("Sol:to_poly_solve(%s, %s);"%tuple(map(lambda u:repr(maxima(u)), (Sys, Vars))))
CPU times: user 2min 42s, sys: 1.05 s, total: 2min 43s
Wall time: 1min 58s
This answer is complex :complex:
sage: maxima_calculus("part(Sol,0);")
%union
It is a set of many solutions. Examine the first :first:
sage: maxima_calculus("part(Sol,1);")
%if((-%pi/2 < parg(%c2423837)) %and (-%pi/2 < parg(%c2423837+2)) %and (-%pi/2 < parg(-sqrt(%c2423837^2+2*%c2423837+2993))) %and (parg(%c2423837) <= %pi/2) %and (parg(%c2423837+2) <= %pi/2) %and (parg(-sqrt(%c2423837^2+2*%c2423837+2993)) <= %pi/2),[_SAGE_VAR_H = %c2423837^2-24,_SAGE_VAR_M = %c2423837^2+4*%c2423837-20,_SAGE_VAR_N = 187,_SAGE_VAR_V = (%c2423837^2+%c2423837-20)/8,_SAGE_VAR_W = (%c2423837^2+3*%c2423837-18)/8,_SAGE_VAR_c = 1,_SAGE_VAR_p = -(sqrt(%c2423837^2+2*%c2423837+2993)+%c2423837+1)/4,_SAGE_VAR_x = -(sqrt(%c2423837^2+2*%c2423837+2993)+8)/16,_SAGE_VAR_y = (%c2423837+5)/8],%union())
Two parts : parts: a condituon condition and a solution. solution.
The condition :condition:
sage: maxima_calculus("part(Sol,1,1);")
(-%pi/2 < parg(%c2423837)) %and (-%pi/2 < parg(%c2423837+2)) %and (-%pi/2 < parg(-sqrt(%c2423837^2+2*%c2423837+2993))) %and (parg(%c2423837) <= %pi/2) %and (parg(%c2423837+2) <= %pi/2) %and (parg(-sqrt(%c2423837^2+2*%c2423837+2993)) <= %pi/2)
The solution :
solution:
sage: maxima_calculus("part(Sol,1,2);")
[_SAGE_VAR_H = %c2423837^2-24,_SAGE_VAR_M = %c2423837^2+4%c2423837-20,_SAGE_VAR_N %c2423837^2+4*%c2423837-20,_SAGE_VAR_N = 187,_SAGE_VAR_V = (%c2423837^2+%c2423837-20)/8,_SAGE_VAR_W = (%c2423837^2+3%c2423837-18)/8,_SAGE_VAR_c (%c2423837^2+3*%c2423837-18)/8,_SAGE_VAR_c = 1,_SAGE_VAR_p = -(sqrt(%c2423837^2+2%c2423837+2993)+%c2423837+1)/4,_SAGE_VAR_x = -(sqrt(%c2423837^2+2%c2423837+2993)+8)/16,_SAGE_VAR_y = (%c2423837+5)/8]-(sqrt(%c2423837^2+2*%c2423837+2993)+%c2423837+1)/4,_SAGE_VAR_x = -(sqrt(%c2423837^2+2*%c2423837+2993)+8)/16,_SAGE_VAR_y = (%c2423837+5)/8]
This solution can be translated by Sage : Sage:
sage: maxima_calculus("part(Sol,1,2);").sage()
[H == c2423837^2 - 24,
M == c2423837^2 + 4*c2423837 - 20,
N == 187,
V == 1/8*c2423837^2 + 1/8*c2423837 - 5/2,
W == 1/8*c2423837^2 + 3/8*c2423837 - 9/4,
c == 1,
p == -1/4*c2423837 - 1/4*sqrt(c2423837^2 + 2*c2423837 + 2993) - 1/4,
x == -1/16*sqrt(c2423837^2 + 2*c2423837 + 2993) - 1/2,
y == 1/8*c2423837 + 5/8]
The solution condition cannot cannot:
sage: maxima_calculus("part(Sol,1,1);").sage()
---------------------------------------------------------------------------
SyntaxError Traceback (most recent call last)
File /usr/local/sage-10/src/sage/calculus/calculus.py:2403, in symbolic_expression_from_maxima_string(x, equals_sub, maxima)
2402 SRM_parser._callable_constructor().set_names(function_syms)
-> 2403 return SRM_parser.parse_sequence(s)
2404 except SyntaxError:
File /usr/local/sage-10/src/sage/misc/parser.pyx:571, in sage.misc.parser.Parser.parse_sequence()
570
--> 571 cpdef parse_sequence(self, s):
572 """
File /usr/local/sage-10/src/sage/misc/parser.pyx:587, in sage.misc.parser.Parser.parse_sequence()
586 cdef Tokenizer tokens = Tokenizer(s)
--> 587 all = self.p_sequence(tokens)
588 if tokens.next() != EOS:
File /usr/local/sage-10/src/sage/misc/parser.pyx:653, in sage.misc.parser.Parser.p_sequence()
652 elif token == c'(':
--> 653 obj = self.p_tuple(tokens)
654 elif token == EOS:
File /usr/local/sage-10/src/sage/misc/parser.pyx:721, in sage.misc.parser.Parser.p_tuple()
720 tokens.reset(start)
--> 721 return self.p_eqn(tokens)
722
File /usr/local/sage-10/src/sage/misc/parser.pyx:750, in sage.misc.parser.Parser.p_eqn()
749 """
--> 750 lhs = self.p_expr(tokens)
751 cdef int op = tokens.next()
File /usr/local/sage-10/src/sage/misc/parser.pyx:790, in sage.misc.parser.Parser.p_expr()
789 cdef int op
--> 790 operand1 = self.p_term(tokens)
791 op = tokens.next()
File /usr/local/sage-10/src/sage/misc/parser.pyx:824, in sage.misc.parser.Parser.p_term()
823 cdef int op
--> 824 operand1 = self.p_factor(tokens)
825 op = tokens.next()
File /usr/local/sage-10/src/sage/misc/parser.pyx:867, in sage.misc.parser.Parser.p_factor()
866 tokens.backtrack()
--> 867 return self.p_power(tokens)
868
File /usr/local/sage-10/src/sage/misc/parser.pyx:895, in sage.misc.parser.Parser.p_power()
894 """
--> 895 operand1 = self.p_atom(tokens)
896 cdef int token = tokens.next()
File /usr/local/sage-10/src/sage/misc/parser.pyx:962, in sage.misc.parser.Parser.p_atom()
961 if token != c')':
--> 962 self.parse_error(tokens, "Mismatched parentheses")
963 return expr
File /usr/local/sage-10/src/sage/misc/parser.pyx:1040, in sage.misc.parser.Parser.parse_error()
1039 cdef parse_error(self, Tokenizer tokens, msg="Malformed expression"):
-> 1040 raise SyntaxError(msg, tokens.s, tokens.pos)
1041
SyntaxError: Mismatched parentheses
During handling of the above exception, another exception occurred:
TypeError Traceback (most recent call last)
Cell In [74], line 1
----> 1 maxima_calculus("part(Sol,1,1);").sage()
File /usr/local/sage-10/src/sage/interfaces/interface.py:1121, in InterfaceElement.sage(self, *args, **kwds)
1102 def sage(self, *args, **kwds):
1103 """
1104 Attempt to return a Sage version of this object.
1105
(...)
1119 [0 0]
1120 """
-> 1121 return self._sage_(*args, **kwds)
File /usr/local/sage-10/src/sage/interfaces/maxima_abstract.py:1254, in MaximaAbstractElement._sage_(self)
1199 """
1200 Attempt to make a native Sage object out of this Maxima object.
1201 This is useful for automatic coercions in addition to other
(...)
1251 (True, False)
1252 """
1253 import sage.calculus.calculus as calculus
-> 1254 return calculus.symbolic_expression_from_maxima_string(self.name(),
1255 maxima=self.parent())
File /usr/local/sage-10/src/sage/calculus/calculus.py:2405, in symbolic_expression_from_maxima_string(x, equals_sub, maxima)
2403 return SRM_parser.parse_sequence(s)
2404 except SyntaxError:
-> 2405 raise TypeError("unable to make sense of Maxima expression '%s' in Sage" % s)
2406 finally:
2407 is_simplified = False
TypeError: unable to make sense of Maxima expression '(-pi/2 < parg(c2423837)) and (-pi/2 < parg(c2423837+2)) and (-pi/2 < parg(-sqrt(c2423837^2+2*c2423837+2993))) and (parg(c2423837) <= pi/2) and (parg(c2423837+2) <= pi/2) and (parg(-sqrt(c2423837^2+2*c2423837+2993)) <= pi/2)' in Sage
One nan note Note that the elements of the condition can be translated :translated:
sage: maxima_calculus("length(part(Sol,1,1));")
6
sage: [maxima_calculus("part(Sol,1,1,%d);"%u).sage() for u in (1..6)]
[-1/2*pi < parg(c2423837),
-1/2*pi < parg(c2423837 + 2),
-1/2*pi < parg(-sqrt(c2423837^2 + 2*c2423837 + 2993)),
parg(c2423837) <= 1/2*pi,
parg(c2423837 + 2) <= 1/2*pi,
parg(-sqrt(c2423837^2 + 2*c2423837 + 2993)) <= 1/2*pi]
but that the logical expressuibn expression using Maxima's "and
" cannot cannot:
sage: maxima_calculus("x>0 and y<1")
x > 0 and y < 1
sage: maxima_calculus("x>0 and y<1").sage()
---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
File /usr/local/sage-10/src/sage/misc/parser.pyx:1092, in sage.misc.parser.LookupNameMaker.__call__()
1091 try:
-> 1092 return self.names[name]
1093 except KeyError:
KeyError: 'and'
During handling of the above exception, another exception occurred:
KeyError Traceback (most recent call last)
File /usr/local/sage-10/src/sage/calculus/calculus.py:2494, in _find_var(name, interface)
2493 try:
-> 2494 return SR(sage.all.__dict__[name])
2495 except (KeyError, TypeError):
KeyError: 'and'
During handling of the above exception, another exception occurred:
ValueError Traceback (most recent call last)
Cell In [95], line 1
----> 1 maxima_calculus("x>0 and y<1").sage()
File /usr/local/sage-10/src/sage/interfaces/interface.py:1121, in InterfaceElement.sage(self, *args, **kwds)
1102 def sage(self, *args, **kwds):
1103 """
1104 Attempt to return a Sage version of this object.
1105
(...)
1119 [0 0]
1120 """
-> 1121 return self._sage_(*args, **kwds)
File /usr/local/sage-10/src/sage/interfaces/maxima_abstract.py:1254, in MaximaAbstractElement._sage_(self)
1199 """
1200 Attempt to make a native Sage object out of this Maxima object.
1201 This is useful for automatic coercions in addition to other
(...)
1251 (True, False)
1252 """
1253 import sage.calculus.calculus as calculus
-> 1254 return calculus.symbolic_expression_from_maxima_string(self.name(),
1255 maxima=self.parent())
File /usr/local/sage-10/src/sage/calculus/calculus.py:2403, in symbolic_expression_from_maxima_string(x, equals_sub, maxima)
2401 SRM_parser._variable_constructor().set_names(var_syms)
2402 SRM_parser._callable_constructor().set_names(function_syms)
-> 2403 return SRM_parser.parse_sequence(s)
2404 except SyntaxError:
2405 raise TypeError("unable to make sense of Maxima expression '%s' in Sage" % s)
File /usr/local/sage-10/src/sage/misc/parser.pyx:571, in sage.misc.parser.Parser.parse_sequence()
569 return expr
570
--> 571 cpdef parse_sequence(self, s):
572 """
573 Parse a (possibly nested) set of lists and tuples.
File /usr/local/sage-10/src/sage/misc/parser.pyx:587, in sage.misc.parser.Parser.parse_sequence()
585 """
586 cdef Tokenizer tokens = Tokenizer(s)
--> 587 all = self.p_sequence(tokens)
588 if tokens.next() != EOS:
589 self.parse_error(tokens)
File /usr/local/sage-10/src/sage/misc/parser.pyx:660, in sage.misc.parser.Parser.p_sequence()
658 return all
659 else:
--> 660 obj = self.p_eqn(tokens)
661 PyList_Append(all, obj)
662 token = tokens.next()
File /usr/local/sage-10/src/sage/misc/parser.pyx:761, in sage.misc.parser.Parser.p_eqn()
759 return lhs <= self.p_expr(tokens)
760 elif op == c'>':
--> 761 return lhs > self.p_expr(tokens)
762 elif op == GREATER_EQ:
763 return lhs >= self.p_expr(tokens)
File /usr/local/sage-10/src/sage/misc/parser.pyx:790, in sage.misc.parser.Parser.p_expr()
788 # Note: this is left-recursive, so we can't just recurse
789 cdef int op
--> 790 operand1 = self.p_term(tokens)
791 op = tokens.next()
792 while op == c'+' or op == c'-':
File /usr/local/sage-10/src/sage/misc/parser.pyx:830, in sage.misc.parser.Parser.p_term()
828 tokens.backtrack()
829 while op == c'*' or op == c'/':
--> 830 operand2 = self.p_factor(tokens)
831 if op == c'*':
832 operand1 = operand1 * operand2
File /usr/local/sage-10/src/sage/misc/parser.pyx:867, in sage.misc.parser.Parser.p_factor()
865 else:
866 tokens.backtrack()
--> 867 return self.p_power(tokens)
868
869 # power ::= (atom | atom!) ^ factor | atom | atom!
File /usr/local/sage-10/src/sage/misc/parser.pyx:895, in sage.misc.parser.Parser.p_power()
893
894 """
--> 895 operand1 = self.p_atom(tokens)
896 cdef int token = tokens.next()
897 if token == c'^':
File /usr/local/sage-10/src/sage/misc/parser.pyx:957, in sage.misc.parser.Parser.p_atom()
955 else:
956 tokens.backtrack()
--> 957 return self.variable_constructor(name)
958 elif token == c'(':
959 expr = self.p_expr(tokens)
File /usr/local/sage-10/src/sage/misc/parser.pyx:1095, in sage.misc.parser.LookupNameMaker.__call__()
1093 except KeyError:
1094 if self.fallback is not None:
-> 1095 return self.fallback(name)
1096 raise NameError(f"Unknown variable: '{name}'")
File /usr/local/sage-10/src/sage/calculus/calculus.py:2597, in <lambda>(x)
2592 parser._callable_constructor().set_names({k[0]: v for k, v in syms.items()
2593 if _is_function(v)})
2594 return parse_func(s)
-> 2597 parser_make_Mvar = LookupNameMaker({}, fallback=lambda x: _find_var(x, interface='maxima'))
2599 SRM_parser = Parser(make_int=lambda x: SR(Integer(x)),
2600 make_float=lambda x: SR(RealDoubleElement(x)),
2601 make_var=parser_make_Mvar,
2602 make_function=parser_make_function)
2604 SR_parser_giac = Parser(make_int=lambda x: SR(Integer(x)),
2605 make_float=lambda x: SR(create_RealNumber(x)),
2606 make_var=LookupNameMaker({}, fallback=lambda x: _find_var(x, interface='giac')),
2607 make_function=parser_make_function)
File /usr/local/sage-10/src/sage/calculus/calculus.py:2496, in _find_var(name, interface)
2494 return SR(sage.all.__dict__[name])
2495 except (KeyError, TypeError):
-> 2496 return var(name)
File /usr/local/sage-10/src/sage/symbolic/ring.pyx:1358, in sage.symbolic.ring.var()
1356 ValueError: The name "3" is not a valid Python identifier.
1357 """
-> 1358 return SR.var(name, **kwds)
1359
1360
File /usr/local/sage-10/src/sage/symbolic/ring.pyx:889, in sage.symbolic.ring.SymbolicRing.var()
887 for s in names_list:
888 if not isidentifier(s):
--> 889 raise ValueError(f'The name "{s}" is not a valid Python identifier.')
890 # warn on bad symbol names, but only once
891 # symbol... names are temporary variables created with
ValueError: The name "and" is not a valid Python identifier.
This is not a new problem : problem: Sage does not (yet) have logical functions : functions: these are not difficult toimplement, to implement, but intterfacing interfacing such expressions with Maxima turned out more difficult than initially thought.
Contributions are welcome...