如何检测文本替换是否导致无限循环?

时间:2019-03-26 21:14:29

标签: algorithm language-agnostic

我开发了一个从其他程序中提取文本的程序。功能之一是用户可以指定“替换脚本”来处理文本。替换脚本示例:

|ORIG|a|BECOMES|bb|END|
|ORIG|b|BECOMES|cc|END|

替换过程将搜索任何ORIG文本,并将其替换为相应的BECOMES文本。因此,如果提取了文本aaaa,它将首先替换为bbbbbbbb,然后替换为cccccccccccccccc

当存在这样的替换脚本时,就会出现问题:

|ORIG|a|BECOMES|bb|END|
|ORIG|b|BECOMES|aa|END|

,并且提取的文本中有一个aa变成bb,变成aaaa,变成bbbbbbbb,依此类推,直到无穷大。

因此,我需要两种算法: 1.阅读替换脚本,并检测它是否可能创建无限循环(因此我可以警告用户)。 2.执行替换脚本时检测到无限循环(这样我就可以中止操作并通知用户)。

我不知道从哪里开始。我已经考虑了两个多星期,却一无所获。

3 个答案:

答案 0 :(得分:0)

如果第一个脚本的起源是第二个脚本的BECOMES的一部分,则可以尝试建立一个表示替换脚本的节点以及将一个脚本与另一个脚本连接的边的图形。

然后,您可以在此图中搜索循环,告诉您可以无限期地在此循环中应用规则。

答案 1 :(得分:0)

如果任何ORIG等于或成为任何BECOMES的子字符串,那么您可能会遇到问题。

答案 2 :(得分:0)

如评论中所述,我的替换脚本实际上是图灵完整的。因此,该问题简化为停止问题,并且无法解决。