正则表达式+逻辑编程。 结果如何?

尊敬的读者您好。

正则表达式是在各种项目中使用的众所周知的东西,通常用于解析结构化文本的不太复杂的情况。 乍一看,它从事诸如程序模型的反向合成之类的稍微不同的任务(当某个系统根据要解决的问题的某些块模型自动生成程序代码时,有必要使用此代码重新创建原始模型),以及使用文本来合成程序模型。在任务描述中,我遇到了分析文本的问题,或更确切地说,是将文本片段识别为一些自定义模板。 我想要一个相当简单和灵活(可定制)的解决方案。 正则表达式似乎并非如此,因为不幸的是,即使在诸如检查字典中的单词之类的简单任务中,它也需要仔细列出该表达式中的所有选项。 而且他们没有建立一个解析树。 但是,显然可以改善它们。 将对此进行讨论。

因此,设置了以下任务

  1. 正则表达式应该能够产生一个解析树。 有必要实现访问该树的标准方法。
  2. 正则表达式应该能够包含对字典中找到的片段的检查(根据Levenshtein的精确或非严格对应关系),以及同时对多个表进行更复杂的检查。
  3. 除了上面列出的简单检查之外,我还想进行更多的模糊检查,例如单词和表达式的兼容性,神经网络

解析树。


在正则表达式中,已解析的片段由方括号的数目标识。 坦率地说,这很不方便,因此决定了命名括号的可能性。 顺便说一句,这些名称应该出现在解析树中。 语法选择很简单:

(_)->{_} 

如果在原始表达式的括号后有任何运算符(*,+等),则他“移动”到右括号后面。 例如:

 (\w+\s)->{A}+ 

没有什么可以阻止命名和括号,例如:

 ((\w+)->{ID}\s)->{A}+ 

在最后一个示例中,修改后的正则表达式将生成带有一些条件根的解析树,在下一级别有A的实例(可以有多个),在下一级别有ID值。 使用我已经实现的XPath可以方便地访问这样的树,例如,这样的请求是可能的:

 //A[2]/ID[text()!=""]/text() 

单词检查字典,表格和简单的神经网络


解析正则表达式与解析简单逻辑表达式非常相似,例如使用Prolog语言。 这导致了类似于Prolog的片段的想法,它将是:

a)各种检查链。 这并不困难,尤其是因为变量已经出现(以命名括号的形式);
b)或用检测到的碎片补充表/词典;
c)或检测到的片段的表/词典中的例外;
d)或神经网络创建/培训团队。

这里的一般语法为:

 (_)_=>{1,2,...} 

operation_symbol取决于以下操作:验证(?),补货(+),排除(-),创建/培训(*)。 对于谓词,将显示谓词的名称(标准或您自己的谓词)及其括号中的参数列表。 参数可以是常量,输入变量,输出变量(以“ $”符号开头),任意值“ _”的符号,对expression_片段当前值的引用(单个字符“ $”)。 如果链中的所有谓词均成功,则认为对此类表达式的分析成功。

例如,表达式:

 ([--]+)->{V1}\s+([--]+)->{V2}()?=>{check(V1},check(V2),correlate(V1,V2)} 

选择两个连续的俄语单词并将其放在变量V1和V2中,然后使用谓词检查(这可以在表上进行简单检查)并最终使用谓词关联(也可以在表上进行检查)检查这些单词。 验证的类型(严格或非严格)由谓词的规范确定。

如果相关表不包含单词本身,而是包含单词的某些代码及其兼容性的特征,则可能存在以下表达式:

 ()->{C1}()->{C2}([--]+)->{check($,$C1}\s+([--]+)->{V2}()?=>{check(V2,$C2),correlate(C1,C2,1)} 

在此,首先介绍两个变量C1和C2。 相关谓词也可以是具有两个输入(单词代码)和一个输出(兼容性)的神经网络,该神经网络根据一些预定义或动态组装(在正则表达式操作期间)集合进行训练。

仍然需要补充的是,还可以将并行和顺序的特殊指令指定为谓词,这些谓词分别包括并计算谓词链中执行的并行性(转换为谓词相关性树,根据谓词树进行并行化)。 此外,您可以启用一种特殊模式,在该模式下尝试动态预测各个谓词的执行时间,并确定并发是否有效,反之亦然,这只会带来额外的成本。

结论


所有描述的正则表达式修改都在Free Pascal的原型中实现(标准regexpr.pas的修改)。

我希望这些想法对某人有用。

现在,使用这样的正则逻辑表达式+在纯Prolog上进行编程,有可能首先为程序生成系统编写一个插件,该插件从以前由其生成的代码中还原原​​始程序模型,其次,为该系统创建自然语言的元素界面(以非常简化的俄语使用问题陈述,并在其上制定了问题模型,据此已经生成了程序)。

Source: https://habr.com/ru/post/zh-CN415797/


All Articles