parse_latex解析括号乘法表达式结果不一致问题咨询
parse_latex括号隐式乘法解析不一致问题说明 问题现象
使用parse_latex方法解析LaTeX数学表达式时,括号场景下的隐式乘法解析结果存在不一致:
- 解析
-x(4)时返回-4*x,可以正确识别隐式乘法完成化简 - 解析数学意义完全等价的
-4(x)时返回-x(4),未触发预期的乘法化简
语义差异说明
在Python数学运算语义、通用数学表达式语义下,-x(4)和-4*x 不存在任何语义差异,二者都表示4与x相乘后取负,计算结果完全一致。
出现解析不一致的原因是parse_latex内置的语法判定规则有缺陷:
- 括号前为字母形式的变量时,解析器会默认识别为隐式乘法
- 括号前为纯数字时,解析器会误将*数字(表达式)*的格式判定为函数调用(和
f(x)这类自定义函数传参的语法格式混淆),因此不会触发乘法展开化简逻辑,最终返回错误的类函数调用结构。
现有判分接口的问题
当前实现的数学考试答案校验接口代码如下:
class CheckAnswer(APIView): def post(self, request, format=None): ex_no = request.data.get('ex_no') answer = request.data.get('answer') try: get_question = MathExamTbl.objects.get(ex_no=ex_no) except MathExamTbl.DoesNotExist: return Response({'question': 'invalid'}) parsed_answer = parse_latex(r"{}".format(answer)) correct_answer = parse_latex(r"{}".format(get_question.correct_ans)) if str(answer) == str(get_question.question_body): return Response({"message": "answer not allowed", 'data': str(parsed_answer), 'status': 200, 'error_code': error_codes['not_allowed']}, status=status.HTTP_200_OK) if parsed_answer.simplify(rational=True) == correct_answer.simplify(rational=True): return Response({"message": "correct answer", 'data': str(parsed_answer), 'status': 200, 'error_code': error_codes['ok']}, status=status.HTTP_200_OK) else: return Response({"message": "wrong answer", 'status': 400, 'error_code': error_codes['not_ok']}, status=status.HTTP_200_OK)
这套逻辑直接依赖parse_latex的默认化简结果做等值判断,会受上述解析bug影响,把数学意义完全等价的答案误判为错误,比如学生输入-4(x)时,会被判定为和标准答案-4*x不相等,出现错判。
内容的提问来源于stack exchange,提问作者surya raj
相关产品推荐
相关产品推荐

