一种符号表达式树生成方法与流程

文档序号:18869967发布日期:2019-10-14 19:18阅读:461来源:国知局
一种符号表达式树生成方法与流程

本发明涉及机器建模和机器公式推导,特别涉及一种符号表达式的机器建模方式。



背景技术:

让机器进行公式推导是科学家一直以来的梦想,该梦想随着人工智能时代的到来更加迫切。我们需要机器人在面临陌生的情况时能根据提前设定好的原理和公式进行自主建模、公式推导和代码生成,从而能够高效地适应环境。同时人工智能的发展也为公式的机器推导提供了新的技术方案。目前公式机器化推导的核心技术主要掌握在国外的一些大公司手里,其产品如matlab、maple、mathmatica等已几成全球垄断态势。

公式通常写为符号表达式的形式,该表达式通常以字符串的形式输送给机器。当机器读取该字符串时,就会将每一运算写为:操作符[操作数]的形式,如1+2写为plus[1,2],x2+3y写为plus[power[x,2],times[3,y]]。这是一种扁平化的存储方式;各运算符之间存储上相互独立,没有明显的关联;整个表达式的结构不清晰。而人工智能处理时需要清晰的数据结构,需要从整体上把握对象,因此在当前的符号运算框架下很难采用人工智能的方式进行处理。

另外,这种扁平化的存储方式使得当前这些符号运算软件的用户体验很差,用户需要保留的项被程序合并了,需要合并的项程序却识别不出来,而且程序的输出往往是一个非常长的字符串形式的符号表达式,用户往往需要从这些输出的字符串中理解程序到底进行了哪些处理,然后尝试施加各种约束以使程序输出符合预期的结果。



技术实现要素:

本发明的目的是克服现有技术中的不足,提供一种符号表达式树生成方法,高效地从符号表达式中生成相应的树结构。

这种符号表达式树生成方法,包括以下步骤:

1)将组成符号表达式的所有最小分割单元均视为运算符,最小分割单元包括常规运算符、数字、变量、函数、左括号和右括号;运算符被赋予相应的运算级别;

2)在未插入符号表达式中的任何运算符之前,符号树是一个单一左括号形成的结点,且插入点位于该结点上;

3)依次读取符号表达式中的运算符,按一定规则动态插入到当前的符号树中,并调整插入点的位置,其插入规则如下:

3.1)若插入点所在结点的运算级小于即将插入的运算符的运算级,则直接在该插入点所在结点下插入该运算符,插入完成后,插入点移到该运算符所在的结点处;

3.2)若插入点所在结点的运算级大于即将插入的运算符的运算级,则将插入点上移到所在结点的父结点处,若该父结点的运算级仍大于即将插入的运算符的运算级,则将插入点继续上移,直到移到某一父结点处,其运算级等于或小于即将插入的运算符的运算级,此时:

3.2a)若该父结点的运算级等于即将插入的运算符的运算级,则不进行插入操作,而将插入点位于该父结点上;

3.2b)若该父结点的运算级小于即将插入的运算符的运算级,则将该运算符插入到该父结点与其子结点之间,并使插入点移到该新插入的运算符所在结点处;

4)在符号表达式中的所有运算符都插入完成后,再插入一个虚拟的右括号;

5)去除符号树中的所有括号结点,形成最终的符号表达式树。

作为优选:所述步骤1)中,常规运算符包括加、减、乘、除和乘方,并且逆运算的运算级别高于相应的正运算,其中正运算为加和乘,其所对应的逆运算为减和除。

作为优选:所述步骤1)中,数字、变量和函数具有相同的最高运算级别。

作为优选:所述步骤1)中,除特殊情况外,左括号和右括号具有相同的最低运算级别;特殊情况有两种:一是在当前的符号树中插入左括号时,左括号的运算级临时升至最高,插入完成后左括号的运算级恢复到最低运算级别;二是当右括号插入完成后,其所在结点的运算级永久性升至最高,即该运算级别高于数字、变量和函数的运算级别。

作为优选:所述步骤3)中,按照符号表达式从左向右的书写习惯逐个读取符号表达式中的运算符。

作为优选:所述步骤3)中,符号树的特征为:每一个结点都代表一个运算符;每一结点下方都连接0个或若干个结点,称为该结点的子结点;每一结点上方都连接最多1个结点,称为该结点的父结点;当整棵符号树有且只有一个结点,则其父结点数为0;在任一时刻,整棵符号树中有且只有一个结点被指定为插入点,即将插入的运算符优先接在该插入点所在的结点下方,成为该插入点所在结点的一个子结点。

作为优选:所述步骤3)中,若即将插入的运算符为逆运算符,则先按规则插入一个虚拟的与该逆运算符对应的正运算符,再插入该逆运算符;其中所插入的虚拟的正运算符并非源自符号表达式,而是人为增加的。

本发明的有益效果是:

1)本发明的树状图可以清晰地显示整个表达式的结构,可以实时将符号树呈现给用户,用户可以按需要将树中的某个结点上移或下移,从而使公式推导更直观,用户与机器间的交互体验也更好,而树状图的这种形式是目前所有公式推导软件产品所不具备的。

2)本发明可借助人工智能识别树中的某些特定结构,通过树的局部或整体性变换实现公式的智能化推导。

附图说明

图1为符号表达式树的示例图;

图2至图4为符号表达式1+2*(3-4)^5/f(x)的符号树生成过程图(其中a~u依次表示符号树生成的全过程)。

具体实施方式

下面结合实施例对本发明做进一步描述。下述实施例的说明只是用于帮助理解本发明。应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以对本发明进行若干改进和修饰,这些改进和修饰也落入本发明权利要求的保护范围内。

为了使计算机能够理解公式并在人工智能的帮助下进行公式推导,需要将符号表达式以结构化的形式呈现出来。本发明提供一种将符号表达式转为树状图的方法,该方法能够从前向后读取符号表达式,并根据所定义的规则,动态组装和调整符号表达式树。

本发明采用树状图来存储符号表达式,如将1+2和x2+3y表达为图1中的形式。这种树状图可以清晰地显示整个表达式的结构。

与现有的符号运算产品不同的是,本发明将操作符和操作数都统一视为运算符。如把1+2视为三个运算符:1、+、2,即把数字也视为一个独立的运算符。

在本发明中,数字、变量和函数具有相同的最高的运算级别。

在本发明中,左括号和右括号也视为运算符,但与现有的符号运算产品不同的是,括号的运算级在本发明中被定义为最低的。

为了更高效的处理逆运算符,如减号和除号,与现有符号运算产品不同的是,在本发明中逆运算符的运算级要高于相应的正运算符。

本发明实现符号树的动态直观生成,用户每输入一个运算符都可以看到该运算符在整棵树中的位置,当用户把符号表达式输入完毕,符号树也生成完毕,该功能也是现有技术方案所不具备的。

在未读取任何运算符之前,符号树在本发明中定义为一个单一左括号形成的结点,称为根结点;整个符号表达式便是挂在根结点下;当符号表达式读取完毕后,为了消除该根结点,可额外添加一右括号,该右括号会与根结点处的左括号融合;为了使整棵符号树更加简洁,可消去所有经右括号融合后的左括号结点。

为了使符号树更加简洁,在本发明中,符号树没有采用二叉树结构,而是被定义为一个多值树结构,其特征为:每一个结点都代表一个运算符;每一结点下面都连接0个或多个结点,称为该结点的子结点;每一结点上面都连接最多1个结点,称为该结点的父结点;当整棵符号树有且只有一个结点,则其父结点数为0;在任一时刻,整棵符号树中有且只有一个结点被指定为插入点,下一运算符优先接在该插入点所在的结点下面,成为该插入点所在结点的一个子结点。

符号运算规则纷繁复杂,但本发明却给出了一种非常简明和易实现的符号树动态生成方案:当要在符号树中插入一个新的运算符时,若插入点所在结点的运算级小于新运算符,则直接在该插入点所在结点下插入该新运算符,插入完成后,插入点移到该新运算符所在的结点处;若插入点所在结点的运算级高于新运算符,则将插入点上移到所在结点的父结点处,若该父结点的运算级仍高于新运算符,则将插入点继续上移,直到移到某一父结点处,其运算级等于或小于新运算符;若该父结点的运算级等于新运算符,则不进行插入操作,但使插入点位于该父结点上;若该父结点的运算级小于新运算符,则将该新运算符插入到该父结点与其子结点之间,并使插入点位于新运算符所在的结点处。

为了在本发明的插入规则下简化逆运算符的插入,本发明提出:在插入每一个逆运算符之前,先人为地插入一个与该逆运算符相应的正运算符,再插入该逆运算符;

为了在本发明的插入规则下简化括号的插入,本发明创新性地使括号的运算级别可调:一是当要插入左括号时,把左括号的运算级别临时升至最高(要高于数字的运算级),插入完成后恢复至最低运算级别;二是当右括号插入完成后,其所在结点的运算级别永久性升至最高。

如图2~图4所示,以符号表达式1+2*(3-4)^5/f(x)的符号树生成为例,其步骤如下:

步骤1:分析符号表达式。这是个常规的四则运算表达式,按照本发明的定义,涉及的运算符有:数字(1,2,3,4,5),函数(f),变量(x),加号(+),减号(-),乘号(*),除号(/),乘方(^),左括号“(”,以及右括号“)”。

步骤2:定义运算符的运算级别。按照权利要求2、0和0,并参考常规四则运算级别的设定,则可取“(”和“)”的运算级为0;加号(+)的运算级为2;减号(-)的运算级为3;乘号(*)的运算级为4;除号(/)的运算级为5;乘方(^)的运算级为6;数字、函数和变量的运算级为8;动态设定的左、右括号最高运算级为100。

步骤3:在未插入任何运算符之前,先构建单一左括号形成的初始树,且插入点(图中用▲表示)位于该根结点上,如图2(a)所示。

步骤4:插入第一个运算符。数字“1”是该符号表达式的第一个运算符。根据步骤2的定义,数字“1”的运算级高于插入点所在的“(”的运算级,故根据权利要求1的插入规则3.1),在“(”后面直接插入数字“1”,并将插入点移到“1”上,如图2(b)所示。

步骤5:插入第二个运算符“+”。因“+”的运算级小于插入点所在的“1”的运算级,故根据权利要求1的插入规则3.2),将插入点上移到父结点“(”处,此时“+”的运算级大于插入点所在的“(”的运算级,故根据权利要求1的插入规则3.2b),在父结点“(”与子结点“1”之间插入第二个运算符“+”,并将插入点移到“+”处,如图2(c)所示。

步骤6:插入第三个运算符“2”。因数字“2”的运算级高于当前树插入点处“+”的运算级,故根据权利要求1的插入规则3.1),直接在“+”的下方插入运算符“2”,并将插入点移到运算符“2”处,如图2(d)所示,此时“+”结点有两个子结点,一个是“1”,一个是“2”。

步骤7:插入第四个运算符“*”。乘号“*”的运算级小于当前插入点“2”的运算级,故根据权利要求1的插入规则3.2),需将插入点上移到父结点“+”处。此时“*”的运算级高于插入点所在的“+”的运算级,故根据插入规则3.2b),在父结点“+”与子结点“2”之间插入“*”号,并将插入点移到“*”处,如图2(e)所示。

步骤8:插入第五个运算符“(”。左括号的运算级本应小于插入点“*”的运算级,但根据权利要求4,在插入左括号时,左括号的运算级临时升至最高,故根据插入规则3.1),直接在“*”的下方插入“(”,并将插入点移到“(”上,如图2(f)所示。左括号在插入完成后,根据权利要求4,其运算级恢复到最低状态。

步骤9:插入第六个运算符“3”。数字的运算级高于插入点“(”的运算级,故直接在“(”的下方插入结点“3”,并将插入点移到“3”处,如图2(g)所示。

步骤10:插入第七个运算符“-”。因为是逆运算,根据权利要求7,在插入该逆运算符之前,先插入一个正运算符“+”。因“+”的运算级小于当前插入点“3”的运算级,故根据插入规则3.2),需把插入点上移到父结点“(”处;而“(”的运算级小于要插入的“+”的运算级,故根据插入规则3.2b),需把“+”插入到父结点“(”与子结点“3”之间,并把插入点移到新插入的“+”上,如图2(h)所示。

然后再插入第七个运算符“-”。因“-”的运算级高于插入点“+”的运算级,故根据插入规则3.1),直接在“+”下面插入子结点“-”,并将插入点移到“-”上,如图2(i)所示。

步骤11:插入第八个运算符“4”。数字的运算级高于当前插入点“-”,故根据插入规则3.1),直接在“-”下插入结点“4”,并将插入点移到“4”上,如图3(j)所示。

步骤12:插入第九个运算符。右括号“)”是第九个运算符,运算级最低,故根据插入规则3.2),插入点将上移到父结点“-”上,但“-”的运算级依然高于“)”,故插入点继续上移,上移到“+”上,运算级依然高于要插入的右括号,故再上移,上移到左括号结点“)”,此时插入点所在的左括号结点运算级与要插入的右括号结点相同,故根据插入规则3.2a),不进行任何插入操作。但根据权利要求4,在右括号插入完成后,需把插入点当前所在的左括号结点的运算级别永久性升至最高,这种状态可以用“()”表示,表示该结点处的左括号已经跟右括号配对融合,如图3(k)所示。

步骤13:插入第十个运算符。乘方符号“^”是第十个运算符。因当前插入点所在的左括号已经跟右括号配对融合,运算级升至最高,所以要插入的“^”的运算级低于当前插入点的运算级,故根据插入规则3.2),需把插入点向上移,移到父结点“*”上,而“*”的运算级低于要插入的“^”的运算级,故根据插入规则3.2b),需在父结点“*”与子结点“()”之间,插入结点“^”,并把插入点移到刚插入的“^”上,如图3(l)所示。

步骤14:插入第十一个运算符。数字“5”是第十一个运算符,运算级高于当前插入点“^”,故根据插入规则3.1),直接在“^”的下面插入子结点“5”,并将插入点移到“5”上,如图3(m)所示。

步骤15:插入第十二个运算符。除号“/”是第十二个运算符。但“/”是逆运算符,根据权利要求7,在插入该逆运算符之前,应先插入一个正运算符“*”。因“*”的运算级低于当前插入点“5”的运算级,故根据插入规则3.2),需把插入点向上移,移到父结点“^”上,但“^”的运算级还高于要插入的“*”,故还需把插入点上移,移到结点“*”上,此时插入点的运算级等于要插入的“*”的运算级,故根据插入规则3.2a),不进行任何插入操作,如图3(n)所示。然后再插入第十二个运算符“/”,因“/”的运算级高于插入点所在的“*”的运算级,故根据插入规则3.1),在“*”后直接插入运算符“/”,并将插入点移到“/”上,如图3(o)所示。

步骤16:插入第十三个运算符“f”。“f”为函数,运算级高于当前插入点所在的“/”的运算级,故直接在“/”下插入点“f”,并将插入点移到“f”处,如图3(p)所示。

步骤17:插入第十四个运算符“(”。根据权利要求4,在插入左括号时,左括号的运算级临时升至最高,故直接在“f”后面插入“(”,并将插入点移到“(”上,如图4(q)所示。左括号插入完成后,根据权利要求4,其运算级恢复到最低状态。

步骤18:插入第十五个运算符“x”。因变量“x”的运算级高于插入点所在的“(”的运算级,故直接在“(”后面插入“x”,并将插入点移到“x”处,如图4(r)所示。

步骤19:插入第十六个运算符“)”。“)”的运算级小于“x”,故将插入点上移到“(”处,此时运算级相同,故不进行插入操作,但根据权利要求4,在右括号插入完成后,需把插入点当前所在的左括号结点的运算级别永久性升至最高,这种状态可以用“()”表示,表示该结点处的左括号已经跟右括号配对融合,如图4(s)所示。

步骤20:在所有运算符都插入完成后,再插入一个虚拟的右括号;于是根结点处的“(”也形成配对,如图4(t)所示。

步骤21:去除所有的括号结点,则形成最终的符号表达式树,如图4(u)所示。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1