Php 将AsciiMath解析为Python表达式

Php 将AsciiMath解析为Python表达式,php,python,sympy,mathjax,asciimath,Php,Python,Sympy,Mathjax,Asciimath,我试图通过JSON将两个函数传递给python脚本,以评估它们的等价性。我遇到的问题是输入是用符号表示的。如果格式与Python表达式的格式一致,那么从字符串解析表达式似乎没有问题。有没有办法将ascimath符号解析成Python可以解释的东西?我一直找不到任何提供这种功能的库 PHP: Python: import sys, json from sympy import * # Load the json data sent from PHP try: data = json.lo

我试图通过JSON将两个函数传递给python脚本,以评估它们的等价性。我遇到的问题是输入是用符号表示的。如果格式与Python表达式的格式一致,那么从字符串解析表达式似乎没有问题。有没有办法将ascimath符号解析成Python可以解释的东西?我一直找不到任何提供这种功能的库

PHP:

Python:

import sys, json
from sympy import *

# Load the json data sent from PHP
try:
    data = json.loads(sys.argv[1])
except:
    sys.exit(1)

x = Symbol('x')

# Convert string inputs to expressions
user_response = sympify(data[0])
correct_answer = sympify(data[1])

# Perform equivalence comparison
result = user_response == correct_answer

# Return result
print json.dumps(result)

当你问这样的问题时,你应该证明这个问题。以下是我认为正在发生的事情

对于一组表达式,
sympify
可以正常工作:

In [144]: sympify('2*x')==sympify('x*2')                                             
Out[144]: True
但对于另一对:

In [145]: sympify('2x')==sympify('x2')                                               
---------------------------------------------------------------------------
SyntaxError                               Traceback (most recent call last)
/usr/local/lib/python3.6/dist-packages/sympy/core/sympify.py in sympify(a, locals, convert_xor, strict, rational, evaluate)
    367         a = a.replace('\n', '')
--> 368         expr = parse_expr(a, local_dict=locals, transformations=transformations, evaluate=evaluate)
    369     except (TokenError, SyntaxError) as exc:
 ...
SympifyError: Sympify of expression 'could not parse '2x'' failed, because of exception being raised:
SyntaxError: invalid syntax (<string>, line 1)
sympify
需要可以在
sympy
环境中计算的字符串

将任意表达式转换为可在Symphy中使用的类型

它说的是任意的,但文档的限制性更强,如前所述

It currently accepts as arguments:
   - any object defined in sympy
   - standard numeric python types: int, long, float, Decimal
   - strings (like "0.09" or "2e-19")
   - booleans, including ``None`` (will leave ``None`` unchanged)
   - lists, sets or tuples containing any of the above
在问题的上下文中,表示使用
x
的表达式,其定义为

x = Symbol('x')
但是那些使用
y
的会有问题

===

sympify
生成一个
sympy
表达式:

In [161]: expr = sympify('2*x')                                                      

In [162]: type(expr)                                                                 
Out[162]: sympy.core.mul.Mul
In [166]: y = Symbol('y')                                                            
In [167]: expr = sympify('2*y')                                                      

In [168]: expr                                                                       
Out[168]: 2⋅y
In [171]: 2*y                                                                        
Out[171]: 42
In [172]: 2*x                                                                        
Out[172]: 2⋅x
然后可以通过各种方式对其进行“评估”。我可以将其描述为“修改的”,但
sympy
强调表达式是不可变的。这些操作都会生成新的表达式或值:

In [163]: expr.subs(x,21)                                                            
Out[163]: 42

In [164]: expr.diff(x)                                                               
Out[164]: 2

In [165]: expr.integrate(x)                                                          
Out[165]: 
 2
x 
===

而且,核心Python解释器无法对此类表达式求值

定义新符号和表达式:

In [161]: expr = sympify('2*x')                                                      

In [162]: type(expr)                                                                 
Out[162]: sympy.core.mul.Mul
In [166]: y = Symbol('y')                                                            
In [167]: expr = sympify('2*y')                                                      

In [168]: expr                                                                       
Out[168]: 2⋅y
In [171]: 2*y                                                                        
Out[171]: 42
In [172]: 2*x                                                                        
Out[172]: 2⋅x
y
重新指定为Python整数不会更改
expr
的值:

In [169]: y = 21                                                                         
In [170]: expr                                                                       
Out[170]: 2⋅y
但它确实允许我们计算一个正则Python表达式:

In [161]: expr = sympify('2*x')                                                      

In [162]: type(expr)                                                                 
Out[162]: sympy.core.mul.Mul
In [166]: y = Symbol('y')                                                            
In [167]: expr = sympify('2*y')                                                      

In [168]: expr                                                                       
Out[168]: 2⋅y
In [171]: 2*y                                                                        
Out[171]: 42
In [172]: 2*x                                                                        
Out[172]: 2⋅x
但是使用
x
符号的相同Python表达式会生成
sympy
表达式:

In [161]: expr = sympify('2*x')                                                      

In [162]: type(expr)                                                                 
Out[162]: sympy.core.mul.Mul
In [166]: y = Symbol('y')                                                            
In [167]: expr = sympify('2*y')                                                      

In [168]: expr                                                                       
Out[168]: 2⋅y
In [171]: 2*y                                                                        
Out[171]: 42
In [172]: 2*x                                                                        
Out[172]: 2⋅x
===

这个
解析
模块具有处理诸如“2x”之类的表达式的方法。至少文件显示:

(同样在
isympy
会话中):

因此,它确实可以处理您的示例,但我对
ascimatch
了解不够,不知道还有多少其他功能


该页面还讨论了一个
LaTeX
parser,

什么是“ASCII数学符号”@user2357112请看:这里有一个python库可以解析AsciiMath:我在谷歌找到它,你尝试了什么?那是AsciiMath,不是“ASCII数学符号”或“ASCII符号”。@user2357112明白了。我已经改正了语言。谢谢你的帮助。你是对的,上面的例子正是问题所在,从这里我们将如何处理这个问题?我已经研究了几天,几乎没有机会想出一个前进的策略。非常感谢您的全面回复。您提供了极好的上下文和示例。我认为这里有足够的东西让我继续前进,尝试不同的输入。