正则表达式匹配器顶部的Sat求解器

2020-06-22 14:11:16

SAT问题是NP问题,而正则表达式匹配不是NP问题。然而,一个非常流行的正则表达式反向引用扩展将正则表达式匹配扩展为(难)NP问题。反向引用通常表示为\1,\2等。

也许,我听说过的反向引用最实际的用法是HTML标记匹配(这个正则表达式没有正确转义):

要成功匹配,第二组必须与第一组重合,如";<;b&>;test<;/b&>;&34;,而不是";a&>;test<;/b&>;。我听说的另一个实际用法是:Match";string&34;or';string';,但不是";string';。我听说的另一个实际用法是:Match";string';或';string';,但不是";string';。我听说的另一个实际用法是:Match";string";or';string';

这篇文章的灵感来自于将3-CNF-SAT简化为Perl正则表达式匹配,请先阅读它。然而,作者错误地指出只有3SAT问题是可以解决的。事实上,任何SAT实例都是可解的,由任意大小的子句组成。

P CNF 5 11-2-5 0-2-4 0-4-5 0-2-3 0-1-4 0-1-5 0-1-2 0-1-3 0-3-4 0-3-5 01 2 3 4 5 0。

这就是我所说的";popcnt1";:只有一个变量必须为真,其余的总是为假。

%PicoSat--all popcnt1.cnf s SATISFIABLEv-1-2-3-4 5 0s SATISFIABLEv-1-2-3 4-5 0s SATISFIABLEv-1-2 3-4-5 0s SATISFIABLEv-1 2-3-4-5 0s SATISFIABLEv 1-2-3-4-5 0s SATISFIABLEv。

您可以看到:一个输入字符串的变量数量与CNF实例的变量数量一样多,然后,子字符串的数量与实例的子句数量一样多。

粗略地说,这意味着这个群体可以匹配,也可能不匹配。让匹配者自己决定。模式的第二部分是子句。对于第#34;1 2 3 4 5&34;子句,我们有";(?:(?P=a_1)|(?P=a_2)|(?P=a_3)|(?P=a_4)|(?P=a_5)),。这意味着整个组必须匹配,但我们没有。I don‘我不知道怎么做:5个子组中的一个可能匹配,每个子组实际上都是模式第一部分的反向引用。但是这些术语都是积极的。消极的术语呢?

对于";-2-5&34;子句,我们有";(?:(?p=a_2)x|(?p=a_5)x),";。这意味着整个组必须匹配";x&34;,同样,我们不知道如何匹配,但如果同时存在反向引用a_2和a_5,则禁止。对于a_2匹配";是可以的。,但是然后联合的第二部分将匹配。对于_5匹配是可以的,然后联合的第一部分将匹配。同样,对于a_2和a_5都可以不匹配:然后联合的任何部分都将匹配。

同样,我可以运行popcnt4实例,该实例命令输入8个变量中的4个为真:

此外,我还设法以SAT/CNF的形式解出了我书(Ctrl-F:";Fred Pizle";)中的";Fred难题:

string=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx;x,x,模式=^(?p<;a_1>;x?)(?P<;a_2>;x?)(?P<;a_3>;x?)(?P<;a_4>;x?)(?P<;a_5>;x?)(?P<;a_6>;x?)(?P<;a_7>;x?)(?P<;a_8>;x?)(?P<;a_9>;x?)(?P<;a_10>;x?)(?P<;a_11>;x?)(?P<;a_12>;x?)(?P<;a_13>;x?)(?P<;a_14>;x?)(?P<;a_15>;x?)(?P<;a_16>;x?)(?P<;a_17>;x?)(?P<;a_18>;x?)(?P<;a_19>;x?)(?P<;a_20>;x?)(?P<;a_21>;x?)(?P<;a_22>;x?)(?P<;a_23>;x?)(?P<;a_24>;x?)(?P<;a_25>;x?)(?P<;a_26>;x?)(?p<;a_27>;x?)(?p<;a_28>;x?)。*;(?:(?p=a_1)x),(?:(?p=a_2)),(?:(?p=a_3)x|(?p=a_4)x|(?p=a_9)x),(?:(?p=a_3)|(?p=a_4)|(?p=a_9)x),(?:(?p=a_3)|(?p=a_4)x|(?p=a_3)。(?:(?p=a_10)x|(?p=a_9)x),(?:(?p=a_10)|(?p=a_9)),(?:(?p=a_11)x|(?p=a_10)x),(?:(?p=a_11)|(?p=a_10)),(?:(?p=a_11)),(?:(?p=a_5)x|(?(?:(?p=a_5)|(?p=a_6)|(?p=a_12)x),(?:(?p=a_5)|(?p=a_6)x|(?p=a_12)),(?:(?p=a_5)x|(?p=a_6)|(?p=a_12)),(?:(?p=a_13)x|(?p=a_12)x),(?:(?p=a_14)x|(?p=a_13)x),(?:(?p=a_14)|(?p=a_13)),(?:(?p=a_14)),(?:(?p=a_7)x|(?p=a_8)x|(?p=a_15)x),(?:(?p=a_7)|(?p=a_8)|(?p=a_15)x),(?:(?p=a_7)|(?p=a_8)|(?p=a_8)(?:(?p=a_7)x|(?p=a_8)|(?p=a_15)),(?:(?p=a_16)x|(?p=a_15)x),(?:(?p=a_16)|(?p=a_15)),(?:(?p=a_17)x|(?p=a_16)x),(?:(?p=a_17)|(?p=a_16)),(?:(?p=a_17)),(?:(?p=a_3)x|(?(?:(?p=a_3)|(?p=a_18)x),(?:(?p=a_6)|(?p=a_18)x),(?:(?p=a_8)x|(?p=a_18)x|(?p=a_19)x),(?:(?p=a_8)|(?p=a_18)|(?p=a_19)x),(?:(?p=a_8)|(?p=a_18)x|(?p=a_19))。(?:(?p=a_20)x|(?p=a_19)x),(?:(?p=a_20)|(?p=a_19)),(?:(?p=a_20)),(?:(?p=a_21)x|(?p=a_7)x),(?:(?p=a_21)|(?p=a_7)),(?:(?p=a_21)|(?p=a_21)(?:(?p=a_21)x|(?p=a_22)),(?:(?p=a_5)x|(?p=a_22)),(?:(?p=a_4)x|(?p=a_22)x|(?p=a_23)x),(?:(?p=a_4)|(?p=a_22)|(?p=a_23)x),(?:(?p=a_4)|(?p=a_22)x|(?p=a_23))。(?:(?p=a_24)x|(?p=a_23)x),(?:(?p=a_24)|(?p=a_23)),(?:(?p=a_24)),(?:(?p=a_3)|(?p=a_7)|(?p=a_25)x),(?:(?p=a_3)x|(?p=a_25)),(?:(?p=a_25))。(?:(?p=a_6)x|(?p=a_25)x|(?p=a_26)),(?:(?p=a_6)|(?p=a_26)x),(?:(?p=a_25)|(?p=a_26)x),(?:(?p=a_6)x|(?p=a_26)x|(?p=a_27)x),(?(?:(?p=a_6)|(?p=a_26)x|(?p=a_27)),(?:(?p=a_6)x|(?p=a_26)|(?p=a_27)),(?:(?p=a_28)x|(?p=a_27)x),(?:(?p=a_28)|(?p=a_27)),(?:(?p=a_28))。星期六-1 2-3 45-6 7-8 9-10 11 12-13 14 15-16 17-18-19 20-21 22-23 24 25-26-27 28。

当然,所有这些东西根本不实用。但它展示了从一个问题(带反向引用的正则表达式匹配)简化到另一个问题(SAT)。为这些问题找到一个更好的算法,这将导致计算机科学的革命。