1.简介
随着计算机系统的发展及其越来越多的使用,人们更容易看到技术对包括教育和卫生在内的几个不同领域的影响。近年来,教育实践和教材发生了许多技术变革。所使用的技术为学生和教师带来了重大的教育变革。在这方面,教室配备了数字学习工具,如计算机和手持设备。有可能在不受时间和地点限制的情况下利用独立培训。这导致了在线参与平台的建设,并增强了学习者的动机。此外,新技术为学生和教师之间的交流提供了一种新模式,以支持在这种模式的阴影下进行个性化教育的可能性。一般来说,技术改变了教育实践,改变了学生学习的方式、时间和地点,并在教育的每个阶段赋予他们权力。
数学表达式的编写有几个原因,例如学校考试练习和函数优化算法。一些系统可能使用数学方程数据库,其中所有表达式都只写一次,然后多次使用。此类方程的解或答案可能以非动态方式存储,这可能导致类型缺乏多样性。此外,有各种随机生成数学表达式的方法。根据涉及的运算符、操作数和变量,可以实现不同类型的生成器。
本文介绍了一种自动生成数学表达式的语法导向方法。生成过程与表达式的合成密切相关。与分析相反,合成采用构成表达式的术语,并将它们组合在一起,从而生成表达式。由于分析和合成都涉及通过语法规则对语言的描述,因此在某种程度上也可以使用分析语法进行合成。然而,这些活动表现出两种不同的不确定性;分析包括确定哪种可能的表示最适合特定表达式,而合成包括确定哪一种可能的表达式最适合特定表示。我们可以把合成看作是线性化加上语法实现规则的问题。一般来说,与分析相比,模糊性在综合中不是问题。
生成数学表达式是学习系统中的一个重要主题。学习者需要练习和解决各种数学问题,以提高他们的解决技能。本文针对一阶方程和多项式等主题,提出了一种基于各种类型表达式的数学表达式生成器。
2.相关工作
在这项工作中,使用了类似上下文自由语法(CFG-like Grammar)来解析和生成数学表达式。字符串输入被传递给验证其语法的解析器。同时,还创建了一个抽象语法树(AST),它是一种适用于处理数学表达式的数据结构。该树是所提方法的主要核心部分,用于对字符串输入应用各种增强算法。这种结构已用于其他应用,如解决数学问题[1]. 在自然语言生成(NLG)中,使用模板开发了不同的系统来生成表达式。YAG公司[2]为通用目的实时生成基于模板的字符串。D2S(数据到语音)[三]已开发用于不同的应用程序,例如路由描述、音乐、足球报告,以及不同的语言,包括英语。范例[4]是一个面向对象、基于规则的框架,支持动态文本生成,是JAVA的超集,可以用作HTML/SGML的模板。XtraGen公司[5]是一个基于XML和JAVA的NLG软件系统,可以轻松与其他应用程序集成。 蒂尔曼·贝查尔[6]提出了一种使用TAG生成基于模板的NLG的方法。这项工作的重点是通过集成基本树节点来随机生成语言。当然,随机模板生成并不局限于随机字符串生成;例如,Amruth N.Kumar[7]使用模板生成问题和程序。测试用例生成是随机生成的另一个应用。Takahide Y.等人[8]设计了一个工具来为实时(JIT)编译器生成测试。在设计自动测试时,也提出了随机生成的问题。设计了各种系统来帮助教师生成问题[9,10,11]. 在[12]Joao等人创建了一个系统,用简单的答案生成自动数学测试,其中一些结构被设计用于生成测试。在[13]Ana Paula设计了一个基于约束逻辑编程(CLP)的数学习题自动生成系统。此类系统为在虚拟培训系统等环境中自动生成测试提供了便利。 自然语言处理(NLP)中也考虑了随机生成,导致在NLG标题下开发了不同的系统,例如Langkilde采取的措施[14]对NLG使用随机技术。这些系统可以分为两类:真实系统和基于模板的系统。基斯·范·迪姆特[15]对这些类别进行了比较。 Microsoft MathWorksheet Generator会自动生成数学问题。这种方法仅限于较简单的代数域,如计数、线性和二次方程求解。此外,每个域都有自己的一组功能,需要单独编程。
上面提到的大多数研究都涉及文本短语的生成,特别是为使用NLP模式生成文本提供解决方案。这些研究涉及诸如查找实时文本结构、创建文本并将其与语音匹配、为编程语言和其他系统构建测试用例等问题。然而,它们没有一个合适的系统结构来产生一些特定的数学表达式。类似地,还进行了其他研究,使用为术语或特定问题创建的模板来生成或设计表达式。用户不能使用设计的模板生成其他类型的表达式。此外,还开发了一些商业应用程序来支持数学要求。文献中没有关于其底层算法和数据结构的信息。它们以非用户控制的方式自动生成表达式,并且只对从用户角度进行的评估开放。
本文中介绍的方法是面向语法的。因此,随着语法规则的改变,可以创建新的模式作为生成不同数学表达式的适当模板。这为产生和设计各种研究科学中的任何常见数学表达式或其他短语提供了一种有用的方法。使用所提出的方法,用户可以根据主题设计和定制语法,并创建自己的表达式。
3.生成表达式的传统方法
本节将介绍表达式的各种生成方式。生成数学表达式的一个重要问题是生成的短语应该根据需要进行设计。在本节中,将检查和评估与生成具有特定特征的任意表达式相关的问题,并讨论结构化方法的必要性。
3.1. 迭代方法
生成随机数学表达式的简单方法是在操作符和数字域中使用格式良好的生成算法,如清单1所示。
该算法通过从集合[+、−、*、/]和数字操作数中随机选择一个运算符来生成代数表达式。示例表达式为“23+5×3−2/3+10”。
清单2中给出了多项式表达式的类似算法。当初始值为n次时,该算法可以生成最多包含n个项的多项式。典型的例子是多项式“3x5− 8x2+ 9”.
清单1。一种随机生成算术表达式的算法。
Str←生成随机数 while条件 运算符←从{+,-,中选择一个随机运算符,×, /} 操作数←生成随机数 Str←Str.运算符。操作数 |
可以通过添加其他属性(例如括号)来改进这些算法。然而,在这种情况下,必须控制表达式的生成过程,以进行不同类型的评估或解释。
清单2。多项式表达式的随机生成算法。
n←多项式中的项数 c←生成随机数 polyExp←c.'xn个’ n-- 当n>0时 c←生成随机数 如果c>0:polyExp←polyExp.“+”。c.“xn个’ 如果c==0; 如果c<0:polyExp←polyExp.'-'。c.xn个’ n-- |
3.2. 基于规则的方法
通常,我们需要一个符合生成表达式递归性质的特殊结构。此结构必须具有二叉树的所有属性。图1显示“((x+年)/2) × (一+b条) − 12”. 二叉树是一种合适的数据结构,支持包含代数运算符和单参数函数。它提供了一种表示运算符优先级的简单方法。除此之外,很容易将树转换为其他数据结构,以满足文档格式化程序的要求。另一个优点是它支持形式语法的开发,因为每个树节点的求值类似于语法规则的头部(父节点)和主体(子节点)的递归调用。
图2显示了使用树创建随机数学表达式所需的数学组件的框图。 在图2,Randomizer是一个规则选择器,它首先将语法的开始规则放入AST,然后递归扩展该规则中的非终结符,用其他可能的规则替换它们,直到遇到不可扩展的规则。表1显示了一个语法规则示例,可以将其放入索引表中以便于选择。 请注意表1不要考虑运算符的优先级,这将在评估阶段考虑。清单3显示了中Randomizer组件使用的主要算法图2.
清单3。随机表达式生成算法。
AST←启动符号 当AST中存在非终端时 E类 ← 在AST中选择非终端 附属的 ← 使用随机规则展开E AST公司 ← 将AST中的E替换为sub 按顺序遍历AST并打印数学表达式 |
在清单3中,可以调用非终结符序列;因此,按指定顺序规则S、E和D。例如,得到的AST和表达式将是数字(7)和“7”。
当前算法的一个问题是,规则可以创建无限数量的非终结符,例如“S→E→E+E→E+E+E→E++E+E…”. 随机语法[16]可用于控制所调用规则的状态。初始化算法中每个规则的调用概率,通过表达式步骤进行控制,我们可以将为AST扩展的非终端数量限制为有限值。可以对以下参数施加一些限制: 输出表达式的长度
AST中的节点数
AST中的级别数。
这些参数确定AST的表达水平,生成所需特性的数学表达式。清单4显示了清单3中所示算法的改进版本。
清单4。基于清单3中的算法的改进算法。
AST←启动符号 N个 ← 最大节点数 n个 ← 0 当AST中存在非终端时 E类 ← 在AST中选择非终端 如果(n<n),则 附属的 ← 使用随机规则展开E 其他的 附属的 ← 使用不带非终结符的随机规则展开E AST公司 ← 用AST中的接头替换E 按顺序遍历AST并打印数学表达式 |
3.3. 表达式的类型特定语法
表达式的生成和评估方法因数学学科而异。因此,很明显,不同类型的表达式需要不同的语法。在这一节中,我们首先关注线性(一次)和二次方程,然后介绍一种新的语法,称为规则迭代上下文无关语法。
3.3.1. 一阶方程的语法
在一次方程式中,符号“=”左侧和右侧的项的阶数为1,表示x一次多项式可以用几种方法构造。清单5提供了一个CFG语法,它考虑了生成1次多项式的所有可能方法。例如,表达式“(x− 1)/(1 −x)=−1“语法生成的将对应于一级方程式”x− 1 = 1 −x”.
清单5。一阶方程的上下文无关语法。
G={N,T,P,S} N={E,E',S,var,数字,数字}⊆Σ T={x,+, −, *} ⊆ Σ S公司 ⟶ E“=”E|E“/”E“=“E” E类 ⟶ E“+”E|E“−”E|number|var E类 ⟶ E“*”E'|E'“*”E E’ ⟶ E'“+”E'|E'“−”E'|1'“*”E'|编号 变量 ⟶ x 编号 ⟶ “−”? [数字]+[“.”[数字]+]? 数字 ⟶ [“0” − “9”] |
3.3.2. 二次方程语法
注意,带有除法运算符(/)的E的替代产生式规则表示右侧带有常数的方程。清单6给出了二次方程的另一种语法。
清单6。二次方程的CFG文法。
G={否,T型,P(P),新加坡 N={E,E’,E“,S公司,无功功率,无功功率,数字,数字} T={x,+,−,*,/,^} S公司 ⟶E“=”E E类 ⟶E“+”E|E“−”E|number|var|var^2 E类 ⟶E'“*”E'|E“*”E“|E''”“*”E E’ ⟶E'“+”E'|E'“−”E'| E'“*”E''|E''“*”E'|number|var E“ ⟶E''“+”E''“|E''”“−”E|E''“”*“E''”|编号 无功功率,无功功率 ⟶x 数⟶“−”? (数字)+[“.”(数字)+]? 数字 ⟶[“0”–”9”] |
清单6解释了一次方程和二次方程的语法,以及CFG语法如何生成一次多项式。
清单5和6对输出表达式的长度或运算符的数量没有结构控制。必须考虑上一节中讨论的限制,以控制表达式生成。
3.4. 统计空间分析
由所讨论的语法生成的数学表达式可以随机选择,也可以从无限多的表达式中选择。如果我们通过可测量的参数来限制表达式生成空间,例如树的最大节点数或级别,则有可能将问题的无限空间转换为有限空间。
假设产生数学表达式的极限与节点的数量有关。对于一棵有n个节点,其中一个节点是根节点n个−1内部节点是底层节点的子节点或父节点。显然,有一种方法可以生成零节点或一节点的二叉树。公式(1)计算具有n个节点的二叉树的数量,简称为加泰罗尼亚数[16]. 树的总数,最多可包含n个节点,通过公式(2)计算哪里N个表示最大节点数。根据AST中运算符、操作数和函数的类型和位置,可能会出现各种组合,导致不同的数学表达式。仅使用节点数计算AST的变化并不容易。我们可以根据树的深度来确定它。 等式(3)计算单个级别上可能的AST数量。哪里v(v)和d日分别是可以构成AST的单叶的变量和整数的数量。图3显示了最多两个级别的可能AST。 因此,AST的数量可以用等式(4)表示。哪里F类是函数数,例如sin和ln,以及P(P)是运算符的数目,例如“+”和“*”。图4演示了通过最多三个级别构建的AST。 一般来说,我们可以根据最多L(左)水平,如方程式(6)所示。 表2显示了一些较小值的AST数量L(左),假设有P(P)=5名操作员,F类=8个功能,v(v)=1个变量,以及d日=100位数字。 可以在八个级别创建的AST数量非常高。这意味着该方法可以产生许多不同的AST。然而,一些AST可能包含不值得构造的表达式。在这个方面,它使用了一种不使用AST生成表达式的算法。另一方面,我们需要一些控制,而不是生成的表达式中的节点数或级别数。例如,规则调用步骤必须在合理的时间内结束,而不必等待生成特定类型的表达式。接下来,我们提出了一种解决这些问题的新方法。其主要目的是解释带符号(/)的除法运算符表示右侧带有数字的方程。
4.材料和方法
4.1. 规则迭代上下文无关语法(RI-CFG)
清单5和清单6中的语法有可能生成无限数量的方程。生产过程必须保证通过在规则调用方面使用确定性语法来终止。基于规则的语法,如CFG,没有方便的结构来将规则调用的数量限制在某个特定的值。清单7给出了这样的语法。与其他类型语法的比较超出了本文的范围。
因此,我们提出了一种基于规则的上下文无关语法,简称为RI-CFG。
RI-CFG用G=表示<T型,N个,P(P),S公司>,其中T和N分别是终端和非终端的不相交有限非空集;S∈N是开始符号;P是一个非空的有限规则集。P中的每一组规则的形式为“u个→v(v),n个“,其中u个∈N,v(v)∈(NT)*,N是一个正整数,表示非终结表达式中的规则选择数。设n为特定于规则的选择数。在这种情况下,对于n个=1时,系统的行为类似于CFG。清单8显示了用于加法表达式的RI-CFG语法的一个小示例。
清单8。一个示例规则修改的上下文无关(RI-CFG)语法。
清单8。一种示例规则迭代上下文无关(RI-CFG)语法。
S→DT,1 T→+D,2 D→ 0|1|...|9,2 |
使用清单8中的语法,可以导出表达式“12+63+47”,如表3. RI-CFG语法的使用有助于控制生成过程。通过规则的迭代,可以生成所需类型的数学表达式。根据给定的迭代次数,迭代语法看起来像是规则的逐步顺序排列。通过这种方式,它要求CFG语法必须转换为迭代形式。
4.1.1. 语法操作
与解析表达式一样,表达式生成也必须通过可以为语法的每个非终结符单独定义的函数来控制。这些函数中的每一个通常都是作为一个循环来实现的,并具有一定的迭代次数。清单9显示了这样一个名为repeater()的函数的典型实现,其中Rule类包含语法规则列表。
清单9。名为repeater()的生成函数的实现。
清单9。名为repeater()的生成函数的实现。
公共规则[]中继器(规则r) 输出←[] 对于我来说=1到r.n 外推(r.v) 返回 |
表达式生成可以通过语法规则的迭代进行定制。例如,通过将不同的值指定给x,我们可以得到不同类型的表达式,如一次方程和二次方程。特定类型的表达式由一个类表示,在该类中为语法规则的迭代次数设置了一个值。可以定义表示不同类型表达式的各种类。清单10中显示了修改后的语法规则,清单4中给出了一个新的语法规则。
清单10。清单4中语法的增强版本。
AST←起始符号 N个 ← 最大节点数 n个 ←0 当AST中存在非终端时 E类 ← 在AST中选择非终端 如果(n<n) 附属的 ← 使用随机规则展开E 其他的 附属的 ← 使用不带非终结符的随机规则展开E 附属的 ← 中继器(sub,E.n) #使用清单9 AST公司 ← 用AST中的接头替换E 按顺序遍历AST并打印数学表达式 |
4.1.2. CFG与RI-CFG
在本节中,我们通过一些特定的例子来比较CFG和RI-CFG语法。尽管RI-CFG语法在某些情况下几乎与CFG相同,但它们在复杂表达式中有显著差异。表4显示了生成相同语言句子的CFG和RI-CFG语法的示例。请注意,RI-CFG规则具有受控的迭代次数。 另一个比较示例如所示表5注意,与CFG不同,RI-CFG语法包含额外的非终结符A和B。虽然这增加了非终结符的数量,但接受与CFG相同语言的RI-CFG(例如,与n个b条2个)可以很容易地导出。此类语法的另一个重要点是,规则的迭代次数可以在运行时动态更改。因此,在不改变现有语法的情况下,始终可以构造语法的扩展。 具有特定限制的CFG语法需要复杂的结构和对生成的字符串的各种控件。然而,通过所建议的语法很容易应用这些限制。表6显示了CFG和RI-CFG符号中一阶方程的语法。 中的语法表6生成一阶方程n个条款。如前所述,整数n个可以在实现期间甚至在运行时输入以更改术语数。此外,可以从中为n选择一个随机整数值n个一到n个b条. 通过添加、修改或替换一些规则,我们可以轻松地转换表6到另一个。例如,语法将在添加规则后开始生成二次方程”T型⟶Dx公司2”. 4.2. 一种表达式生成方法
在前面的部分中,我们讨论了生成随机数学表达式的重要性。本节介绍一种基于语法的方法,该方法使用表达式模板生成不同类型的表达式。
4.2.1. 基于RI-CFG的表达式生成
该方法通过RI-CFG文法管理表达式生成过程。使用这种方法,可以很容易地嵌入大量的表达式模板。图6显示了该方法的步骤。 在图6,语法池包含用于一次方程、二次方程、多项式、三角方程等的各种RI-CFG模板。我们开发了一个名为RICFG的类,它具有Rule、grammar和其他类的核心实现。这个RICFG类由每个表达式模板扩展。 语法发展
在这种方法中,首先我们开发了一种专用于目标数学表达式的RI-CFG语法。清单11显示了这种语法的典型示例。
在清单11中@n个我是语法的一个属性,用于控制生成的词条数量。该属性控制相关规则在有限次数内的迭代。清单11中所示方法的其他组件将在以下部分中进行描述。
清单11。RI-CFG语法示例。
S公司⟶ DT公司, 1 T型⟶ [+D |−D],@n个1 D类⟶ [0|1|2...|9],@n个2 |
类别定义
在我们对表达式的分析中,每个语法规则都用一个类表示,该类可以使用任何面向对象的编程语言定义。我们用Java语言编写规则,扩展了RI-CFG类。超类RI-CFG包含以下方法hasNonTerminal(),选择随机规则()、和生成()这里,我们给出一种方法,生成(),如清单12所示。
清单12。一种方法,生成(),属于RICFG类。
公共Exp生成(){ ArrayList<对象> 列表 = 新建ArrayList(); list.add(开始); while(hasNonTerminal(列表)){ 规则nt=getFirstNonTerminal(列表); replaceOnce(列表,SelectRandomRule(nt).repeat()); } 返回getAST(列表); } |
根据清单12中的语法规则,非终结符T型和D类由类表示非终端。规则及其替代项被实现为类Rule的对象。清单13演示了规则的类实现。
清单13。模板的类定义。
//秒⟶ DT中,1 //T型 ⟶ [+D |−D],@n1 //D类 ⟶ [0|1|2...|9],@n2 公共类ExampleGrammar扩展了RICFG{ public void ExampleGrammar(范围n1,范围n2) { NonTerminal T=非终端.get(“T”); NonTerminal D=非终端.get(“D”); pool=新的ArrayList() pool.add(新规则(启动,新建对象[]{D,T}, 1)); pool.add(新规则(T,新建对象[]{“+”,D}公司,n个1)); pool.add(新规则(T,新对象[]{“−”,D}公司,n个1)); pool.add(新规则(D,“0”,n个2)); pool.add(新规则(D,“1”,n个2)); pool.add(新规则(D,“2”,n个2)); ... pool.add(新规则(D,“9”,n个2)); } } |
在清单13中,类示例语法可以使用其他方法支持,以实现简单性和定制。
清单14显示了清单13中的伪代码。
清单14。模板类定义的伪代码。
定义: 结构范围{ 最小值作为双精度 最大值作为双精度 } 伪代码:
- 1.
制作规则列表 - 2.
将每个规则添加到列表中 - 三.
为每个规则设置一个范围 - 4.
退货清单
|
模板施工
表达式模板实际上是作为RICFG相关类的对象实现的,其中属性被设置为适当的值。为了生成各种形式的表达式,操作对象属性就足够了。可以将模板集合打包为框架,以支持各种形式的数学表达式。清单15显示了清单13中定义的规则的一些表达式模板。
表达式模板的使用是一种元编程技术,它在编译时构建表示计算的结构,其中表达式仅在生成整个计算的高效代码时才进行计算。表达式的关键思想是创建可重用且高效的代码。
清单15。一些表达式模板的定义。
//两位数表达式 语法术语示例1=new ExampleGrammar(新范围(1, 5),新范围(2, 2)); //表达式三到10条款 语法术语示例2=new ExampleGrammar(新范围(3, 10),新范围(1, 4)); |
表达式的生成
方法生成()清单12中列出了一个AST。使用AST很容易,因为它可以提供处理数学表达式的有用方法。例如,我们可以在AST上定义特定的方法,将其内容转换为MathMl和LaTex中的可读字符串。清单16显示了清单15中给出的模板的输出。
清单16。清单15中的模板输出。
//术语输出1 12 + 49 − 30 51−25 //术语2的输出 782 + 63 + 4 − 5120 + 8 + 1 − 576 + 23 7 + 163 − 2 + 87 |
4.2.2. 应用
实现模板的类充当该模板表示的特定类型表达式的生成器。表达式模板可以使用一组其他模板。在本节中,我们将演示使用模板生成多项式的方法的一些应用。Java符号用于代码演示。
多项式
多项式是由不同的项或单项式相加或相减组成的。每一个单项式都有一个众所周知的结构。多项式表达式可以由清单17中给出的RI-CFG语法定义。
清单17。多项式表达式的RI-CFG语法。
S公司⟶ 手动变速器,1 T型 ⟶ [+M|−M],@n1 M(M) ⟶ DP、,1 P(P) ⟶ [xR|x],1 R(右) ⟶ [*x],@n2 D类 ⟶ [0|1|2...|9],@n2 |
在清单17中,N个是单项式的数量,P(P)是最大指数,并且C类是系数的值范围。这三个属性用于控制多项式表达式的生成。定义了一个名为TPolynomial的类来实现多项式的语法,如清单18所示。
清单18。清单17的代码实现。
公共类T多项式扩展RICFG{ 公共范围计数=新范围(); public Range指数=新Range(); 公共范围系数=新范围(); 公共T多项式(){ 非终端T=非终端.get(“T”); 非终端M=非终端.get(“M”); 非终端P=非终端.get(“P”); 非终端R=非终端.get(“R”); 非终端D=非终端.get(“D”); pool=新的ArrayList() pool.add(新规则(START,新目标t[]{M,1)); pool.add(新规则(T,新对象[] {“+”,M},n1)); pool.add(新规则(T,新对象t[]{“-”,M},n1)); pool.add(新规则(M,新对象[]{D,P},1)); pool.add(新规则(P,新对象[]{“x”,R},1)); pool.add(新规则(P,“x”,1)); pool.add(新规则(R,新对象[]{“*”,“x”},n2)); pool.add(新规则(D,null,n2)); } } |
清单19显示了一个使用中的属性生成随机多项式表达式的方法表7.
清单19。使用模板的随机多项式生成器。
T多项式多边形=新的T多项式(); 聚乙烯计数集(3, 5); 聚指数集(2, 6); 多元系数集(−5, 10); Exp ast=聚合物(); |
在清单19中给出的模板中,初始化类的计数、指数和系数值,然后通过调用生成函数,在所需条件下生成随机多项式表达式。我们可以使用这个模板生成一些数学表达式。使用清单18的模板类的可重用性示例如下所示: 为此,必须将指数多项式设置为(0,2)。必须根据每个方程的结构构造相关方程。清单20显示了构造二次方程的示例。
清单20。使用清单19的随机二次方程。
聚合导出集(0,2); Exp left=多边形生成(); Exp right=poly.generate(); Exp quad=新Equ(左,右); |
图8使用多项式模板类显示随机二次方程的流程图。例子 2 生成可分多项式,例如“P(x)/Q(x)”,其中P(x。
让我们考虑两个多项式P(x) =一2x2+一1x+一0和Q(x) =k个×b条1x+k个×b条0,其中P(x)可与“b条1x+b条0“和k个是任意整数。为此,需要两个多项式S1和S2生成,其中deg(S1)=度(S2) = 1. 简化S1和S2将导致S1=c(c)1x+c(c)0和S2=b条1x+b条0.假设“P(x)=S1×S2“和”Q=k个×S2“其中k个= [–7, 7]. 清单21显示了这个示例的实现。
清单21。使用模板的可分多项式示例。
聚指数集(0, 1); 实验S1=聚合物(); 实验S2=聚合物(); Exp K=新兰德(−7,7).get(); 实验P=新时间(S1,S2).Simplify(); Exp Q=新时间(k,S公司1).简化(); Exp div=新div(P,Q) ●●●●。Simplify(); |
清单21中所需的多项式的阶数为1。因此,指数字段设置为(0,1),然后设置两个多项式S1和S2生成。接下来,通过使用次数(S1,S公司2)并将其简化。类似地,表达式S2使用−7到7范围内的随机数进行乘法和简化。最后,使用Div将获得的两个节点划分为一个节点(P(P),问). 生成的AST是与所需属性匹配的随机表达式。例子 三。 生成“f(x)=a”的表达式三k个三x三+一个2k个2x2+一个1kx+a0”.
为此,F(x)和G(x)生成,其中F(x) =一三x三+一2x2+一1x+一0,G(x) =千倍、和k个是任意整数。简化F(x)然后创建(FoG)(x)将生成具有所需模式的表达式。清单22显示了这个示例的一个实现,其中k个= [7, 7].
清单22。使用模板的多项式示例。
Poly.exponential.set(0,3); 实验F=poly.generate()。Simplify(); 经验K=新兰德(-7,7) .get(); 实验G=新时间(K,变量X(); Exp div=F.eval(G)。简化(); |
在清单22所示的例子中,它首先建立一个多项式,包括一个最大幂为3的项,然后生成多项式。通过将−7到7范围内的随机数中的多项式相乘,生成一个新的表达式,该表达式应使用简化方法。
不确定极限
诸如“极限f(x),x⟶v(v)“可以使用Exp类生成,这在上一节中进行了讨论,其中lim是Exp的扩展类,接受v和(f)(x)作为参数。F类(x)使用与可能需要的表达式类型相关联的其他模板生成。清单23显示了限制的实现,其中(f)(x)是多项式表达式。
清单23。使用清单22的限制示例。
指数F=聚合物()。Simplify(); 经验v=新Rand(−6,8).get(); Exp lim=新极限(v,F) ; Exp div=F.eval(G)。Simplify(); |
在清单23的示例中,创建了一个随机多项式,并将一个随机数连接到范围为−6到8的Limit节点。最后,对结果语句进行了简化。
极限的常见不确定形式表示为0/0,∞/∞,0*∞,00、和∞0在这些形式中,我们将处理两个函数的比值,这两个函数在极限上都趋于零,称为“形式0/0”。要生成此表单的表达式,可以使用以下步骤来限制(f)(x)作为x方法v(v).
定义表达式“(x−v(v))“其中v(v)是一个数字。
生成P(P)(x)和问(x),其中P和Q是两个多项式。
乘法P(P)(x) 和问(x)由“(x−v(v))”.
替换结果P(P)(x)和问(x)通过他们的简化。
设置(f)(x)与P(P)(x)超过问(x).
清单24显示了这些步骤的实现。
清单24。不定极限表达式的示例。
经验T=新的减(变量X(),v); 支出P=聚合物()。Simplify(); 指数Q=聚合物()。简化(); P=新时间(T,P) ●●●●。简化(); Q=新时间(T,Q) ●●●●。简化(); Exp fx=新Div(P,Q) ●●●●。简化(); |
5.评估
为了研究该方法的性能,我们生成了一些数学表达式,并根据它们在笛卡尔坐标系中的图形导出的一些特征对它们进行分类。通过分析八个特征,即度(或类型)、零点数、端点行为、转折点数、增加、减少、上凹和下凹,来评估多项式函数的质量。其他类型的表达式也具有相同的特征,例如一次方程、二次方程和不定极限。
生成的表达式分为四组(优秀、良好、一般和劣质)。在上面给出的八个特征中,至少有六个一的多项式被认定为质量优良,而最多有三个一的一个多项式被认定质量较差。结果如所示表8注意,对于不确定极限,有三个表达式被确定为较差的表达式,因此也评估了分子和分母多项式的相似性。 6.结论
在本文中,我们提出了一种基于语法的方法来生成数学表达式,该方法可用于生成考试材料和练习练习,以提高学生的数学技能。不同形式的数学表达式需要有不同的语法规则和符号集。一次方程、二次方程、多项式和其他数学表达式由一种形式化语言表示,该语言可以用上下文无关文法(CFG)建模。然而,CFG无法控制数学问题中满足各种要求的表达式的生成过程。
该方法对表达式施加了一些限制,包括术语数量、变量程度和系数范围。为了控制这些限制,我们修改了CFG语法的规则结构,称之为RI-CFG。与CFG语法不同,RI-CFG有一个交互式结构,其中语法规则在生成表达式期间以相关限制所指示的方式进行迭代。
RI-CFG规则在Java编程语言中实现为类,用作表达式模板,我们可以为其开发新模板,继承现有模板的类。可以通过设置从RI-CFG规则获得的类属性来修改表达式模板的行为。每个属性都提供了生成随机数学表达式的不同方法。
例如,多项式表达式的模板可以以多种方式用作一个完整的模板。通过将变量x的最大次数限制为1或2,可以分别生成一次方程或二次方程。类似的过程也可以对其他数学表达式重复,以生成其他RICFG语法和相关模板。