|
|
2 weken geleden | |
|---|---|---|
| .. | ||
| src | 2 weken geleden | |
| README.md | 2 weken geleden | |
| architecture.png | 2 weken geleden | |
| main.ipynb | 2 weken geleden | |
| requirements.txt | 2 weken geleden | |
结合FormalGeo与Agent的几何问题形式化自动求解器。
本项目构建了一个统一的神经符号推理框架,该框架将大语言模型、智能体架构与形式化符号求解器深度融合,其中大语言模型作为规划师,负责高层次的语义理解和求解路径的反思修正,而符号求解器作为执行器,负责形式化验证与严格定理的应用执行。大语言模型的神经推理能力与符号系统的逻辑完备性互为补充,从根本上消除了模型产生幻觉的风险。此外,本项目构建了首个双向符号推理引擎,完整统一了前向推导与后向目标分解两种求解方式。该框架主要面向高精度几何定理证明与自动解题场景,可广泛应用于教育智能辅导、数学竞赛推理及几何知识验证等实际任务中。
从 Google Drive 或 百度网盘 下载数据集和日志,并将其解压到当前项目目录中。接下来在项目目录下新建一个 .env 文件。此时你的目录结构应如下所示:
BitSecret-GPSAgent/
|--datasets/
| |--diagram/
| |--ggbs/
| |--problems/
| |--summarize_prompt.txt
| |--system_prompt.txt
| └──gdl.json
|
|--outputs/
| |--agent/
| |--log/
| |--fig-statistics.pdf
| └──tab-main_results.txt
|
|--src/
| └──gps/
| |--agent_loop.py
| |--chart.py
| |--symbolic_solver.py
| └──utils.py
|
|--.env
|--architecture.png
|--requirements.txt
└──README.md
新建 Python 环境并安装依赖:
$ conda create -n GPSAgent python=3.12.12
$ conda activate GPSAgent
$ pip install -r requirements.txt
运行几何问题求解器,并打印几何问题求解过程与Agent交互历史:
$ cd src/gps
$ python agent_loop.py
运行 agent_loop.py 之前,请在 RAVS 目录下添加 .env 文件,并配置以下参数:
Deepseek_BASE_URL="https://api.deepseek.com"
Deepseek_API_KEY="your_api_key"
Deepseek_MODEL_ID="deepseek-v4-pro"
如果你想使用其他基础模型,例如 Qwen3.6 Plus,可以在 .env 文件中添加以下信息,同时修改 agent_loop.py 中 main 函数的参数 model_names=['BaiLian']。如果你想使用多进程运行,可以添加多个模型名称,例如 model_names=['Deepseek', 'Deepseek', 'BaiLian']。每个模型名称对应一个进程。
BaiLian_BASE_URL="https://dashscope.aliyuncs.com/compatible-mode/v1"
BaiLian_API_KEY="your_api_key"
BaiLian_MODEL_ID="qwen3.6-plus"
运行以下代码求解几何问题:
# 示例代码
from agent_loop import main
main(
test_pids=[1, 2, 3], # 要运行的题目列表,范围1-7000
log_path="../../outputs/log/log_pssr_agent.json", # 保存日志的地址
model_names=['Deepseek'], # 要使用的LLM
max_epoch=50, # 单个问题与LLM的最大交互次数
max_context=80000, # 单个问题最大上下文长度
solve_again=True, # 设置为 True 时,若问题求解不成功时,再次运行依然尝试求解
debug_mode=True # 设置为 True 时输出对话交互历史
)
你将会得到类似的输出:
{
"timing": 168.69201111793518,
"model_name": "deepseek-v4-pro",
"history": [
[
{
"role": "system",
"content": "<system prompt start>\n你现在作为一个研究平面几何问题的专家,使用形式化求解器FormalGeo,根据求解器的反馈,交互式的求解几何问题。形式化系统的定义、可供使用的工具、以及你的行为描述如下。\n\n\nA、形式化系统的定义\n形式化系统定义了5种概念,分别是几何结构谓词、实体、关系、属性和定理。\n\n1.几何结构谓词用来描述几何图形的拓扑结构信息,定义了图形的结构,一共有三种,分别是Shape(*)、Collinear(*)、Cocircular(*)。Shape用来描述由线或弧依次逆时针构成的图形,如Shape(AB,BC,CA)描述了一个三角形ABC、Shape(AB,BC)描述了一个角ABC、Shape(PA,OAB,BP)描述了一个扇形,P是圆心,O是圆;Collinear用来描述按顺序排列的几个共线点,如Collinear(ABC)表示点A、B和C共线;Cocircular用来描述逆时针排列的几个点共圆,如Collinear(O,XYZ)表示点X、Y和Z在圆O上,并且是逆时针顺序。\n\n2.实体是更详细的拓扑结构信息描述,求解器识别到上述3种几何结构谓词之后,会自动扩展出11种实体,分别是Point(A)、Line(A,B)、PointOnLine(M,A,B)、Angle(A,B,C)、Triangle(A,B,C)、Quadrilateral(A,B,C,D)、Circle(O)、PointOnCircle(A,O)、DoublePointsOnCircle(A,B,O)、TriplePointsOnCircle(A,B,C,O)、QuadruplePointsOnCircle(A,B,C,D,O)。实体在求解器中的作用是描述几何图形的拓扑结构信息,在添加关系时运行实体存在性检查。如添加关系RightTriangle(A,B,C)时,会检查是否存在Triangle(A,B,C),若不存在,则实体存在性检查不通过。此外,在此形式化系统中,用点的逆时针顺序表示几何图形。以三角形为例,对于Triangle(A,B,C),还有其他两种表示(B,C,A)和(C,A,B);但(C,B,A)不是,(C,B,A)表示另一种镜像对称的拓扑结构。这一点在应用下文中介绍的镜像(定理名中包含mirror)对称三角形的相似和全等定理时需要注意,MirrorCongruentBetweenTriangle(A,B,C,D,E,F)表示三角形ABC和DEF镜像相似,点对应关系为A->D,B->F,C->E(而不是A->D,B->E,C->F)。\n\n3.关系用于描述实体之间的关系,如三个点的关系可能是RightTriangle(A,B,C)、一个点和一个圆的关系可能是IsCentreOfCircle(P,O)。这些关系的参数格式和它们所需的实体存在性检查为:\nRightTriangle(A,B,C):Triangle(A,B,C)\nIsoscelesTriangle(A,B,C):Triangle(A,B,C)\nIsoscelesRightTriangle(A,B,C):Triangle(A,B,C)\nEquilateralTriangle(A,B,C):Triangle(A,B,C)\nKite(A,B,C,D):Quadrilateral(A,B,C,D)\nParallelogram(A,B,C,D):Quadrilateral(A,B,C,D)\nRhombus(A,B,C,D):Quadrilateral(A,B,C,D)\nRectangle(A,B,C,D):Quadrilateral(A,B,C,D)\nSquare(A,B,C,D):Quadrilateral(A,B,C,D)\nTrapezoid(A,B,C,D):Quadrilateral(A,B,C,D)\nIsoscelesTrapezoid(A,B,C,D):Quadrilateral(A,B,C,D)\nRightTrapezoid(A,B,C,D):Quadrilateral(A,B,C,D)\nIsMidpointOfLine(M,A,B):Point(M)&Line(A,B)\nIsMidpointOfArc(M,O,A,B):Point(M)&DoublePointsOnCircle(A,B,O)\nParallelBetweenLine(A,B,C,D):Line(A,B)&Line(C,D)\nRightAngle(A,O,C):Angle(A,O,C)\nIsPerpendicularBisectorOfLine(C,O,A,B):Line(C,O)&Line(A,B)\nIsBisectorOfAngle(D,A,B,C):Line(B,D)&Angle(A,B,C)\nIsMedianOfTriangle(D,A,B,C):Line(A,D)&Triangle(A,B,C)\nIsAltitudeOfTriangle(D,A,B,C):Line(A,D)&Triangle(A,B,C)\nIsMidsegmentOfTriangle(D,E,A,B,C):Line(D,E)&Triangle(A,B,C)\nIsCircumcenterOfTriangle(O,A,B,C):Point(O)&Triangle(A,B,C)\nIsIncenterOfTriangle(O,A,B,C):Point(O)&Triangle(A,B,C)\nIsCentroidOfTriangle(O,A,B,C):Point(O)&Triangle(A,B,C)\nIsOrthocenterOfTriangle(O,A,B,C):Point(O)&Triangle(A,B,C)\nCongruentBetweenTriangle(A,B,C,D,E,F):Triangle(A,B,C)&Triangle(D,E,F)\nMirrorCongruentBetweenTriangle(A,B,C,D,E,F):Triangle(A,B,C)&Triangle(D,E,F)\nSimilarBetweenTriangle(A,B,C,D,E,F):Triangle(A,B,C)&Triangle(D,E,F)\nMirrorSimilarBetweenTriangle(A,B,C,D,E,F):Triangle(A,B,C)&Triangle(D,E,F)\nIsAltitudeOfQuadrilateral(E,F,A,B,C,D):Line(E,F)&Quadrilateral(A,B,C,D)\nIsMidsegmentOfQuadrilateral(E,F,A,B,C,D):Line(E,F)&Quadrilateral(A,B,C,D)\nIsCircumcenterOfQuadrilateral(O,A,B,C,D):Point(O)&Quadrilateral(A,B,C,D)\nIsIncenterOfQuadrilateral(O,A,B,C,D):Point(O)&Quadrilateral(A,B,C,D)\nCongruentBetweenQuadrilateral(A,B,C,D,E,F,G,H):Quadrilateral(A,B,C,D)&Quadrilateral(E,F,G,H)\nMirrorCongruentBetweenQuadrilateral(A,B,C,D,E,F,G,H):Quadrilateral(A,B,C,D)&Quadrilateral(E,F,G,H)\nSimilarBetweenQuadrilateral(A,B,C,D,E,F,G,H):Quadrilateral(A,B,C,D)&Quadrilateral(E,F,G,H)\nMirrorSimilarBetweenQuadrilateral(A,B,C,D,E,F,G,H):Quadrilateral(A,B,C,D)&Quadrilateral(E,F,G,H)\nCongruentBetweenArc(O,A,B,C,D):DoublePointsOnCircle(A,B,O)&DoublePointsOnCircle(C,D,O)\nSimilarBetweenArc(O,A,B,C,D):DoublePointsOnCircle(A,B,O)&DoublePointsOnCircle(C,D,O)\nIsDiameterOfCircle(A,B,O):Line(A,B)&DoublePointsOnCircle(A,B,O)\nIsTangentOfCircle(P,A,O):Line(P,A)&PointOnCircle(A,O)\nIsCentreOfCircle(P,O):Point(P)&Circle(O)\n\n4.除了上述定义的几何关系,形式化系统还可以表示代数关系Eq,代数关系是由属性的符号表示、运算符和数字构成的等式。如AB.ll-CD.ll=0表示线AB的长度与线CD的长度相等。属性是几何实体和关系某一性质的定量描述,如角的大小、线的长度等。属性可以使用符号表示,如AOB.ma表示角AOB的角度、AB.ll表示线AB的长度。形式化系统属性的定义和它们的符号为:\nLengthOfLine(A,B):ll\nMeasureOfAngle(A,B,C):ma\nPerimeterOfTriangle(A,B,C):pt\nAreaOfTriangle(A,B,C):at\nHeightOfTriangle(A,B,C):ht\nRatioOfSimilarTriangle(A,B,C,D,E,F):rst\nRatioOfMirrorSimilarTriangle(A,B,C,D,E,F):rmt\nPerimeterOfQuadrilateral(A,B,C,D):pq\nAreaOfQuadrilateral(A,B,C,D):aq\nHeightOfQuadrilateral(A,B,C,D):hq\nRatioOfSimilarQuadrilateral(A,B,C,D,E,F,G,H):rsq\nRatioOfMirrorSimilarQuadrilateral(A,B,C,D,E,F,G,H):rmq\nLengthOfArc(O,A,B):la\nMeasureOfArc(O,A,B):mar\nRatioOfSimilarArc(O,A,B,C,D):rsa\nRadiusOfCircle(O):rc\nDiameterOfCircle(O):dc\nPerimeterOfCircle(O):pc\nAreaOfCircle(O):ac\nPerimeterOfSector(O,A,B):ps\nAreaOfSector(O,A,B):as\n\n5.定理定义了关系之间的推理过程。一个定理由前提和结论构成,前提是由关系和逻辑连接词构成的逻辑表达式,结论是某个关系。如平行线的传递性可以定义为parallel_judgment_par_par(A,B,C,D,E,F):ParallelBetweenLine(A,B,C,D)&ParallelBetweenLine(C,D,E,F)->ParallelBetweenLine(A,B,E,F)。在应用定理时,求解器会自动进行字符替换,假设应用的定理为parallel_judgment_par_par(A,B,M,N,X,Y),求解器会检查ParallelBetweenLine(A,B,M,N)&ParallelBetweenLine(M,N,X,Y)是否成立,如果成立,就把ParallelBetweenLine(A,B,X,Y)添加到已知条件。形式化系统定义的定理分别为:\nline_addition(A,B,C):PointOnLine(B,A,C)->Eq(Sub(AC.ll,Add(AB.ll,BC.ll)))\nmidpoint_of_line_judgment(M,A,B):PointOnLine(M,A,B)&Eq(Sub(AM.ll,MB.ll))->IsMidpointOfLine(M,A,B)\nparallel_judgment_corresponding_angle_1(A,B,C,D,E):Angle(E,A,B)&Angle(A,C,D)&PointOnLine(A,E,C)&Eq(Sub(EAB.ma,ACD.ma))->ParallelBetweenLine(A,B,C,D)\nparallel_judgment_corresponding_angle_2(A,B,C,D,E):Angle(B,A,C)&Angle(D,C,E)&PointOnLine(C,A,E)&Eq(Sub(BAC.ma,DCE.ma))->ParallelBetweenLine(A,B,C,D)\nparallel_judgment_alternate_interior_angle_1(A,B,C,D):Angle(B,A,D)&Angle(C,D,A)&Eq(Sub(BAD.ma,CDA.ma))->ParallelBetweenLine(A,B,C,D)\nparallel_judgment_alternate_interior_angle_2(A,B,C,D):Angle(C,B,A)&Angle(B,C,D)&Eq(Sub(CBA.ma,BCD.ma))->ParallelBetweenLine(A,B,C,D)\nparallel_judgment_ipsilateral_internal_angle(A,B,C,D):Angle(B,A,C)&Angle(A,C,D)&Eq(Sub(Add(BAC.ma,ACD.ma),180))->ParallelBetweenLine(A,B,C,D)\nparallel_judgment_par_par(A,B,C,D,E,F):ParallelBetweenLine(A,B,C,D)&ParallelBetweenLine(C,D,E,F)->ParallelBetweenLine(A,B,E,F)\nparallel_judgment_per_per_1(A,B,C,D):RightAngle(B,A,C)&RightAngle(A,C,D)->ParallelBetweenLine(A,B,C,D)\nparallel_property_collinear_extend_1_1(A,B,C,D,M):ParallelBetweenLine(A,B,C,D)&PointOnLine(A,M,B)->ParallelBetweenLine(M,A,C,D)\nparallel_property_collinear_extend_1_2(A,B,C,D,M):ParallelBetweenLine(A,B,C,D)&PointOnLine(A,M,B)->ParallelBetweenLine(M,B,C,D)\nparallel_property_collinear_extend_2_1(A,B,C,D,M):ParallelBetweenLine(A,B,C,D)&PointOnLine(B,A,M)->ParallelBetweenLine(A,M,C,D)\nparallel_property_collinear_extend_2_2(A,B,C,D,M):ParallelBetweenLine(A,B,C,D)&PointOnLine(B,A,M)->ParallelBetweenLine(B,M,C,D)\nparallel_property_collinear_extend_3_1(A,B,C,D,M):ParallelBetweenLine(A,B,C,D)&PointOnLine(M,A,B)->ParallelBetweenLine(A,M,C,D)\nparallel_property_collinear_extend_3_2(A,B,C,D,M):ParallelBetweenLine(A,B,C,D)&PointOnLine(A,M,B)->ParallelBetweenLine(M,B,C,D)\nparallel_property_corresponding_angle_1(A,B,C,D,E):ParallelBetweenLine(A,B,C,D)&PointOnLine(A,E,C)->Eq(Sub(EAB.ma,ACD.ma))\nparallel_property_corresponding_angle_2(A,B,C,D,E):ParallelBetweenLine(A,B,C,D)&PointOnLine(C,A,E)->Eq(Sub(BAC.ma,DCE.ma))\nparallel_property_alternate_interior_angle_1(A,B,C,D):ParallelBetweenLine(A,B,C,D)&Line(A,D)->Eq(Sub(BAD.ma,CDA.ma))\nparallel_property_alternate_interior_angle_2(A,B,C,D):ParallelBetweenLine(A,B,C,D)&Line(B,C)->Eq(Sub(CBA.ma,BCD.ma))\nparallel_property_ipsilateral_internal_angle(A,B,C,D):ParallelBetweenLine(A,B,C,D)&Line(A,C)->Eq(Sub(Add(BAC.ma,ACD.ma),180))\nperpendicular_bisector_judgment_per_and_mid(C,O,A,B):PointOnLine(O,A,B)&Angle(A,O,C)&Eq(Sub(AOC.ma,90))&Eq(Sub(AO.ll,BO.ll))->IsPerpendicularBisectorOfLine(C,O,A,B)\nperpendicular_bisector_judgment_distance_equal(C,O,A,B):PointOnLine(O,A,B)&Angle(A,O,C)&Eq(Sub(AOC.ma,90))&Eq(Sub(CA.ll,CB.ll))->IsPerpendicularBisectorOfLine(C,O,A,B)\nperpendicular_bisector_property_distance_equal(C,O,A,B):IsPerpendicularBisectorOfLine(C,O,A,B)->Eq(Sub(CA.ll,CB.ll))\nperpendicular_bisector_property_bisector(C,O,A,B):IsPerpendicularBisectorOfLine(C,O,A,B)&Angle(B,C,O)&Angle(O,C,A)->IsBisectorOfAngle(O,B,C,A)\nangle_addition(A,B,C,D):Angle(A,B,C)&Angle(C,B,D)&Angle(A,B,D)->Eq(Sub(ABD.ma,Add(ABC.ma,CBD.ma)))\nflat_angle(A,B,C):PointOnLine(B,A,C)->Eq(Sub(ABC.ma,180))\nadjacent_complementary_angle(A,O,B,C):PointOnLine(O,A,C)&Angle(A,O,B)&Angle(B,O,C)->Eq(Sub(Add(AOB.ma,BOC.ma),180))\nround_angle(A,O,B):Angle(A,O,B)&Angle(B,O,A)->Eq(Sub(Add(AOB.ma,BOA.ma),360))\nvertical_angle(A,O,C,B,D):PointOnLine(O,A,B)&PointOnLine(O,C,D)&Angle(A,O,C)&Angle(B,O,D)->Eq(Sub(AOC.ma,BOD.ma))\nbisector_of_angle_judgment_angle_equal(D,A,B,C):Angle(A,B,D)&Angle(D,B,C)&Eq(Sub(ABD.ma,DBC.ma))->IsBisectorOfAngle(D,A,B,C)\nbisector_of_angle_property_distance_equal(D,A,B,C):IsBisectorOfAngle(D,A,B,C)&Eq(Sub(BCD.ma,90))&Eq(Sub(DAB.ma,90))->Eq(Sub(DA.ll,DC.ll))\nbisector_of_angle_property_line_ratio(D,A,B,C):IsBisectorOfAngle(D,A,B,C)&PointOnLine(D,C,A)->Eq(Sub(Add(Log(CD.ll),Log(BA.ll)),Add(Log(DA.ll),Log(BC.ll))))\ntriangle_property_angle_sum(A,B,C):Triangle(A,B,C)->Eq(Sub(Add(ABC.ma,BCA.ma,CAB.ma),180))\ntriangle_perimeter_formula(A,B,C):Triangle(A,B,C)->Eq(Sub(ABC.pt,Add(AB.ll,BC.ll,CA.ll)))\ntriangle_area_formula_common(A,B,C):Triangle(A,B,C)->Eq(Sub(ABC.at,Mul(ABC.ht,BC.ll,1/2)))\ntriangle_area_formula_right_triangle(A,B,C):RightTriangle(A,B,C)->Eq(Sub(ABC.at,Mul(AB.ll,BC.ll,1/2)))\nmedian_of_triangle_judgment(D,A,B,C):Triangle(A,B,C)&Line(A,D)&PointOnLine(D,B,C)&Eq(Sub(BD.ll,CD.ll))->IsMedianOfTriangle(D,A,B,C)\naltitude_of_triangle_judgment_1(D,A,B,C):Triangle(A,B,C)&Line(A,D)&PointOnLine(D,B,C)&Eq(Sub(BDA.ma,90))->IsAltitudeOfTriangle(D,A,B,C)\naltitude_of_triangle_judgment_2(D,A,B,C):Triangle(A,B,C)&Line(A,D)&PointOnLine(B,D,C)&Eq(Sub(ADB.ma,90))->IsAltitudeOfTriangle(D,A,B,C)\nmidsegment_of_triangle_judgment_midpoint(D,E,A,B,C):Triangle(A,B,C)&PointOnLine(D,A,B)&PointOnLine(E,A,C)&Line(D,E)&Eq(Sub(AD.ll,BD.ll))&Eq(Sub(AE.ll,CE.ll))->IsMidsegmentOfTriangle(D,E,A,B,C)\nmidsegment_of_triangle_judgment_parallel_1(D,E,A,B,C):Triangle(A,B,C)&PointOnLine(D,A,B)&PointOnLine(E,A,C)&Line(D,E)&ParallelBetweenLine(D,E,B,C)&Eq(Sub(AD.ll,BD.ll))->IsMidsegmentOfTriangle(D,E,A,B,C)\nmidsegment_of_triangle_judgment_parallel_2(D,E,A,B,C):Triangle(A,B,C)&PointOnLine(D,A,B)&PointOnLine(E,A,C)&Line(D,E)&ParallelBetweenLine(D,E,B,C)&Eq(Sub(AE.ll,CE.ll))->IsMidsegmentOfTriangle(D,E,A,B,C)\nmidsegment_of_triangle_property_parallel(D,E,A,B,C):IsMidsegmentOfTriangle(D,E,A,B,C)->ParallelBetweenLine(D,E,B,C)\nmidsegment_of_triangle_property_length(D,E,A,B,C):IsMidsegmentOfTriangle(D,E,A,B,C)->Eq(Sub(DE.ll,Mul(BC.ll,1/2)))\ncentroid_of_triangle_judgment_intersection(O,A,B,C,M,N):IsMedianOfTriangle(M,C,A,B)&IsMedianOfTriangle(N,B,C,A)&PointOnLine(O,C,M)&PointOnLine(O,B,N)->IsCentroidOfTriangle(O,A,B,C)\ncentroid_of_triangle_property_intersection(O,A,B,C,M):IsCentroidOfTriangle(O,A,B,C)&PointOnLine(O,A,M)&PointOnLine(M,B,C)->IsMedianOfTriangle(M,A,B,C)\ncentroid_of_triangle_property_line_ratio(O,A,B,C,M):IsCentroidOfTriangle(O,A,B,C)&PointOnLine(O,A,M)&PointOnLine(M,B,C)->Eq(Sub(OA.ll,Mul(OM.ll,2)))\ncongruent_triangle_judgment_aas_1(A,B,C,D,E,F):Triangle(A,B,C)&Triangle(D,E,F)&Eq(Sub(ABC.ma,DEF.ma))&Eq(Sub(BCA.ma,EFD.ma))&Eq(Sub(AB.ll,DE.ll))->CongruentBetweenTriangle(A,B,C,D,E,F)\ncongruent_triangle_judgment_aas_2(A,B,C,D,E,F):Triangle(A,B,C)&Triangle(D,E,F)&Eq(Sub(ABC.ma,DEF.ma))&Eq(Sub(BCA.ma,EFD.ma))&Eq(Sub(BC.ll,EF.ll))->CongruentBetweenTriangle(A,B,C,D,E,F)\ncongruent_triangle_judgment_hl_2(A,B,C,D,E,F):Triangle(A,B,C)&Triangle(D,E,F)&Eq(Sub(ABC.ma,90))&Eq(Sub(DEF.ma,90))&Eq(Sub(AC.ll,DF.ll))&Eq(Sub(BC.ll,EF.ll))->CongruentBetweenTriangle(A,B,C,D,E,F)\ncongruent_triangle_property_line_equal(A,B,C,D,E,F):CongruentBetweenTriangle(A,B,C,D,E,F)->Eq(Sub(BC.ll,EF.ll))\ncongruent_triangle_property_angle_equal(A,B,C,D,E,F):CongruentBetweenTriangle(A,B,C,D,E,F)->Eq(Sub(CAB.ma,FDE.ma))\nmirror_congruent_triangle_judgment_sss(A,B,C,D,E,F):Triangle(A,B,C)&Triangle(D,E,F)&Eq(Sub(AB.ll,FD.ll))&Eq(Sub(BC.ll,EF.ll))&Eq(Sub(CA.ll,DE.ll))->MirrorCongruentBetweenTriangle(A,B,C,D,E,F)\nmirror_congruent_triangle_judgment_sas(A,B,C,D,E,F):Triangle(A,B,C)&Triangle(D,E,F)&Eq(Sub(AB.ll,DF.ll))&Eq(Sub(CAB.ma,FDE.ma))&Eq(Sub(AC.ll,DE.ll))->MirrorCongruentBetweenTriangle(A,B,C,D,E,F)\nmirror_congruent_triangle_judgment_aas_1(A,B,C,D,E,F):Triangle(A,B,C)&Triangle(D,E,F)&Eq(Sub(ABC.ma,EFD.ma))&Eq(Sub(BCA.ma,DEF.ma))&Eq(Sub(AB.ll,DF.ll))->MirrorCongruentBetweenTriangle(A,B,C,D,E,F)\nmirror_congruent_triangle_judgment_aas_2(A,B,C,D,E,F):Triangle(A,B,C)&Triangle(D,E,F)&Eq(Sub(ABC.ma,EFD.ma))&Eq(Sub(BCA.ma,DEF.ma))&Eq(Sub(BC.ll,EF.ll))->MirrorCongruentBetweenTriangle(A,B,C,D,E,F)\nmirror_congruent_triangle_judgment_aas_3(A,B,C,D,E,F):Triangle(A,B,C)&Triangle(D,E,F)&Eq(Sub(ABC.ma,EFD.ma))&Eq(Sub(BCA.ma,DEF.ma))&Eq(Sub(CA.ll,DE.ll))->MirrorCongruentBetweenTriangle(A,B,C,D,E,F)\nmirror_congruent_triangle_judgment_hl_1(A,B,C,D,E,F):Triangle(A,B,C)&Triangle(D,E,F)&Eq(Sub(ABC.ma,90))&Eq(Sub(EFD.ma,90))&Eq(Sub(AC.ll,DE.ll))&Eq(Sub(BC.ll,EF.ll))->MirrorCongruentBetweenTriangle(A,B,C,D,E,F)\nmirror_congruent_triangle_judgment_hl_2(A,B,C,D,E,F):Triangle(A,B,C)&Triangle(D,E,F)&Eq(Sub(ABC.ma,90))&Eq(Sub(EFD.ma,90))&Eq(Sub(AC.ll,DE.ll))&Eq(Sub(AB.ll,DF.ll))->MirrorCongruentBetweenTriangle(A,B,C,D,E,F)\nmirror_congruent_triangle_property_line_equal(A,B,C,D,E,F):MirrorCongruentBetweenTriangle(A,B,C,D,E,F)->Eq(Sub(BC.ll,EF.ll))\nmirror_congruent_triangle_property_angle_equal(A,B,C,D,E,F):MirrorCongruentBetweenTriangle(A,B,C,D,E,F)->Eq(Sub(CAB.ma,FDE.ma))\nsimilar_triangle_judgment_sas(A,B,C,D,E,F):Triangle(A,B,C)&Triangle(D,E,F)&Eq(Sub(Add(Log(AB.ll),Log(DF.ll)),Add(Log(DE.ll),Log(AC.ll))))&Eq(Sub(CAB.ma,FDE.ma))->SimilarBetweenTriangle(A,B,C,D,E,F)\nsimilar_triangle_judgment_aa(A,B,C,D,E,F):Triangle(A,B,C)&Triangle(D,E,F)&Eq(Sub(ABC.ma,DEF.ma))&Eq(Sub(BCA.ma,EFD.ma))->SimilarBetweenTriangle(A,B,C,D,E,F)\nsimilar_triangle_property_line_ratio(A,B,C,D,E,F):SimilarBetweenTriangle(A,B,C,D,E,F)->Eq(Sub(Log(BC.ll),Add(Log(EF.ll),Log(ABCDEF.rst))))\nsimilar_triangle_property_angle_equal(A,B,C,D,E,F):SimilarBetweenTriangle(A,B,C,D,E,F)->Eq(Sub(CAB.ma,FDE.ma))\nsimilar_triangle_property_perimeter_ratio(A,B,C,D,E,F):SimilarBetweenTriangle(A,B,C,D,E,F)->Eq(Sub(Log(ABC.pt),Add(Log(DEF.pt),Log(ABCDEF.rst))))\nsimilar_triangle_property_area_square_ratio(A,B,C,D,E,F):SimilarBetweenTriangle(A,B,C,D,E,F)->Eq(Sub(Log(ABC.at),Add(Log(DEF.at),Log(ABCDEF.rst),Log(ABCDEF.rst))))\nmirror_similar_triangle_judgment_sas(A,B,C,D,E,F):Triangle(A,B,C)&Triangle(D,E,F)&Eq(Sub(Add(Log(AB.ll),Log(DE.ll)),Add(Log(DF.ll),Log(AC.ll))))&Eq(Sub(CAB.ma,FDE.ma))->MirrorSimilarBetweenTriangle(A,B,C,D,E,F)\nmirror_similar_triangle_judgment_aa(A,B,C,D,E,F):Triangle(A,B,C)&Triangle(D,E,F)&Eq(Sub(ABC.ma,EFD.ma))&Eq(Sub(BCA.ma,DEF.ma))->MirrorSimilarBetweenTriangle(A,B,C,D,E,F)\nmirror_similar_triangle_property_line_ratio(A,B,C,D,E,F):MirrorSimilarBetweenTriangle(A,B,C,D,E,F)->Eq(Sub(Log(BC.ll),Add(Log(EF.ll),Log(ABCDEF.rmt))))\nmirror_similar_triangle_property_angle_equal(A,B,C,D,E,F):MirrorSimilarBetweenTriangle(A,B,C,D,E,F)->Eq(Sub(CAB.ma,FDE.ma))\nmirror_similar_triangle_property_area_square_ratio(A,B,C,D,E,F):MirrorSimilarBetweenTriangle(A,B,C,D,E,F)->Eq(Sub(Log(ABC.at),Add(Log(DEF.at),Log(ABCDEF.rmt),Log(ABCDEF.rmt))))\nright_triangle_judgment_angle(A,B,C):Triangle(A,B,C)&Eq(Sub(ABC.ma,90))->RightTriangle(A,B,C)\nright_triangle_judgment_pythagorean_inverse(A,B,C):Triangle(A,B,C)&Eq(Sub(Add(Pow(AB.ll,2),Pow(BC.ll,2)),Pow(AC.ll,2)))->RightTriangle(A,B,C)\nright_triangle_property_pythagorean(A,B,C):RightTriangle(A,B,C)->Eq(Sub(Add(Pow(AB.ll,2),Pow(BC.ll,2)),Pow(AC.ll,2)))\nright_triangle_property_length_of_median(A,B,C,M):RightTriangle(A,B,C)&IsMedianOfTriangle(M,B,C,A)->Eq(Sub(Mul(BM.ll,2),CA.ll))\nright_triangle_property_special_angle_1(A,B,C):RightTriangle(A,B,C)&Eq(Sub(CAB.ma,30))->Eq(Sub(AC.ll,Mul(BC.ll,2)))\nright_triangle_property_special_angle_2(A,B,C):RightTriangle(A,B,C)&Eq(Sub(CAB.ma,60))->Eq(Sub(AC.ll,Mul(AB.ll,2)))\nisosceles_triangle_judgment_line_equal(A,B,C):Triangle(A,B,C)&Eq(Sub(AB.ll,AC.ll))->IsoscelesTriangle(A,B,C)\nisosceles_triangle_judgment_angle_equal(A,B,C):Triangle(A,B,C)&Eq(Sub(ABC.ma,BCA.ma))->IsoscelesTriangle(A,B,C)\nisosceles_triangle_property_angle_equal(A,B,C):IsoscelesTriangle(A,B,C)->Eq(Sub(ABC.ma,BCA.ma))\nisosceles_triangle_property_line_coincidence_1_1(A,B,C,M):IsoscelesTriangle(A,B,C)&IsAltitudeOfTriangle(M,A,B,C)->IsMedianOfTriangle(M,A,B,C)\nisosceles_triangle_property_line_coincidence_2_1(A,B,C,M):IsoscelesTriangle(A,B,C)&IsMedianOfTriangle(M,A,B,C)->IsAltitudeOfTriangle(M,A,B,C)\nisosceles_triangle_property_line_coincidence_2_2(A,B,C,M):IsoscelesTriangle(A,B,C)&IsMedianOfTriangle(M,A,B,C)->IsBisectorOfAngle(M,C,A,B)\nequilateral_triangle_judgment_isosceles_and_isosceles(A,B,C):IsoscelesTriangle(A,B,C)&IsoscelesTriangle(B,C,A)->EquilateralTriangle(A,B,C)\nequilateral_triangle_property_angle(A,B,C):EquilateralTriangle(A,B,C)->Eq(Sub(CAB.ma,60))\nquadrilateral_property_angle_sum(A,B,C,D):Quadrilateral(A,B,C,D)->Eq(Sub(Add(ABC.ma,BCD.ma,CDA.ma,DAB.ma),360))\nquadrilateral_perimeter_formula(A,B,C,D):Quadrilateral(A,B,C,D)->Eq(Sub(Add(AB.ll,BC.ll,CD.ll,DA.ll),ABCD.pq))\naltitude_of_quadrilateral_judgment_left_vertex_1(F,A,B,C,D):Parallelogram(A,B,C,D)&Line(A,F)&PointOnLine(F,B,C)&Eq(Sub(BFA.ma,90))->IsAltitudeOfQuadrilateral(A,F,A,B,C,D)\naltitude_of_quadrilateral_judgment_left_vertex_3(F,A,B,C,D):Parallelogram(A,B,C,D)&Line(A,F)&PointOnLine(B,F,C)&Eq(Sub(AFB.ma,90))->IsAltitudeOfQuadrilateral(A,F,A,B,C,D)\naltitude_of_quadrilateral_judgment_right_vertex_1(F,A,B,C,D):Parallelogram(A,B,C,D)&Line(D,F)&PointOnLine(F,B,C)&Eq(Sub(BFD.ma,90))->IsAltitudeOfQuadrilateral(D,F,A,B,C,D)\naltitude_of_quadrilateral_judgment_right_vertex_2(F,A,B,C,D):Trapezoid(A,B,C,D)&Line(D,F)&PointOnLine(F,B,C)&Eq(Sub(BFD.ma,90))->IsAltitudeOfQuadrilateral(D,F,A,B,C,D)\naltitude_of_quadrilateral_judgment_right_vertex_5(F,A,B,C,D):Parallelogram(A,B,C,D)&Line(D,F)&PointOnLine(C,B,F)&Eq(Sub(CFD.ma,90))->IsAltitudeOfQuadrilateral(D,F,A,B,C,D)\naltitude_of_quadrilateral_judgment_diagonal_1(A,B,C,D):Parallelogram(A,B,C,D)&Line(A,C)&Eq(Sub(BCA.ma,90))->IsAltitudeOfQuadrilateral(A,C,A,B,C,D)\naltitude_of_quadrilateral_judgment_diagonal_3(A,B,C,D):Parallelogram(A,B,C,D)&Line(D,B)&Eq(Sub(DBC.ma,90))->IsAltitudeOfQuadrilateral(D,B,A,B,C,D)\nmidsegment_of_quadrilateral_judgment_midpoint(E,F,A,B,C,D):PointOnLine(E,A,B)&PointOnLine(F,D,C)&Line(E,F)&Eq(Sub(AE.ll,BE.ll))&Eq(Sub(DF.ll,CF.ll))->IsMidsegmentOfQuadrilateral(E,F,A,B,C,D)\nmidsegment_of_quadrilateral_judgment_parallel_1(E,F,A,B,C,D):PointOnLine(E,A,B)&PointOnLine(F,D,C)&Line(E,F)&Trapezoid(A,B,C,D)&ParallelBetweenLine(E,F,B,C)&Eq(Sub(AE.ll,BE.ll))->IsMidsegmentOfQuadrilateral(E,F,A,B,C,D)\nmidsegment_of_quadrilateral_property_length(E,F,A,B,C,D):IsMidsegmentOfQuadrilateral(E,F,A,B,C,D)->Eq(Sub(Add(AD.ll,BC.ll),Mul(EF.ll,2)))\nmirror_congruent_quadrilateral_property_angle_equal(A,B,C,D,E,F,G,H):MirrorCongruentBetweenQuadrilateral(A,B,C,D,E,F,G,H)->Eq(Sub(DAB.ma,HEF.ma))\nsimilar_quadrilateral_property_line_ratio(A,B,C,D,E,F,G,H):SimilarBetweenQuadrilateral(A,B,C,D,E,F,G,H)->Eq(Sub(Log(AB.ll),Add(Log(EF.ll),Log(ABCDEFGH.rsq))))\nsimilar_quadrilateral_property_area_square_ratio(A,B,C,D,E,F,G,H):SimilarBetweenQuadrilateral(A,B,C,D,E,F,G,H)->Eq(Sub(Log(ABCD.aq),Add(Log(EFGH.aq),Log(ABCDEFGH.rsq),Log(ABCDEFGH.rsq))))\nparallelogram_judgment_parallel_and_parallel(A,B,C,D):Quadrilateral(A,B,C,D)&ParallelBetweenLine(A,D,B,C)&ParallelBetweenLine(B,A,C,D)->Parallelogram(A,B,C,D)\nparallelogram_judgment_equal_and_equal(A,B,C,D):Quadrilateral(A,B,C,D)&Eq(Sub(AD.ll,BC.ll))&Eq(Sub(BA.ll,CD.ll))->Parallelogram(A,B,C,D)\nparallelogram_judgment_angle_and_angle(A,B,C,D):Quadrilateral(A,B,C,D)&Eq(Sub(DAB.ma,BCD.ma))&Eq(Sub(ABC.ma,CDA.ma))->Parallelogram(A,B,C,D)\nparallelogram_property_opposite_line_equal(A,B,C,D):Parallelogram(A,B,C,D)->Eq(Sub(BA.ll,CD.ll))\nparallelogram_property_opposite_angle_equal(A,B,C,D):Parallelogram(A,B,C,D)->Eq(Sub(DAB.ma,BCD.ma))\nparallelogram_property_diagonal_bisection(A,B,C,D,O):Parallelogram(A,B,C,D)&PointOnLine(O,A,C)&PointOnLine(O,B,D)->IsMidpointOfLine(O,A,C)\nparallelogram_area_formula_common(A,B,C,D):Parallelogram(A,B,C,D)->Eq(Sub(Log(ABCD.aq),Add(Log(ABCD.hq),Log(BC.ll))))\nrectangle_area_formula(A,B,C,D):Rectangle(A,B,C,D)->Eq(Sub(Log(ABCD.aq),Add(Log(AB.ll),Log(BC.ll))))\nkite_judgment_equal_and_equal(A,B,C,D):Quadrilateral(A,B,C,D)&Eq(Sub(AB.ll,AD.ll))&Eq(Sub(CB.ll,CD.ll))->Kite(A,B,C,D)\nkite_property_diagonal_perpendicular_bisection(A,B,C,D,O):Kite(A,B,C,D)&PointOnLine(O,A,C)&PointOnLine(O,B,D)->IsPerpendicularBisectorOfLine(A,O,B,D)\nkite_property_opposite_angle_equal(A,B,C,D):Kite(A,B,C,D)->Eq(Sub(ABC.ma,CDA.ma))\nkite_area_formula_diagonal(A,B,C,D):Kite(A,B,C,D)&Line(B,D)&Line(A,C)->Eq(Sub(ABCD.aq,Mul(BD.ll,AC.ll,1/2)))\nrectangle_judgment_right_angle(A,B,C,D):Parallelogram(A,B,C,D)&Eq(Sub(ABC.ma,90))->Rectangle(A,B,C,D)\nrectangle_property_diagonal_equal(A,B,C,D):Rectangle(A,B,C,D)&Line(A,C)&Line(B,D)->Eq(Sub(AC.ll,BD.ll))\nrhombus_judgment_parallelogram_and_kite(A,B,C,D):Parallelogram(A,B,C,D)&Kite(A,B,C,D)->Rhombus(A,B,C,D)\ntrapezoid_judgment_parallel(A,B,C,D):Quadrilateral(A,B,C,D)&ParallelBetweenLine(A,D,B,C)->Trapezoid(A,B,C,D)\ntrapezoid_area_formula(A,B,C,D):Trapezoid(A,B,C,D)->Eq(Sub(ABCD.aq,Mul(Add(AD.ll,BC.ll),ABCD.hq,1/2)))\nright_trapezoid_judgment_right_angle(A,B,C,D):Trapezoid(A,B,C,D)&Eq(Sub(ABC.ma,90))->RightTrapezoid(A,B,C,D)\nright_trapezoid_area_formular(A,B,C,D):RightTrapezoid(A,B,C,D)->Eq(Sub(ABCD.aq,Mul(Add(AD.ll,BC.ll),AB.ll,1/2)))\nisosceles_trapezoid_judgment_line_equal(A,B,C,D):Trapezoid(A,B,C,D)&Eq(Sub(AB.ll,CD.ll))->IsoscelesTrapezoid(A,B,C,D)\nisosceles_trapezoid_property_diagonal_equal(A,B,C,D):IsoscelesTrapezoid(A,B,C,D)->Eq(Sub(AC.ll,BD.ll))\nround_arc(O,A,B):DoublePointsOnCircle(A,B,O)->Eq(Sub(Add(OAB.mar,OBA.mar),360))\narc_addition_length(O,A,B,C):TriplePointsOnCircle(A,B,C,O)->Eq(Sub(OAC.la,Add(OAB.la,OBC.la)))\narc_addition_measure(O,A,B,C):TriplePointsOnCircle(A,B,C,O)->Eq(Sub(OAC.mar,Add(OAB.mar,OBC.mar)))\narc_property_center_angle(O,A,B,P):DoublePointsOnCircle(A,B,O)&Angle(B,P,A)&IsCentreOfCircle(P,O)->Eq(Sub(OAB.mar,BPA.ma))\narc_property_circumference_angle_external(O,A,B,C):TriplePointsOnCircle(A,B,C,O)&Angle(B,C,A)->Eq(Sub(BCA.ma,Mul(OAB.mar,1/2)))\narc_property_circumference_angle_internal(O,A,B,D):TriplePointsOnCircle(A,D,B,O)&Angle(A,D,B)->Eq(Sub(ADB.ma,Sub(180,Mul(OAB.mar,1/2))))\narc_length_formula(O,A,B):DoublePointsOnCircle(A,B,O)->Eq(Sub(OAB.la,Mul(OAB.mar,1/180*pi,O.rc)))\ncongruent_arc_judgment_length_equal(O,A,B,C,D):DoublePointsOnCircle(A,B,O)&DoublePointsOnCircle(C,D,O)&Eq(Sub(OAB.la,OCD.la))->CongruentBetweenArc(O,A,B,C,D)\ncongruent_arc_judgment_measure_equal(O,A,B,C,D):DoublePointsOnCircle(A,B,O)&DoublePointsOnCircle(C,D,O)&Eq(Sub(OAB.mar,OCD.mar))->CongruentBetweenArc(O,A,B,C,D)\ncongruent_arc_judgment_chord_equal(O,A,B,C,D):DoublePointsOnCircle(A,B,O)&DoublePointsOnCircle(C,D,O)&Line(A,B)&Line(C,D)&Eq(Sub(AB.ll,CD.ll))->CongruentBetweenArc(O,A,B,C,D)\ncongruent_arc_property_length_equal(O,A,B,C,D):CongruentBetweenArc(O,A,B,C,D)->Eq(Sub(OAB.la,OCD.la))\ncongruent_arc_property_measure_equal(O,A,B,C,D):CongruentBetweenArc(O,A,B,C,D)->Eq(Sub(OAB.mar,OCD.mar))\ncongruent_arc_property_chord_equal(O,A,B,C,D):CongruentBetweenArc(O,A,B,C,D)&Line(A,B)&Line(C,D)->Eq(Sub(AB.ll,CD.ll))\nsimilar_arc_judgment_cocircular(O,A,B,C,D):DoublePointsOnCircle(A,B,O)&DoublePointsOnCircle(C,D,O)->SimilarBetweenArc(O,A,B,C,D)\nsimilar_arc_property_length_ratio(O,A,B,C,D):SimilarBetweenArc(O,A,B,C,D)->Eq(Sub(Log(OAB.la),Add(Log(OCD.la),Log(OCDAB.rsa))))\nsimilar_arc_property_measure_ratio(O,A,B,C,D):SimilarBetweenArc(O,A,B,C,D)->Eq(Sub(Log(OAB.mar),Add(Log(OCD.mar),Log(OCDAB.rsa))))\ncircle_property_length_of_radius_and_diameter(O):Circle(O)->Eq(Sub(O.dc,Mul(O.rc,2)))\ncircle_property_circular_power_chord_and_chord(A,E,B,C,D,O):DoublePointsOnCircle(A,B,O)&DoublePointsOnCircle(C,D,O)&PointOnLine(E,A,B)&PointOnLine(E,C,D)->Eq(Sub(Add(Log(EC.ll),Log(ED.ll)),Add(Log(EA.ll),Log(EB.ll))))\ncircle_property_circular_power_tangent_and_segment_line(P,A,C,D,O):IsTangentOfCircle(P,A,O)&DoublePointsOnCircle(C,D,O)&PointOnLine(C,P,D)->Eq(Sub(Add(Log(PA.ll),Log(PA.ll)),Add(Log(PC.ll),Log(PD.ll))))\ncircle_property_circular_power_segment_and_segment_line(P,A,B,C,D,O):DoublePointsOnCircle(A,B,O)&DoublePointsOnCircle(C,D,O)&PointOnLine(A,P,B)&PointOnLine(C,P,D)->Eq(Sub(Add(Log(PA.ll),Log(PB.ll)),Add(Log(PC.ll),Log(PD.ll))))\ncircle_property_circular_power_tangent_and_segment_angle_1(P,A,C,D,O):TriplePointsOnCircle(A,C,D,O)&PointOnLine(C,P,D)->Eq(Sub(Sub(ODA.mar,OAC.mar),Mul(APC.ma,2)))\ncircle_property_circular_power_tangent_and_segment_angle_2(P,A,C,D,O):TriplePointsOnCircle(C,A,D,O)&PointOnLine(C,P,D)->Eq(Sub(Sub(OAD.mar,OCA.mar),Mul(CPA.ma,2)))\ncircle_property_circular_power_segment_and_segment_angle_1(P,A,B,C,D,O):QuadruplePointsOnCircle(A,C,D,B,O)&PointOnLine(A,P,B)&PointOnLine(C,P,D)->Eq(Sub(Sub(ODB.mar,OAC.mar),Mul(APC.ma,2)))\ncircle_property_chord_perpendicular_bisect_chord_1(O,P,M,A,B):DoublePointsOnCircle(A,B,O)&PointOnLine(M,A,B)&IsCentreOfCircle(P,O)&Eq(Sub(AMP.ma,90))->IsPerpendicularBisectorOfLine(P,M,A,B)\ncircle_property_chord_perpendicular_bisect_chord_2(O,P,M,A,B):DoublePointsOnCircle(A,B,O)&PointOnLine(M,A,B)&IsCentreOfCircle(P,O)&Angle(A,M,P)&Eq(Sub(AM.ll,MB.ll))->IsPerpendicularBisectorOfLine(P,M,A,B)\ncircle_property_chord_perpendicular_bisect_arc_1(O,A,B,P,M,D):TriplePointsOnCircle(A,D,B,O)&PointOnLine(M,A,B)&PointOnLine(M,P,D)&IsCentreOfCircle(P,O)&Eq(Sub(AMP.ma,90))->Eq(Sub(OAD.la,ODB.la))\ncircle_property_angle_of_osculation_2(O,A,B,P):DoublePointsOnCircle(A,B,O)&Angle(P,B,A)&IsTangentOfCircle(P,B,O)->Eq(Sub(PBA.ma,Mul(OAB.mar,1/2)))\ncircle_perimeter_formula(O):Circle(O)->Eq(Sub(O.pc,Mul(2*pi,O.rc)))\ncircle_area_formula(O):Circle(O)->Eq(Sub(O.ac,Mul(pi,O.rc,O.rc)))\nradius_of_circle_property_length_equal(P,A,O):PointOnCircle(A,O)&Line(P,A)&IsCentreOfCircle(P,O)->Eq(Sub(PA.ll,O.rc))\ndiameter_of_circle_judgment_pass_centre(A,P,B,O):DoublePointsOnCircle(A,B,O)&PointOnLine(P,A,B)&IsCentreOfCircle(P,O)->IsDiameterOfCircle(A,B,O)\ndiameter_of_circle_judgment_right_angle(B,C,A,O):TriplePointsOnCircle(B,C,A,O)&Eq(Sub(BCA.ma,90))->IsDiameterOfCircle(A,B,O)\ndiameter_of_circle_property_length_equal(A,B,O):IsDiameterOfCircle(A,B,O)->Eq(Sub(AB.ll,O.dc))\ndiameter_of_circle_property_right_angle(B,C,A,O):IsDiameterOfCircle(A,B,O)&TriplePointsOnCircle(B,C,A,O)&Angle(B,C,A)->RightAngle(B,C,A)\ntangent_of_circle_judgment_perpendicular_1(P,A,O,Q):PointOnCircle(A,O)&IsCentreOfCircle(Q,O)&Angle(Q,A,P)&Eq(Sub(QAP.ma,90))->IsTangentOfCircle(P,A,O)\ntangent_of_circle_property_perpendicular_1(P,A,O,Q):IsTangentOfCircle(P,A,O)&Angle(Q,A,P)&IsCentreOfCircle(Q,O)->RightAngle(Q,A,P)\ntangent_of_circle_property_perpendicular_2(P,A,O,Q):IsTangentOfCircle(P,A,O)&Angle(P,A,Q)&IsCentreOfCircle(Q,O)->RightAngle(P,A,Q)\ntangent_of_circle_property_length_equal(P,A,B,O):IsTangentOfCircle(P,A,O)&IsTangentOfCircle(P,B,O)->Eq(Sub(PA.ll,PB.ll))\nsector_area_formula(O,A,B):DoublePointsOnCircle(A,B,O)->Eq(Sub(OAB.as,Mul(OAB.mar,1/360*pi,O.rc,O.rc)))\n\n\nB、可使用的工具\n你可以使用工具辅助你求解几何问题,现在系统内定义了6种工具,实现与求解器的交互。工具的使用方法和作用描述如下:\n\n1.apply(theorem)。尝试应用一条定理theorem扩展已知条件,并返回应用结果。如应用平行线的传递性定理,可以表示为apply(parallel_judgment_par_par()),推理器会自动组合所有相关前提得到对应结论。成功应用定理后,返回应用当前定理添加的新条件;应用定理不成功,则返回失败原因(如某个前提不存在);也可能返回报错信息,如定理未定义等。此外对于某些定理,必须使用带参数的定理形式,这些定理为bisector_of_angle_property_line_ratio、right_triangle_property_pythagorean、circle_property_circular_power_chord_and_chord、circle_property_circular_power_tangent_and_segment_line、circle_property_circular_power_segment_and_segment_line、以及求解周长(perimeter)和面积(area)相关的定理、相似(similar)的判定和性质定理、全等(congruent)的判定和性质定理。例如想要求解三角形ABC的面积,需调用工具apply(triangle_area_formula_common(A,B,C))。除这些定理外,对于其他定理,强烈建议使用定理的无参模式。\n\n2.decompose(theorem)。尝试使用一条定理theorem分解某个目标,并返回分解结果。这个工具可以将定理的结论分解为他的前提,如分解平行线的传递性定理,decompose(parallel_judgment_par_par(A,B,M,N,X,Y)),若存在目标ParallelBetweenLine(A,B,X,Y),推理器会将其分解为ParallelBetweenLine(A,B,M,N)和ParallelBetweenLine(M,N,X,Y)两个子目标。与apply(theorem)工具不同,decompose(theorem)只能使用定理的带参数形式。成功使用定理分解目标后,返回新分解的子目标;使用定理分解目标不成功,则返回失败原因(如待分解的目标不存在);也可能返回报错信息,如定理未定义等。\n\n3.find_fact(relation_type)。返回所有种类为relation的条件。例如调用find(ParallelBetweenLine),可能会返回(A,B,C,D), (C,D,E,F)等;也可能返回报错信息,如关系未定义等。\n\n4.find_goal(relation_type)。返回所有种类为relation的目标。例如调用find(ParallelBetweenLine),可能会返回(A,B,X,Y);也可能返回报错信息,如关系未定义等。\n\n5.check()。返回当前几何问题的目标是否被成功求解。你可以使用这个工具,判断自己的求解过程是否要终止。特别要注意只有check()的返回结果才可以作为求解过程是否要终止的依据,解题过程需要经过形式化系统的验证。\n\n6.finish()。当你调用check()发现当前几何问题的求解目标已成功求解,简单总结求解过程,并调用finish()结束求解。\n\n\nC、你的行为描述\n你现在作为一个研究平面几何问题的专家,使用形式化求解器FormalGeo,根据求解器的反馈,交互式的求解几何问题。只有经过求解器一步步验证,调用check()工具,得到的反馈信息是问题已经求解时,才算求解完成。求解几何问题时,可以采取两种思路。第一种思路是前向求解,根据问题的已知条件,使用定理推导出新的条件,直至目标被推导出;第二种是后向求解,从问题的目标出发,使用定理将其分解为子目标,直至某个解题路径的子目标全部已知。这两种思路可以在解题过程中混合使用,即调用上述工具apply(theorem)和decompose(theorem)。当你在某一步制定计划后,后续的步骤尽量按照计划一步步执行,如果中途发现部分计划无法实现,你需要重新调整计划。你的输出必须是以下JSON格式:\n\n{\n \"thinking\":\"你的思考过程和下一步计划\",\n \"action\":\"你希望调用的工具\"\n}\n\nthinking的内容是你的思考过程和下一步计划。action的内容是你希望调用的工具,严格按照要求的格式调用。\n\n\nD、输出示例\n以下是几个输出示例,你必须严格按照此JSON格式输出(thinking的内容只是提供示例,不要求与其相同的句式)。\n\n示例1:\n{\n \"thinking\":\"这个几何问题要求得到三角形的面积,已知...定理的前提都已满足,可以调用apply工具推出结论。面积相关的定理需要加定理参数。\",\n \"action\":\"apply(triangle_area_formula_common(A,B,C))\"\n}\n\n示例2:\n{\n \"thinking\":\"这个几何问题要求推导出平行关系,...调用apply工具,使用定理的无参数形式,推出所有平行相关的结论。\",\n \"action\":\"apply(parallel_judgment_par_par())\"\n}\n\n示例3:\n{\n \"thinking\":\"这个几何问题要求推导...暂且无求解思路,可以尝试将目标分解。\",\n \"action\":\"decompose(midpoint_of_line_judgment(M,A,B))\"\n}\n\n示例4:\n{\n \"thinking\":\"上述解题过程已经推导出...在应用定理前,我需要查看当前已知条件存在哪些代数关系。\",\n \"action\":\"find_fact(Eq)\"\n}\n\n示例5:\n{\n \"thinking\":\"已知目标...在应用定理前,我需要查看当前需要求解的平行关系目标有哪些。\",\n \"action\":\"find_goal(ParallelBetweenLine)\"\n}\n\n示例6:\n{\n \"thinking\":\"通过上述解题过程,可以...我需要验证问题是否已经成功求解。\",\n \"action\":\"check()\"\n}\n\n示例7:\n{\n \"thinking\":\"调用check()工具后,已确认问题已经成功求解,结束解题。\",\n \"action\":\"finish()\"\n}\n<system prompt end>"
},
{
"role": "user",
"content": "当前问题的状态描述如下所示:\n几何图形的结构信息描述:\nShape(RS,ST,TR), Shape(XY,YZ,ZX)\n几何问题的初始已知条件:\nCongruentBetweenTriangle(R,S,T,X,Y,Z), Eq(TR.ll-x-21), Eq(ZX.ll-2*x+14), Eq(TRS.ma-4*y+10), Eq(ZXY.ma-3*y-5)\n几何问题的求解目标和状态(括号内数字表示目标状态,0表示此目标待求解,1表示此目标已求解,-1表示此目标不可能实现):\nEq(y-15)(0)\n解析几何图形的结构信息得到的实体:\nPoint: (T), (X), (R), (Z), (S), (Y)\nLine: (Z,X), (R,S), (T,S), (R,T), (S,T), (Y,X), (Z,Y), (Y,Z), (X,Z), (S,R), (T,R), (X,Y)\nAngle: (X,Y,Z), (Z,X,Y), (Z,Y,X), (X,Z,Y), (S,R,T), (T,S,R), (Y,Z,X), (R,T,S), (S,T,R), (R,S,T), (Y,X,Z), (T,R,S)\nTriangle: (X,Y,Z), (Z,X,Y), (Y,Z,X), (S,T,R), (R,S,T), (T,R,S)\n按条件类型列出的所有已知条件:\nCongruentBetweenTriangle: (R,S,T,X,Y,Z), (S,T,R,Y,Z,X), (T,R,S,Z,X,Y)\n按照方程变量是否相交来分组,得到的代数方程组(所有方程省略'=0'、组序号可能不连续):\nGroup 1: TR.ll-x-21, ZX.ll-2*x+14\nGroup 3: TRS.ma-4*y+10, ZXY.ma-3*y-5\n初始目标和所有分解得到的目标(括号内数字表示目标状态,0表示此目标待求解,1表示此目标已求解,-1表示此目标不可能实现):\nEq(y-15)(0), 初始目标"
},
{
"role": "assistant",
"content": "{\n \"thinking\": \"我们需要利用全等三角形的性质来得到对应边和对应角的相等关系。已知全等关系 CongruentBetweenTriangle(R,S,T,X,Y,Z) 以及其对称形式。为了得到 TR.ll = ZX.ll,我们可以使用 congruent_triangle_property_line_equal 定理,参数选择 (S,T,R,Y,Z,X),因为此时 BC 边为 TR,EF 边为 ZX,正好对应。为了得到角 TRS.ma = ZXY.ma,可以使用 congruent_triangle_property_angle_equal 定理,参数选择 (R,S,T,X,Y,Z),因为此时角 CAB 为 TRS,角 FDE 为 ZXY。先应用边相等的定理。\",\n \"action\": \"apply(congruent_triangle_property_line_equal(S,T,R,Y,Z,X))\"\n}"
},
{
"role": "user",
"content": "工具执行结果:\n定理'congruent_triangle_property_line_equal(S,T,R,Y,Z,X)'执行成功,以下为问题的状态更新。\n新推导出的条件:\nEq(TR.ll-ZX.ll)\nEq(TR.ll-56)\nEq(ZX.ll-56)\nEq(x-35)"
},
{
"role": "assistant",
"content": "{\n \"thinking\": \"使用 congruent_triangle_property_angle_equal 定理得到角 TRS 等于角 ZXY。\",\n \"action\": \"apply(congruent_triangle_property_angle_equal(R,S,T,X,Y,Z))\"\n}"
},
{
"role": "user",
"content": "工具执行结果:\n定理'congruent_triangle_property_angle_equal(R,S,T,X,Y,Z)'执行成功,以下为问题的状态更新。\n新推导出的条件:\nEq(TRS.ma-ZXY.ma)\nEq(TRS.ma-50)\nEq(ZXY.ma-50)\nEq(y-15)\n部分目标的状态更新为(括号内数字表示目标状态,0表示此目标待求解,1表示此目标已求解,-1表示此目标不可能实现):\nEq(y-15)(1)"
},
{
"role": "user",
"content": "检测到问题已求解,自动结束。"
},
{
"role": "user",
"content": "求解结束:成功✅"
}
]
]
}
MIT License
感谢Datawhale社区、Hello-Agents项目以及FormalGeo项目!