[{"data":1,"prerenderedAt":20148},["ShallowReactive",2],{"post-\u002Fblog\u002F2026\u002F0013-satisfiability-modulo-theories":3,"i-ci:tag":-1,"i-mingcute:time-line":-1},{"post":4,"nextPost":19949,"prevPost":19959},{"id":5,"title":6,"body":7,"description":13,"draft":19946,"enableCodeHighlight":19947,"enableCodeHightlight":19946,"enableComment":19947,"enableD2":19947,"enableKatex":19947,"extension":19948,"image":23,"important":19946,"location":19949,"meta":19950,"navigation":19947,"ogImage":19949,"path":19951,"seo":19952,"stem":19953,"summary":19954,"tags":19955,"time":19957,"__hash__":19958},"blog\u002Fblog\u002F2026\u002F0013-satisfiability-modulo-theories.md","可满足性模理论 (Satisfiability Modulo Theories)",{"type":8,"value":9,"toc":19907},"minimark",[10,14,17,171,186,189,374,377,385,407,413,418,423,461,464,467,616,680,851,855,858,1189,1752,1755,2479,2847,2906,2917,2924,2928,2931,3144,3150,3182,3185,3188,3192,3196,3203,3249,3379,4011,4429,4432,4435,4463,4571,4790,4793,4797,4800,4803,4998,5001,5387,5578,5581,5584,5588,5591,5594,5765,5768,6196,6457,6593,6600,6604,6610,6613,6650,6653,7269,7272,7275,7279,7282,7296,7302,7306,7310,7317,7320,7419,7454,7473,7476,7480,7486,7670,7673,7843,7846,8286,8386,8393,8525,8529,8535,8542,8545,8715,9160,9163,9166,9351,9452,9458,9648,9652,9658,9737,9743,9747,9754,9757,9770,9773,9777,9781,9792,9799,9802,9823,9826,9830,9833,9836,10052,10055,10309,10312,10408,10615,10622,10778,10858,11167,11171,11174,11182,11185,11205,11208,11212,11248,11251,11256,11259,11400,11403,11629,11850,11853,11856,11861,11997,11999,12196,12321,12726,12729,12731,12736,12739,12938,12941,12948,13212,13355,13357,13365,13376,13378,13679,13899,13902,13908,13912,13919,13922,14077,14080,14309,14312,14423,14484,14487,14491,14494,14709,15164,15292,15448,15543,15666,15669,15676,15679,15716,15720,15726,15754,15757,15760,15764,15768,15771,15777,15780,16210,16296,16305,16311,16315,16318,16407,16424,16435,16566,16569,16761,16764,16796,16799,16805,16941,16944,16984,16987,17180,17186,17200,17238,17255,17259,17352,17430,17433,17541,17544,17935,18000,18003,18045,18048,18054,18057,18065,18261,18347,18357,18361,18364,18429,18440,18531,18537,18684,18690,18693,18759,18849,18906,18916,18923,18927,19001,19004,19113,19123,19126,19166,19169,19332,19337,19348,19668,19759,19763,19766,19773,19779,19786,19790,19893,19903],[11,12,13],"p",{},"SMT 的出现，本质上是为了解决一个核心矛盾：很多实际问题用纯命题逻辑（SAT）表达时，要么根本无法表达，要么表达后规模爆炸；而用一般的一阶逻辑或高阶逻辑表达虽然自然，却无法自动高效求解。",[11,15,16],{},"看一段再普通不过的代码：",[18,19,24],"pre",{"className":20,"code":21,"language":22,"meta":23,"style":23},"language-c shiki shiki-themes github-dark","void f(int x, int y) {\n    int a[100] = {0};\n    a[0] = 5;\n    if (x + y > 10 && a[0] == 5) {\n        \u002F\u002F 目标分支\n    }\n}\n","c","",[25,26,27,62,93,113,152,159,165],"code",{"__ignoreMap":23},[28,29,32,36,40,44,47,51,54,56,59],"span",{"class":30,"line":31},"line",1,[28,33,35],{"class":34},"snl16","void",[28,37,39],{"class":38},"svObZ"," f",[28,41,43],{"class":42},"s95oV","(",[28,45,46],{"class":34},"int",[28,48,50],{"class":49},"s9osk"," x",[28,52,53],{"class":42},", ",[28,55,46],{"class":34},[28,57,58],{"class":49}," y",[28,60,61],{"class":42},") {\n",[28,63,65,68,71,74,78,81,84,87,90],{"class":30,"line":64},2,[28,66,67],{"class":34},"    int",[28,69,70],{"class":49}," a",[28,72,73],{"class":42},"[",[28,75,77],{"class":76},"sDLfK","100",[28,79,80],{"class":42},"] ",[28,82,83],{"class":34},"=",[28,85,86],{"class":42}," {",[28,88,89],{"class":76},"0",[28,91,92],{"class":42},"};\n",[28,94,96,99,101,103,105,107,110],{"class":30,"line":95},3,[28,97,98],{"class":49},"    a",[28,100,73],{"class":42},[28,102,89],{"class":76},[28,104,80],{"class":42},[28,106,83],{"class":34},[28,108,109],{"class":76}," 5",[28,111,112],{"class":42},";\n",[28,114,116,119,122,125,128,131,134,137,139,141,143,145,148,150],{"class":30,"line":115},4,[28,117,118],{"class":34},"    if",[28,120,121],{"class":42}," (x ",[28,123,124],{"class":34},"+",[28,126,127],{"class":42}," y ",[28,129,130],{"class":34},">",[28,132,133],{"class":76}," 10",[28,135,136],{"class":34}," &&",[28,138,70],{"class":49},[28,140,73],{"class":42},[28,142,89],{"class":76},[28,144,80],{"class":42},[28,146,147],{"class":34},"==",[28,149,109],{"class":76},[28,151,61],{"class":42},[28,153,155],{"class":30,"line":154},5,[28,156,158],{"class":157},"sAwPA","        \u002F\u002F 目标分支\n",[28,160,162],{"class":30,"line":161},6,[28,163,164],{"class":42},"    }\n",[28,166,168],{"class":30,"line":167},7,[28,169,170],{"class":42},"}\n",[11,172,173,174,177,178,181,182],{},"假设 ",[25,175,176],{},"x","、",[25,179,180],{},"y"," 是来自外部的整数。我们想知道：",[183,184,185],"strong",{},"有没有一组输入，能走进这个分支？",[11,187,188],{},"沿着这条路径，把进入分支需要满足的条件收集起来：",[28,190,194],{"className":191,"translate":193},[192],"katex-display","no",[28,195,198,257],{"className":196,"translate":193},[197],"katex",[28,199,202],{"className":200},[201],"katex-mathml",[203,204,207],"math",{"xmlns":205,"display":206},"http:\u002F\u002Fwww.w3.org\u002F1998\u002FMath\u002FMathML","block",[208,209,210,252],"semantics",{},[211,212,213,216,219,221,223,227,231,234,236,239,242,244,247,249],"mrow",{},[214,215,176],"mi",{},[217,218,124],"mo",{},[214,220,180],{},[217,222,130],{},[224,225,226],"mn",{},"10",[228,229,230],"mtext",{},"  ",[217,232,233],{},"∧",[228,235,230],{},[214,237,238],{},"a",[217,240,73],{"stretchy":241},"false",[224,243,89],{},[217,245,246],{"stretchy":241},"]",[217,248,83],{},[224,250,251],{},"5",[253,254,256],"annotation",{"encoding":255},"application\u002Fx-tex","x + y > 10 \\;\\wedge\\; a[0] = 5",[28,258,262,288,310,335,365],{"className":259,"ariaHidden":261},[260],"katex-html","true",[28,263,266,271,276,281,285],{"className":264},[265],"base",[28,267],{"className":268,"style":270},[269],"strut","height:0.6667em;vertical-align:-0.0833em;",[28,272,176],{"className":273},[274,275],"mord","mathnormal",[28,277],{"className":278,"style":280},[279],"mspace","margin-right:0.2222em;",[28,282,124],{"className":283},[284],"mbin",[28,286],{"className":287,"style":280},[279],[28,289,291,295,299,303,307],{"className":290},[265],[28,292],{"className":293,"style":294},[269],"height:0.7335em;vertical-align:-0.1944em;",[28,296,180],{"className":297,"style":298},[274,275],"margin-right:0.0359em;",[28,300],{"className":301,"style":302},[279],"margin-right:0.2778em;",[28,304,130],{"className":305},[306],"mrel",[28,308],{"className":309,"style":302},[279],[28,311,313,317,320,323,326,329,332],{"className":312},[265],[28,314],{"className":315,"style":316},[269],"height:0.6444em;",[28,318,226],{"className":319},[274],[28,321],{"className":322,"style":302},[279],[28,324],{"className":325,"style":280},[279],[28,327,233],{"className":328},[284],[28,330],{"className":331,"style":302},[279],[28,333],{"className":334,"style":280},[279],[28,336,338,342,345,349,352,356,359,362],{"className":337},[265],[28,339],{"className":340,"style":341},[269],"height:1em;vertical-align:-0.25em;",[28,343,238],{"className":344},[274,275],[28,346,73],{"className":347},[348],"mopen",[28,350,89],{"className":351},[274],[28,353,246],{"className":354},[355],"mclose",[28,357],{"className":358,"style":302},[279],[28,360,83],{"className":361},[306],[28,363],{"className":364,"style":302},[279],[28,366,368,371],{"className":367},[265],[28,369],{"className":370,"style":316},[269],[28,372,251],{"className":373},[274],[11,375,376],{},"问题于是变成：这组约束有没有解？",[11,378,379,380,177,382,384],{},"纯 SAT 求解器也能做，但你得先把 ",[25,381,176],{},[25,383,180],{}," 各拆成 32 个布尔变量，把加法展开成加法器电路，把数组展开成 100 个元素，最后交给它几千条子句。它只认识真假，不认识整数，也不认识数组。",[11,386,387,388,391,392,395,396,399,400,402,403,406],{},"SMT 求解器则直接读原式：",[25,389,390],{},"x + y > 10"," 交给算术，",[25,393,394],{},"a[0] = 5"," 交给数组。算术说取 ",[25,397,398],{},"x = 6, y = 5"," 就行，数组说 ",[25,401,394],{}," 本来就成立。两边一对，返回 ",[183,404,405],{},"sat","，并给出这组解。",[11,408,409,410],{},"同一个问题，一个要把语义拆成门电路，一个能直接利用语义。",[183,411,412],{},"SMT 要做的，就是后者。",[414,415,417],"h2",{"id":416},"一smt-是什么","一、SMT 是什么",[419,420,422],"h3",{"id":421},"_11-定义","1.1 定义",[11,424,425,426],{},"把上面的过程抽象一下。",[183,427,428,429,460],{},"SMT 是「SAT + 背景理论」：在某个理论 ",[28,430,432,446],{"className":431,"translate":193},[197],[28,433,435],{"className":434},[201],[203,436,437],{"xmlns":205},[208,438,439,444],{},[211,440,441],{},[214,442,443],{},"T",[253,445,443],{"encoding":255},[28,447,449],{"className":448,"ariaHidden":261},[260],[28,450,452,456],{"className":451},[265],[28,453],{"className":454,"style":455},[269],"height:0.6833em;",[28,457,443],{"className":458,"style":459},[274,275],"margin-right:0.1389em;"," 规定的语义下，判定一个一阶逻辑公式是否存在满足它的赋值。",[11,462,463],{},"这里的关键词是「模理论」（modulo theories）。「模」可以理解为「相对于」：我们不再问公式在全部数学结构里是否成立，而是问它在某个特定理论——比如整数算术、位向量、数组——的解释下是否成立。",[11,465,466],{},"形式化一点，SMT 要回答的是：",[28,468,470],{"className":469,"translate":193},[192],[28,471,473,514],{"className":472,"translate":193},[197],[28,474,476],{"className":475},[201],[203,477,478],{"xmlns":205,"display":206},[208,479,480,511],{},[211,481,482,486,489,492,495,498,500,508],{},[214,483,485],{"mathvariant":484},"normal","∃",[228,487,488],{}," ",[214,490,491],{},"σ",[214,493,494],{"mathvariant":484},".",[279,496],{"width":497},"1em",[214,499,491],{},[501,502,503,506],"msub",{},[217,504,505],{},"⊨",[214,507,443],{},[214,509,510],{},"φ",[253,512,513],{"encoding":255},"\\exists\\, \\sigma.\\quad \\sigma \\models_T \\varphi",[28,515,517,606],{"className":516,"ariaHidden":261},[260],[28,518,520,524,527,531,534,537,541,544,547,603],{"className":519},[265],[28,521],{"className":522,"style":523},[269],"height:0.999em;vertical-align:-0.249em;",[28,525,485],{"className":526},[274],[28,528],{"className":529,"style":530},[279],"margin-right:0.1667em;",[28,532,491],{"className":533,"style":298},[274,275],[28,535,494],{"className":536},[274],[28,538],{"className":539,"style":540},[279],"margin-right:1em;",[28,542,491],{"className":543,"style":298},[274,275],[28,545],{"className":546,"style":302},[279],[28,548,550,553],{"className":549},[306],[28,551,505],{"className":552},[306],[28,554,557],{"className":555},[556],"msupsub",[28,558,562,594],{"className":559},[560,561],"vlist-t","vlist-t2",[28,563,566,589],{"className":564},[565],"vlist-r",[28,567,571],{"className":568,"style":570},[569],"vlist","height:0.3283em;",[28,572,574,579],{"style":573},"top:-2.55em;margin-left:0em;margin-right:0.05em;",[28,575],{"className":576,"style":578},[577],"pstrut","height:2.7em;",[28,580,586],{"className":581},[582,583,584,585],"sizing","reset-size6","size3","mtight",[28,587,443],{"className":588,"style":459},[274,275,585],[28,590,593],{"className":591},[592],"vlist-s","​",[28,595,597],{"className":596},[565],[28,598,601],{"className":599,"style":600},[569],"height:0.15em;",[28,602],{},[28,604],{"className":605,"style":302},[279],[28,607,609,613],{"className":608},[265],[28,610],{"className":611,"style":612},[269],"height:0.625em;vertical-align:-0.1944em;",[28,614,510],{"className":615},[274,275],[11,617,618,619,649,650,679],{},"也就是：是否存在一个赋值 ",[28,620,622,636],{"className":621,"translate":193},[197],[28,623,625],{"className":624},[201],[203,626,627],{"xmlns":205},[208,628,629,633],{},[211,630,631],{},[214,632,491],{},[253,634,635],{"encoding":255},"\\sigma",[28,637,639],{"className":638,"ariaHidden":261},[260],[28,640,642,646],{"className":641},[265],[28,643],{"className":644,"style":645},[269],"height:0.4306em;",[28,647,491],{"className":648,"style":298},[274,275],"，把每个变量映射到理论域里的值，使得 ",[28,651,653,667],{"className":652,"translate":193},[197],[28,654,656],{"className":655},[201],[203,657,658],{"xmlns":205},[208,659,660,664],{},[211,661,662],{},[214,663,510],{},[253,665,666],{"encoding":255},"\\varphi",[28,668,670],{"className":669,"ariaHidden":261},[260],[28,671,673,676],{"className":672},[265],[28,674],{"className":675,"style":612},[269],[28,677,510],{"className":678},[274,275]," 在这个理论的所有公理下为真。",[11,681,682,683,755,756,821,822,850],{},"回到开头的例子：",[28,684,686,707],{"className":685,"translate":193},[197],[28,687,689],{"className":688},[201],[203,690,691],{"xmlns":205},[208,692,693,705],{},[211,694,695,697,699,701,703],{},[214,696,176],{},[217,698,124],{},[214,700,180],{},[217,702,130],{},[224,704,226],{},[253,706,390],{"encoding":255},[28,708,710,728,746],{"className":709,"ariaHidden":261},[260],[28,711,713,716,719,722,725],{"className":712},[265],[28,714],{"className":715,"style":270},[269],[28,717,176],{"className":718},[274,275],[28,720],{"className":721,"style":280},[279],[28,723,124],{"className":724},[284],[28,726],{"className":727,"style":280},[279],[28,729,731,734,737,740,743],{"className":730},[265],[28,732],{"className":733,"style":294},[269],[28,735,180],{"className":736,"style":298},[274,275],[28,738],{"className":739,"style":302},[279],[28,741,130],{"className":742},[306],[28,744],{"className":745,"style":302},[279],[28,747,749,752],{"className":748},[265],[28,750],{"className":751,"style":316},[269],[28,753,226],{"className":754},[274]," 是算术原子，",[28,757,759,782],{"className":758,"translate":193},[197],[28,760,762],{"className":761},[201],[203,763,764],{"xmlns":205},[208,765,766,780],{},[211,767,768,770,772,774,776,778],{},[214,769,238],{},[217,771,73],{"stretchy":241},[224,773,89],{},[217,775,246],{"stretchy":241},[217,777,83],{},[224,779,251],{},[253,781,394],{"encoding":255},[28,783,785,812],{"className":784,"ariaHidden":261},[260],[28,786,788,791,794,797,800,803,806,809],{"className":787},[265],[28,789],{"className":790,"style":341},[269],[28,792,238],{"className":793},[274,275],[28,795,73],{"className":796},[348],[28,798,89],{"className":799},[274],[28,801,246],{"className":802},[355],[28,804],{"className":805,"style":302},[279],[28,807,83],{"className":808},[306],[28,810],{"className":811,"style":302},[279],[28,813,815,818],{"className":814},[265],[28,816],{"className":817,"style":316},[269],[28,819,251],{"className":820},[274]," 是数组原子，理论 ",[28,823,825,838],{"className":824,"translate":193},[197],[28,826,828],{"className":827},[201],[203,829,830],{"xmlns":205},[208,831,832,836],{},[211,833,834],{},[214,835,443],{},[253,837,443],{"encoding":255},[28,839,841],{"className":840,"ariaHidden":261},[260],[28,842,844,847],{"className":843},[265],[28,845],{"className":846,"style":455},[269],[28,848,443],{"className":849,"style":459},[274,275]," 就是整数算术与数组的组合。SMT 要回答的，正是这组原子能不能同时为真。",[419,852,854],{"id":853},"_12-公式的样子","1.2 公式的样子",[11,856,857],{},"SMT 公式由布尔结构和理论原子组成：",[28,859,861],{"className":860,"translate":193},[192],[28,862,864,956],{"className":863,"translate":193},[197],[28,865,867],{"className":866},[201],[203,868,869],{"xmlns":205,"display":206},[208,870,871,953],{},[211,872,873,875,878,880,882,885,887,890,892,895,897,899,901,904,906,908,910,913,915,917,919,921,923,925,927,929,931,933,935,938,940,942,944,946,948,951],{},[214,874,510],{},[217,876,877],{},":",[217,879,877],{},[217,881,83],{},[214,883,884],{"mathvariant":484},"⊤",[228,886,230],{},[217,888,889],{},"∣",[228,891,230],{},[214,893,894],{"mathvariant":484},"⊥",[228,896,230],{},[217,898,889],{},[228,900,230],{},[214,902,903],{},"A",[228,905,230],{},[217,907,889],{},[228,909,230],{},[214,911,912],{"mathvariant":484},"¬",[214,914,510],{},[228,916,230],{},[217,918,889],{},[228,920,230],{},[214,922,510],{},[217,924,233],{},[214,926,510],{},[228,928,230],{},[217,930,889],{},[228,932,230],{},[214,934,510],{},[217,936,937],{},"∨",[214,939,510],{},[228,941,230],{},[217,943,889],{},[228,945,230],{},[214,947,510],{},[217,949,950],{},"→",[214,952,510],{},[253,954,955],{"encoding":255},"\\varphi ::= \\top \\;\\mid\\; \\bot \\;\\mid\\; A \\;\\mid\\; \\neg\\varphi \\;\\mid\\; \\varphi \\wedge \\varphi \\;\\mid\\; \\varphi \\vee \\varphi \\;\\mid\\; \\varphi \\rightarrow \\varphi",[28,957,959,978,1002,1026,1050,1077,1096,1120,1138,1162,1180],{"className":958,"ariaHidden":261},[260],[28,960,962,965,968,971,975],{"className":961},[265],[28,963],{"className":964,"style":612},[269],[28,966,510],{"className":967},[274,275],[28,969],{"className":970,"style":302},[279],[28,972,974],{"className":973},[306],"::=",[28,976],{"className":977,"style":302},[279],[28,979,981,984,987,990,993,996,999],{"className":980},[265],[28,982],{"className":983,"style":341},[269],[28,985,884],{"className":986},[274],[28,988],{"className":989,"style":302},[279],[28,991],{"className":992,"style":302},[279],[28,994,889],{"className":995},[306],[28,997],{"className":998,"style":302},[279],[28,1000],{"className":1001,"style":302},[279],[28,1003,1005,1008,1011,1014,1017,1020,1023],{"className":1004},[265],[28,1006],{"className":1007,"style":341},[269],[28,1009,894],{"className":1010},[274],[28,1012],{"className":1013,"style":302},[279],[28,1015],{"className":1016,"style":302},[279],[28,1018,889],{"className":1019},[306],[28,1021],{"className":1022,"style":302},[279],[28,1024],{"className":1025,"style":302},[279],[28,1027,1029,1032,1035,1038,1041,1044,1047],{"className":1028},[265],[28,1030],{"className":1031,"style":341},[269],[28,1033,903],{"className":1034},[274,275],[28,1036],{"className":1037,"style":302},[279],[28,1039],{"className":1040,"style":302},[279],[28,1042,889],{"className":1043},[306],[28,1045],{"className":1046,"style":302},[279],[28,1048],{"className":1049,"style":302},[279],[28,1051,1053,1056,1059,1062,1065,1068,1071,1074],{"className":1052},[265],[28,1054],{"className":1055,"style":341},[269],[28,1057,912],{"className":1058},[274],[28,1060,510],{"className":1061},[274,275],[28,1063],{"className":1064,"style":302},[279],[28,1066],{"className":1067,"style":302},[279],[28,1069,889],{"className":1070},[306],[28,1072],{"className":1073,"style":302},[279],[28,1075],{"className":1076,"style":302},[279],[28,1078,1080,1084,1087,1090,1093],{"className":1079},[265],[28,1081],{"className":1082,"style":1083},[269],"height:0.75em;vertical-align:-0.1944em;",[28,1085,510],{"className":1086},[274,275],[28,1088],{"className":1089,"style":280},[279],[28,1091,233],{"className":1092},[284],[28,1094],{"className":1095,"style":280},[279],[28,1097,1099,1102,1105,1108,1111,1114,1117],{"className":1098},[265],[28,1100],{"className":1101,"style":341},[269],[28,1103,510],{"className":1104},[274,275],[28,1106],{"className":1107,"style":302},[279],[28,1109],{"className":1110,"style":302},[279],[28,1112,889],{"className":1113},[306],[28,1115],{"className":1116,"style":302},[279],[28,1118],{"className":1119,"style":302},[279],[28,1121,1123,1126,1129,1132,1135],{"className":1122},[265],[28,1124],{"className":1125,"style":1083},[269],[28,1127,510],{"className":1128},[274,275],[28,1130],{"className":1131,"style":280},[279],[28,1133,937],{"className":1134},[284],[28,1136],{"className":1137,"style":280},[279],[28,1139,1141,1144,1147,1150,1153,1156,1159],{"className":1140},[265],[28,1142],{"className":1143,"style":341},[269],[28,1145,510],{"className":1146},[274,275],[28,1148],{"className":1149,"style":302},[279],[28,1151],{"className":1152,"style":302},[279],[28,1154,889],{"className":1155},[306],[28,1157],{"className":1158,"style":302},[279],[28,1160],{"className":1161,"style":302},[279],[28,1163,1165,1168,1171,1174,1177],{"className":1164},[265],[28,1166],{"className":1167,"style":612},[269],[28,1169,510],{"className":1170},[274,275],[28,1172],{"className":1173,"style":302},[279],[28,1175,950],{"className":1176},[306],[28,1178],{"className":1179,"style":302},[279],[28,1181,1183,1186],{"className":1182},[265],[28,1184],{"className":1185,"style":612},[269],[28,1187,510],{"className":1188},[274,275],[11,1190,1191,1192,1220,1221,1224,1225,177,1363,177,1497,177,1648,1751],{},"其中 ",[28,1193,1195,1208],{"className":1194,"translate":193},[197],[28,1196,1198],{"className":1197},[201],[203,1199,1200],{"xmlns":205},[208,1201,1202,1206],{},[211,1203,1204],{},[214,1205,903],{},[253,1207,903],{"encoding":255},[28,1209,1211],{"className":1210,"ariaHidden":261},[260],[28,1212,1214,1217],{"className":1213},[265],[28,1215],{"className":1216,"style":455},[269],[28,1218,903],{"className":1219},[274,275]," 是",[183,1222,1223],{},"理论原子","，形如 ",[28,1226,1228,1257],{"className":1227,"translate":193},[197],[28,1229,1231],{"className":1230},[201],[203,1232,1233],{"xmlns":205},[208,1234,1235,1254],{},[211,1236,1237,1245,1247],{},[501,1238,1239,1242],{},[214,1240,1241],{},"t",[224,1243,1244],{},"1",[217,1246,83],{},[501,1248,1249,1251],{},[214,1250,1241],{},[224,1252,1253],{},"2",[253,1255,1256],{"encoding":255},"t_1 = t_2",[28,1258,1260,1317],{"className":1259,"ariaHidden":261},[260],[28,1261,1263,1267,1308,1311,1314],{"className":1262},[265],[28,1264],{"className":1265,"style":1266},[269],"height:0.7651em;vertical-align:-0.15em;",[28,1268,1270,1273],{"className":1269},[274],[28,1271,1241],{"className":1272},[274,275],[28,1274,1276],{"className":1275},[556],[28,1277,1279,1300],{"className":1278},[560,561],[28,1280,1282,1297],{"className":1281},[565],[28,1283,1286],{"className":1284,"style":1285},[569],"height:0.3011em;",[28,1287,1288,1291],{"style":573},[28,1289],{"className":1290,"style":578},[577],[28,1292,1294],{"className":1293},[582,583,584,585],[28,1295,1244],{"className":1296},[274,585],[28,1298,593],{"className":1299},[592],[28,1301,1303],{"className":1302},[565],[28,1304,1306],{"className":1305,"style":600},[569],[28,1307],{},[28,1309],{"className":1310,"style":302},[279],[28,1312,83],{"className":1313},[306],[28,1315],{"className":1316,"style":302},[279],[28,1318,1320,1323],{"className":1319},[265],[28,1321],{"className":1322,"style":1266},[269],[28,1324,1326,1329],{"className":1325},[274],[28,1327,1241],{"className":1328},[274,275],[28,1330,1332],{"className":1331},[556],[28,1333,1335,1355],{"className":1334},[560,561],[28,1336,1338,1352],{"className":1337},[565],[28,1339,1341],{"className":1340,"style":1285},[569],[28,1342,1343,1346],{"style":573},[28,1344],{"className":1345,"style":578},[577],[28,1347,1349],{"className":1348},[582,583,584,585],[28,1350,1253],{"className":1351},[274,585],[28,1353,593],{"className":1354},[592],[28,1356,1358],{"className":1357},[565],[28,1359,1361],{"className":1360,"style":600},[569],[28,1362],{},[28,1364,1366,1393],{"className":1365,"translate":193},[197],[28,1367,1369],{"className":1368},[201],[203,1370,1371],{"xmlns":205},[208,1372,1373,1390],{},[211,1374,1375,1381,1384],{},[501,1376,1377,1379],{},[214,1378,1241],{},[224,1380,1244],{},[217,1382,1383],{},"\u003C",[501,1385,1386,1388],{},[214,1387,1241],{},[224,1389,1253],{},[253,1391,1392],{"encoding":255},"t_1 \u003C t_2",[28,1394,1396,1451],{"className":1395,"ariaHidden":261},[260],[28,1397,1399,1402,1442,1445,1448],{"className":1398},[265],[28,1400],{"className":1401,"style":1266},[269],[28,1403,1405,1408],{"className":1404},[274],[28,1406,1241],{"className":1407},[274,275],[28,1409,1411],{"className":1410},[556],[28,1412,1414,1434],{"className":1413},[560,561],[28,1415,1417,1431],{"className":1416},[565],[28,1418,1420],{"className":1419,"style":1285},[569],[28,1421,1422,1425],{"style":573},[28,1423],{"className":1424,"style":578},[577],[28,1426,1428],{"className":1427},[582,583,584,585],[28,1429,1244],{"className":1430},[274,585],[28,1432,593],{"className":1433},[592],[28,1435,1437],{"className":1436},[565],[28,1438,1440],{"className":1439,"style":600},[569],[28,1441],{},[28,1443],{"className":1444,"style":302},[279],[28,1446,1383],{"className":1447},[306],[28,1449],{"className":1450,"style":302},[279],[28,1452,1454,1457],{"className":1453},[265],[28,1455],{"className":1456,"style":1266},[269],[28,1458,1460,1463],{"className":1459},[274],[28,1461,1241],{"className":1462},[274,275],[28,1464,1466],{"className":1465},[556],[28,1467,1469,1489],{"className":1468},[560,561],[28,1470,1472,1486],{"className":1471},[565],[28,1473,1475],{"className":1474,"style":1285},[569],[28,1476,1477,1480],{"style":573},[28,1478],{"className":1479,"style":578},[577],[28,1481,1483],{"className":1482},[582,583,584,585],[28,1484,1253],{"className":1485},[274,585],[28,1487,593],{"className":1488},[592],[28,1490,1492],{"className":1491},[565],[28,1493,1495],{"className":1494,"style":600},[569],[28,1496],{},[28,1498,1500,1534],{"className":1499,"translate":193},[197],[28,1501,1503],{"className":1502},[201],[203,1504,1505],{"xmlns":205},[208,1506,1507,1531],{},[211,1508,1509,1512,1514,1520,1523,1525],{},[214,1510,1511],{},"f",[217,1513,43],{"stretchy":241},[501,1515,1516,1518],{},[214,1517,1241],{},[224,1519,1244],{},[217,1521,1522],{"stretchy":241},")",[217,1524,83],{},[501,1526,1527,1529],{},[214,1528,1241],{},[224,1530,1253],{},[253,1532,1533],{"encoding":255},"f(t_1) = t_2",[28,1535,1537,1602],{"className":1536,"ariaHidden":261},[260],[28,1538,1540,1543,1547,1550,1590,1593,1596,1599],{"className":1539},[265],[28,1541],{"className":1542,"style":341},[269],[28,1544,1511],{"className":1545,"style":1546},[274,275],"margin-right:0.1076em;",[28,1548,43],{"className":1549},[348],[28,1551,1553,1556],{"className":1552},[274],[28,1554,1241],{"className":1555},[274,275],[28,1557,1559],{"className":1558},[556],[28,1560,1562,1582],{"className":1561},[560,561],[28,1563,1565,1579],{"className":1564},[565],[28,1566,1568],{"className":1567,"style":1285},[569],[28,1569,1570,1573],{"style":573},[28,1571],{"className":1572,"style":578},[577],[28,1574,1576],{"className":1575},[582,583,584,585],[28,1577,1244],{"className":1578},[274,585],[28,1580,593],{"className":1581},[592],[28,1583,1585],{"className":1584},[565],[28,1586,1588],{"className":1587,"style":600},[569],[28,1589],{},[28,1591,1522],{"className":1592},[355],[28,1594],{"className":1595,"style":302},[279],[28,1597,83],{"className":1598},[306],[28,1600],{"className":1601,"style":302},[279],[28,1603,1605,1608],{"className":1604},[265],[28,1606],{"className":1607,"style":1266},[269],[28,1609,1611,1614],{"className":1610},[274],[28,1612,1241],{"className":1613},[274,275],[28,1615,1617],{"className":1616},[556],[28,1618,1620,1640],{"className":1619},[560,561],[28,1621,1623,1637],{"className":1622},[565],[28,1624,1626],{"className":1625,"style":1285},[569],[28,1627,1628,1631],{"style":573},[28,1629],{"className":1630,"style":578},[577],[28,1632,1634],{"className":1633},[582,583,584,585],[28,1635,1253],{"className":1636},[274,585],[28,1638,593],{"className":1639},[592],[28,1641,1643],{"className":1642},[565],[28,1644,1646],{"className":1645,"style":600},[569],[28,1647],{},[28,1649,1651,1697],{"className":1650,"translate":193},[197],[28,1652,1654],{"className":1653},[201],[203,1655,1656],{"xmlns":205},[208,1657,1658,1694],{},[211,1659,1660,1677,1679,1681,1684,1687,1689,1691],{},[211,1661,1662,1665,1668,1671,1673,1675],{},[214,1663,1664],{"mathvariant":484},"s",[214,1666,1667],{"mathvariant":484},"e",[214,1669,1670],{"mathvariant":484},"l",[214,1672,1667],{"mathvariant":484},[214,1674,22],{"mathvariant":484},[214,1676,1241],{"mathvariant":484},[217,1678,43],{"stretchy":241},[214,1680,238],{},[217,1682,1683],{"separator":261},",",[214,1685,1686],{},"i",[217,1688,1522],{"stretchy":241},[217,1690,83],{},[214,1692,1693],{},"v",[253,1695,1696],{"encoding":255},"\\mathrm{select}(a, i) = v",[28,1698,1700,1742],{"className":1699,"ariaHidden":261},[260],[28,1701,1703,1706,1714,1717,1720,1724,1727,1730,1733,1736,1739],{"className":1702},[265],[28,1704],{"className":1705,"style":341},[269],[28,1707,1709],{"className":1708},[274],[28,1710,1713],{"className":1711},[274,1712],"mathrm","select",[28,1715,43],{"className":1716},[348],[28,1718,238],{"className":1719},[274,275],[28,1721,1683],{"className":1722},[1723],"mpunct",[28,1725],{"className":1726,"style":530},[279],[28,1728,1686],{"className":1729},[274,275],[28,1731,1522],{"className":1732},[355],[28,1734],{"className":1735,"style":302},[279],[28,1737,83],{"className":1738},[306],[28,1740],{"className":1741,"style":302},[279],[28,1743,1745,1748],{"className":1744},[265],[28,1746],{"className":1747,"style":645},[269],[28,1749,1693],{"className":1750,"style":298},[274,275],"。原子内部的项由变量、常量和理论函数符号组成。",[11,1753,1754],{},"下面这个公式同时用到了三种理论：",[28,1756,1758],{"className":1757,"translate":193},[192],[28,1759,1761,1884],{"className":1760,"translate":193},[197],[28,1762,1764],{"className":1763},[201],[203,1765,1766],{"xmlns":205,"display":206},[208,1767,1768,1881],{},[211,1769,1770,1796,1798,1800,1802,1830,1832,1834,1836,1838,1868,1870,1872,1874,1877,1879],{},[1771,1772,1773,1794],"munder",{},[1771,1774,1775,1791],{},[211,1776,1777,1779,1781,1783,1785,1787,1789],{},[217,1778,43],{"stretchy":241},[214,1780,176],{},[217,1782,124],{},[214,1784,180],{},[217,1786,130],{},[224,1788,226],{},[217,1790,1522],{"stretchy":241},[217,1792,1793],{"stretchy":261},"⏟",[214,1795,11],{},[228,1797,230],{},[217,1799,233],{},[228,1801,230],{},[1771,1803,1804,1827],{},[1771,1805,1806,1825],{},[211,1807,1808,1811,1813,1815,1817,1819,1821,1823],{},[217,1809,43],{"fence":261,"stretchy":261,"minsize":1810,"maxsize":1810},"1.2em",[214,1812,238],{},[217,1814,73],{"stretchy":241},[224,1816,89],{},[217,1818,246],{"stretchy":241},[217,1820,83],{},[224,1822,251],{},[217,1824,1522],{"fence":261,"stretchy":261,"minsize":1810,"maxsize":1810},[217,1826,1793],{"stretchy":261},[214,1828,1829],{},"q",[228,1831,230],{},[217,1833,233],{},[228,1835,230],{},[217,1837,43],{"fence":261,"stretchy":261,"minsize":1810,"maxsize":1810},[1771,1839,1840,1865],{},[1771,1841,1842,1863],{},[211,1843,1844,1846,1848,1850,1852,1855,1857,1859,1861],{},[214,1845,1511],{},[217,1847,43],{"stretchy":241},[214,1849,176],{},[217,1851,1522],{"stretchy":241},[217,1853,1854],{"mathvariant":484},"≠",[214,1856,1511],{},[217,1858,43],{"stretchy":241},[214,1860,180],{},[217,1862,1522],{"stretchy":241},[217,1864,1793],{"stretchy":261},[214,1866,1867],{},"r",[217,1869,937],{},[228,1871,488],{},[214,1873,180],{},[217,1875,1876],{},"≤",[224,1878,89],{},[217,1880,1522],{"fence":261,"stretchy":261,"minsize":1810,"maxsize":1810},[253,1882,1883],{"encoding":255},"\\underbrace{(x + y > 10)}_{p}\\;\\wedge\\;\\underbrace{\\bigl(a[0] = 5\\bigr)}_{q}\\;\\wedge\\;\\bigl(\\underbrace{f(x) \\ne f(y)}_{r} \\vee\\, y \\le 0\\bigr)",[28,1885,1887,2072,2240,2444,2463],{"className":1886,"ariaHidden":261},[260],[28,1888,1890,1894,2057,2060,2063,2066,2069],{"className":1889},[265],[28,1891],{"className":1892,"style":1893},[269],"height:2.2855em;vertical-align:-1.5355em;",[28,1895,1898],{"className":1896},[1897,1771],"minner",[28,1899,1901,2048],{"className":1900},[560,561],[28,1902,1904,2045],{"className":1903},[565],[28,1905,1908,1924],{"className":1906,"style":1907},[569],"height:0.75em;",[28,1909,1911,1915],{"style":1910},"top:-1.6006em;",[28,1912],{"className":1913,"style":1914},[577],"height:3em;",[28,1916,1918],{"className":1917},[582,583,584,585],[28,1919,1921],{"className":1920},[274,585],[28,1922,11],{"className":1923},[274,275,585],[28,1925,1927,1930],{"style":1926},"top:-3em;",[28,1928],{"className":1929,"style":1914},[577],[28,1931,1933],{"className":1932},[1897,1771],[28,1934,1936,2036],{"className":1935},[560,561],[28,1937,1939,2033],{"className":1938},[565],[28,1940,1942,1992],{"className":1941,"style":1907},[569],[28,1943,1947,1950],{"className":1944,"style":1946},[1945],"svg-align","top:-2.102em;",[28,1948],{"className":1949,"style":1914},[577],[28,1951,1955,1972,1982],{"className":1952,"style":1954},[1953],"stretchy","height:0.548em;min-width:1.6em;",[28,1956,1960],{"className":1957,"style":1959},[1958],"brace-left","height:0.548em;",[1961,1962,1968],"svg",{"xmlns":1963,"width":1964,"height":1965,"viewBox":1966,"preserveAspectRatio":1967},"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg","400em","0.548em","0 0 400000 548","xMinYMin slice",[1969,1970],"path",{"d":1971},"M0 6l6-6h17c12.688 0 19.313.3 20 1 4 4 7.313 8.3 10 13\n 35.313 51.3 80.813 93.8 136.5 127.5 55.688 33.7 117.188 55.8 184.5 66.5.688\n 0 2 .3 4 1 18.688 2.7 76 4.3 172 5h399450v120H429l-6-1c-124.688-8-235-61.7\n-331-161C60.687 138.7 32.312 99.3 7 54L0 41V6z",[28,1973,1976],{"className":1974,"style":1959},[1975],"brace-center",[1961,1977,1979],{"xmlns":1963,"width":1964,"height":1965,"viewBox":1966,"preserveAspectRatio":1978},"xMidYMin slice",[1969,1980],{"d":1981},"M199572 214\nc100.7 8.3 195.3 44 280 108 55.3 42 101.7 93 139 153l9 14c2.7-4 5.7-8.7 9-14\n 53.3-86.7 123.7-153 211-199 66.7-36 137.3-56.3 212-62h199568v120H200432c-178.3\n 11.7-311.7 78.3-403 201-6 8-9.7 12-11 12-.7.7-6.7 1-18 1s-17.3-.3-18-1c-1.3 0\n-5-4-11-12-44.7-59.3-101.3-106.3-170-141s-145.3-54.3-229-60H0V214z",[28,1983,1986],{"className":1984,"style":1959},[1985],"brace-right",[1961,1987,1989],{"xmlns":1963,"width":1964,"height":1965,"viewBox":1966,"preserveAspectRatio":1988},"xMaxYMin slice",[1969,1990],{"d":1991},"M399994 0l6 6v35l-6 11c-56 104-135.3 181.3-238 232-57.3\n 28.7-117 45-179 50H-300V214h399897c43.3-7 81-15 113-26 100.7-33 179.7-91 237\n-174 2.7-5 6-9 10-13 .7-1 7.3-1 20-1h17z",[28,1993,1994,1997],{"style":1926},[28,1995],{"className":1996,"style":1914},[577],[28,1998,2000,2003,2006,2009,2012,2015,2018,2021,2024,2027,2030],{"className":1999},[274],[28,2001,43],{"className":2002},[348],[28,2004,176],{"className":2005},[274,275],[28,2007],{"className":2008,"style":280},[279],[28,2010,124],{"className":2011},[284],[28,2013],{"className":2014,"style":280},[279],[28,2016,180],{"className":2017,"style":298},[274,275],[28,2019],{"className":2020,"style":302},[279],[28,2022,130],{"className":2023},[306],[28,2025],{"className":2026,"style":302},[279],[28,2028,226],{"className":2029},[274],[28,2031,1522],{"className":2032},[355],[28,2034,593],{"className":2035},[592],[28,2037,2039],{"className":2038},[565],[28,2040,2043],{"className":2041,"style":2042},[569],"height:0.898em;",[28,2044],{},[28,2046,593],{"className":2047},[592],[28,2049,2051],{"className":2050},[565],[28,2052,2055],{"className":2053,"style":2054},[569],"height:1.5355em;",[28,2056],{},[28,2058],{"className":2059,"style":302},[279],[28,2061],{"className":2062,"style":280},[279],[28,2064,233],{"className":2065},[284],[28,2067],{"className":2068,"style":302},[279],[28,2070],{"className":2071,"style":280},[279],[28,2073,2075,2079,2225,2228,2231,2234,2237],{"className":2074},[265],[28,2076],{"className":2077,"style":2078},[269],"height:2.4855em;vertical-align:-1.6355em;",[28,2080,2082],{"className":2081},[1897,1771],[28,2083,2085,2216],{"className":2084},[560,561],[28,2086,2088,2213],{"className":2087},[565],[28,2089,2092,2107],{"className":2090,"style":2091},[569],"height:0.85em;",[28,2093,2095,2098],{"style":2094},"top:-1.5006em;",[28,2096],{"className":2097,"style":1914},[577],[28,2099,2101],{"className":2100},[582,583,584,585],[28,2102,2104],{"className":2103},[274,585],[28,2105,1829],{"className":2106,"style":298},[274,275,585],[28,2108,2109,2112],{"style":1926},[28,2110],{"className":2111,"style":1914},[577],[28,2113,2115],{"className":2114},[1897,1771],[28,2116,2118,2204],{"className":2117},[560,561],[28,2119,2121,2201],{"className":2120},[565],[28,2122,2124,2155],{"className":2123,"style":2091},[569],[28,2125,2128,2131],{"className":2126,"style":2127},[1945],"top:-2.002em;",[28,2129],{"className":2130,"style":1914},[577],[28,2132,2134,2141,2148],{"className":2133,"style":1954},[1953],[28,2135,2137],{"className":2136,"style":1959},[1958],[1961,2138,2139],{"xmlns":1963,"width":1964,"height":1965,"viewBox":1966,"preserveAspectRatio":1967},[1969,2140],{"d":1971},[28,2142,2144],{"className":2143,"style":1959},[1975],[1961,2145,2146],{"xmlns":1963,"width":1964,"height":1965,"viewBox":1966,"preserveAspectRatio":1978},[1969,2147],{"d":1981},[28,2149,2151],{"className":2150,"style":1959},[1985],[1961,2152,2153],{"xmlns":1963,"width":1964,"height":1965,"viewBox":1966,"preserveAspectRatio":1988},[1969,2154],{"d":1991},[28,2156,2157,2160],{"style":1926},[28,2158],{"className":2159,"style":1914},[577],[28,2161,2163,2171,2174,2177,2180,2183,2186,2189,2192,2195],{"className":2162},[274],[28,2164,2166],{"className":2165},[348],[28,2167,43],{"className":2168},[2169,2170],"delimsizing","size1",[28,2172,238],{"className":2173},[274,275],[28,2175,73],{"className":2176},[348],[28,2178,89],{"className":2179},[274],[28,2181,246],{"className":2182},[355],[28,2184],{"className":2185,"style":302},[279],[28,2187,83],{"className":2188},[306],[28,2190],{"className":2191,"style":302},[279],[28,2193,251],{"className":2194},[274],[28,2196,2198],{"className":2197},[355],[28,2199,1522],{"className":2200},[2169,2170],[28,2202,593],{"className":2203},[592],[28,2205,2207],{"className":2206},[565],[28,2208,2211],{"className":2209,"style":2210},[569],"height:0.998em;",[28,2212],{},[28,2214,593],{"className":2215},[592],[28,2217,2219],{"className":2218},[565],[28,2220,2223],{"className":2221,"style":2222},[569],"height:1.6355em;",[28,2224],{},[28,2226],{"className":2227,"style":302},[279],[28,2229],{"className":2230,"style":280},[279],[28,2232,233],{"className":2233},[284],[28,2235],{"className":2236,"style":302},[279],[28,2238],{"className":2239,"style":280},[279],[28,2241,2243,2247,2253,2432,2435,2438,2441],{"className":2242},[265],[28,2244],{"className":2245,"style":2246},[269],"height:2.2494em;vertical-align:-1.3994em;",[28,2248,2250],{"className":2249},[348],[28,2251,43],{"className":2252},[2169,2170],[28,2254,2256],{"className":2255},[1897,1771],[28,2257,2259,2423],{"className":2258},[560,561],[28,2260,2262,2420],{"className":2261},[565],[28,2263,2265,2280],{"className":2264,"style":1907},[569],[28,2266,2267,2270],{"style":1910},[28,2268],{"className":2269,"style":1914},[577],[28,2271,2273],{"className":2272},[582,583,584,585],[28,2274,2276],{"className":2275},[274,585],[28,2277,1867],{"className":2278,"style":2279},[274,275,585],"margin-right:0.0278em;",[28,2281,2282,2285],{"style":1926},[28,2283],{"className":2284,"style":1914},[577],[28,2286,2288],{"className":2287},[1897,1771],[28,2289,2291,2412],{"className":2290},[560,561],[28,2292,2294,2409],{"className":2293},[565],[28,2295,2297,2327],{"className":2296,"style":1907},[569],[28,2298,2300,2303],{"className":2299,"style":1946},[1945],[28,2301],{"className":2302,"style":1914},[577],[28,2304,2306,2313,2320],{"className":2305,"style":1954},[1953],[28,2307,2309],{"className":2308,"style":1959},[1958],[1961,2310,2311],{"xmlns":1963,"width":1964,"height":1965,"viewBox":1966,"preserveAspectRatio":1967},[1969,2312],{"d":1971},[28,2314,2316],{"className":2315,"style":1959},[1975],[1961,2317,2318],{"xmlns":1963,"width":1964,"height":1965,"viewBox":1966,"preserveAspectRatio":1978},[1969,2319],{"d":1981},[28,2321,2323],{"className":2322,"style":1959},[1985],[1961,2324,2325],{"xmlns":1963,"width":1964,"height":1965,"viewBox":1966,"preserveAspectRatio":1988},[1969,2326],{"d":1991},[28,2328,2329,2332],{"style":1926},[28,2330],{"className":2331,"style":1914},[577],[28,2333,2335,2338,2341,2344,2347,2350,2394,2397,2400,2403,2406],{"className":2334},[274],[28,2336,1511],{"className":2337,"style":1546},[274,275],[28,2339,43],{"className":2340},[348],[28,2342,176],{"className":2343},[274,275],[28,2345,1522],{"className":2346},[355],[28,2348],{"className":2349,"style":302},[279],[28,2351,2353,2387,2391],{"className":2352},[306],[28,2354,2356],{"className":2355},[306],[28,2357,2360],{"className":2358},[274,2359],"vbox",[28,2361,2364],{"className":2362},[2363],"thinbox",[28,2365,2368,2372,2383],{"className":2366},[2367],"rlap",[28,2369],{"className":2370,"style":2371},[269],"height:0.8889em;vertical-align:-0.1944em;",[28,2373,2376],{"className":2374},[2375],"inner",[28,2377,2379],{"className":2378},[274],[28,2380,2382],{"className":2381},[306],"",[28,2384],{"className":2385},[2386],"fix",[28,2388],{"className":2389},[279,2390],"nobreak",[28,2392,83],{"className":2393},[306],[28,2395],{"className":2396,"style":302},[279],[28,2398,1511],{"className":2399,"style":1546},[274,275],[28,2401,43],{"className":2402},[348],[28,2404,180],{"className":2405,"style":298},[274,275],[28,2407,1522],{"className":2408},[355],[28,2410,593],{"className":2411},[592],[28,2413,2415],{"className":2414},[565],[28,2416,2418],{"className":2417,"style":2042},[569],[28,2419],{},[28,2421,593],{"className":2422},[592],[28,2424,2426],{"className":2425},[565],[28,2427,2430],{"className":2428,"style":2429},[569],"height:1.3994em;",[28,2431],{},[28,2433],{"className":2434,"style":280},[279],[28,2436,937],{"className":2437},[284],[28,2439],{"className":2440,"style":530},[279],[28,2442],{"className":2443,"style":280},[279],[28,2445,2447,2451,2454,2457,2460],{"className":2446},[265],[28,2448],{"className":2449,"style":2450},[269],"height:0.8304em;vertical-align:-0.1944em;",[28,2452,180],{"className":2453,"style":298},[274,275],[28,2455],{"className":2456,"style":302},[279],[28,2458,1876],{"className":2459},[306],[28,2461],{"className":2462,"style":302},[279],[28,2464,2466,2470,2473],{"className":2465},[265],[28,2467],{"className":2468,"style":2469},[269],"height:1.2em;vertical-align:-0.35em;",[28,2471,89],{"className":2472},[274],[28,2474,2476],{"className":2475},[355],[28,2477,1522],{"className":2478},[2169,2170],[2480,2481,2482,2621,2698],"ul",{},[2483,2484,2485,2557,2558,2561,2562,2590,2591,2620],"li",{},[28,2486,2488,2509],{"className":2487,"translate":193},[197],[28,2489,2491],{"className":2490},[201],[203,2492,2493],{"xmlns":205},[208,2494,2495,2507],{},[211,2496,2497,2499,2501,2503,2505],{},[214,2498,176],{},[217,2500,124],{},[214,2502,180],{},[217,2504,130],{},[224,2506,226],{},[253,2508,390],{"encoding":255},[28,2510,2512,2530,2548],{"className":2511,"ariaHidden":261},[260],[28,2513,2515,2518,2521,2524,2527],{"className":2514},[265],[28,2516],{"className":2517,"style":270},[269],[28,2519,176],{"className":2520},[274,275],[28,2522],{"className":2523,"style":280},[279],[28,2525,124],{"className":2526},[284],[28,2528],{"className":2529,"style":280},[279],[28,2531,2533,2536,2539,2542,2545],{"className":2532},[265],[28,2534],{"className":2535,"style":294},[269],[28,2537,180],{"className":2538,"style":298},[274,275],[28,2540],{"className":2541,"style":302},[279],[28,2543,130],{"className":2544},[306],[28,2546],{"className":2547,"style":302},[279],[28,2549,2551,2554],{"className":2550},[265],[28,2552],{"className":2553,"style":316},[269],[28,2555,226],{"className":2556},[274]," 属于",[183,2559,2560],{},"线性整数算术","：它知道 ",[28,2563,2565,2578],{"className":2564,"translate":193},[197],[28,2566,2568],{"className":2567},[201],[203,2569,2570],{"xmlns":205},[208,2571,2572,2576],{},[211,2573,2574],{},[217,2575,124],{},[253,2577,124],{"encoding":255},[28,2579,2581],{"className":2580,"ariaHidden":261},[260],[28,2582,2584,2587],{"className":2583},[265],[28,2585],{"className":2586,"style":270},[269],[28,2588,124],{"className":2589},[274]," 是加法、",[28,2592,2594,2607],{"className":2593,"translate":193},[197],[28,2595,2597],{"className":2596},[201],[203,2598,2599],{"xmlns":205},[208,2600,2601,2605],{},[211,2602,2603],{},[217,2604,130],{},[253,2606,130],{"encoding":255},[28,2608,2610],{"className":2609,"ariaHidden":261},[260],[28,2611,2613,2617],{"className":2612},[265],[28,2614],{"className":2615,"style":2616},[269],"height:0.5782em;vertical-align:-0.0391em;",[28,2618,130],{"className":2619},[306]," 是全序；",[2483,2622,2623,2557,2688,2561,2691,2693,2694,2697],{},[28,2624,2626,2649],{"className":2625,"translate":193},[197],[28,2627,2629],{"className":2628},[201],[203,2630,2631],{"xmlns":205},[208,2632,2633,2647],{},[211,2634,2635,2637,2639,2641,2643,2645],{},[214,2636,238],{},[217,2638,73],{"stretchy":241},[224,2640,89],{},[217,2642,246],{"stretchy":241},[217,2644,83],{},[224,2646,251],{},[253,2648,394],{"encoding":255},[28,2650,2652,2679],{"className":2651,"ariaHidden":261},[260],[28,2653,2655,2658,2661,2664,2667,2670,2673,2676],{"className":2654},[265],[28,2656],{"className":2657,"style":341},[269],[28,2659,238],{"className":2660},[274,275],[28,2662,73],{"className":2663},[348],[28,2665,89],{"className":2666},[274],[28,2668,246],{"className":2669},[355],[28,2671],{"className":2672,"style":302},[279],[28,2674,83],{"className":2675},[306],[28,2677],{"className":2678,"style":302},[279],[28,2680,2682,2685],{"className":2681},[265],[28,2683],{"className":2684,"style":316},[269],[28,2686,251],{"className":2687},[274],[183,2689,2690],{},"数组理论",[25,2692,1713],{}," 和 ",[25,2695,2696],{},"store"," 的读写语义；",[2483,2699,2700,2557,2814,2817,2818,2846],{},[28,2701,2703,2733],{"className":2702,"translate":193},[197],[28,2704,2706],{"className":2705},[201],[203,2707,2708],{"xmlns":205},[208,2709,2710,2730],{},[211,2711,2712,2714,2716,2718,2720,2722,2724,2726,2728],{},[214,2713,1511],{},[217,2715,43],{"stretchy":241},[214,2717,176],{},[217,2719,1522],{"stretchy":241},[217,2721,1854],{"mathvariant":484},[214,2723,1511],{},[217,2725,43],{"stretchy":241},[214,2727,180],{},[217,2729,1522],{"stretchy":241},[253,2731,2732],{"encoding":255},"f(x) \\ne f(y)",[28,2734,2736,2796],{"className":2735,"ariaHidden":261},[260],[28,2737,2739,2742,2745,2748,2751,2754,2757,2793],{"className":2738},[265],[28,2740],{"className":2741,"style":341},[269],[28,2743,1511],{"className":2744,"style":1546},[274,275],[28,2746,43],{"className":2747},[348],[28,2749,176],{"className":2750},[274,275],[28,2752,1522],{"className":2753},[355],[28,2755],{"className":2756,"style":302},[279],[28,2758,2760,2787,2790],{"className":2759},[306],[28,2761,2763],{"className":2762},[306],[28,2764,2766],{"className":2765},[274,2359],[28,2767,2769],{"className":2768},[2363],[28,2770,2772,2775,2784],{"className":2771},[2367],[28,2773],{"className":2774,"style":2371},[269],[28,2776,2778],{"className":2777},[2375],[28,2779,2781],{"className":2780},[274],[28,2782,2382],{"className":2783},[306],[28,2785],{"className":2786},[2386],[28,2788],{"className":2789},[279,2390],[28,2791,83],{"className":2792},[306],[28,2794],{"className":2795,"style":302},[279],[28,2797,2799,2802,2805,2808,2811],{"className":2798},[265],[28,2800],{"className":2801,"style":341},[269],[28,2803,1511],{"className":2804,"style":1546},[274,275],[28,2806,43],{"className":2807},[348],[28,2809,180],{"className":2810,"style":298},[274,275],[28,2812,1522],{"className":2813},[355],[183,2815,2816],{},"未解释函数","：它不知道 ",[28,2819,2821,2834],{"className":2820,"translate":193},[197],[28,2822,2824],{"className":2823},[201],[203,2825,2826],{"xmlns":205},[208,2827,2828,2832],{},[211,2829,2830],{},[214,2831,1511],{},[253,2833,1511],{"encoding":255},[28,2835,2837],{"className":2836,"ariaHidden":261},[260],[28,2838,2840,2843],{"className":2839},[265],[28,2841],{"className":2842,"style":2371},[269],[28,2844,1511],{"className":2845,"style":1546},[274,275]," 具体算什么，只知道「同一个输入必须得到同一个输出」。",[11,2848,2849,2850,2905],{},"对 SAT 来说，这三个原子只是三个裸的布尔变量 ",[28,2851,2853,2875],{"className":2852,"translate":193},[197],[28,2854,2856],{"className":2855},[201],[203,2857,2858],{"xmlns":205},[208,2859,2860,2872],{},[211,2861,2862,2864,2866,2868,2870],{},[214,2863,11],{},[217,2865,1683],{"separator":261},[214,2867,1829],{},[217,2869,1683],{"separator":261},[214,2871,1867],{},[253,2873,2874],{"encoding":255},"p, q, r",[28,2876,2878],{"className":2877,"ariaHidden":261},[260],[28,2879,2881,2884,2887,2890,2893,2896,2899,2902],{"className":2880},[265],[28,2882],{"className":2883,"style":612},[269],[28,2885,11],{"className":2886},[274,275],[28,2888,1683],{"className":2889},[1723],[28,2891],{"className":2892,"style":530},[279],[28,2894,1829],{"className":2895,"style":298},[274,275],[28,2897,1683],{"className":2898},[1723],[28,2900],{"className":2901,"style":530},[279],[28,2903,1867],{"className":2904,"style":2279},[274,275],"。对 SMT 来说，它们各自带着一整套内部结构。",[2907,2908,2909],"div",{},[2910,2911],"img",{"height":2912,"width":2913,"style":2914,"data-d2-theme":2915,"alt":23,"src":2916},614,552,"max-width:100%;height:auto","default","data:image\u002Fsvg+xml;base64,PHN2ZyB3aWR0aD0iNTUyIiBoZWlnaHQ9IjYxNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiBkYXRhLWQyLXZlcnNpb249InYwLjkuMCIgdmlld0JveD0iMCAwIDU1MiA2MTQiPjxzdmcgd2lkdGg9IjU1MiIgaGVpZ2h0PSI2MTQiIGNsYXNzPSJkMi0xNDUwNDQ0NTY2IGQyLXN2ZyIgdmlld0JveD0iLTEgLTEgNTUyIDYxNCI+PHJlY3Qgd2lkdGg9IjU1MiIgaGVpZ2h0PSI2MTQiIHg9Ii0xIiB5PSItMSIgc3Ryb2tlLXdpZHRoPSIwIiByeD0iMCIgc3R5bGU9ImZpbGw6I2ZmZiIvPjxzdHlsZT4uZDItMTQ1MDQ0NDU2NiAudGV4dC1ib2xke2ZvbnQtZmFtaWx5OiZxdW90O2QyLTE0NTA0NDQ1NjYtZm9udC1ib2xkJnF1b3Q7fUBmb250LWZhY2V7Zm9udC1mYW1pbHk6ZDItMTQ1MDQ0NDU2Ni1mb250LWJvbGQ7c3JjOnVybChkYXRhOmFwcGxpY2F0aW9uL2ZvbnQtd29mZjtiYXNlNjQsZDA5R1JnQUJBQUFBQUF4SUFBb0FBQUFBRW5BQUFndUZBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUJQVXk4eUFBQUE5QUFBQUdBQUFBQmdYeEhYcm1OdFlYQUFBQUZVQUFBQXF3QUFBT0lseENiM1oyeDVaZ0FBQWdBQUFBWE9BQUFIRExtU01jbG9aV0ZrQUFBSDBBQUFBRFlBQUFBMkczOGUxR2hvWldFQUFBZ0lBQUFBSkFBQUFDUUtmd1hiYUcxMGVBQUFDQ3dBQUFCd0FBQUFjRGI4QlF4c2IyTmhBQUFJbkFBQUFEb0FBQUE2SEV3YWttMWhlSEFBQUFqWUFBQUFJQUFBQUNBQU5BRDNibUZ0WlFBQUNQZ0FBQU12QUFBSUtnandWa0Z3YjNOMEFBQU1LQUFBQUNBQUFBQWcvOUVBTWdBREFpb0N2QUFGQUFBQ2lnSllBQUFBU3dLS0FsZ0FBQUZlQURJQktRQUFBZ3NIQXdNRUF3SUNCR0FBQXZjQUFBQURBQUFBQUFBQUFBQkJSRUpQQUNBQUlQLy9BdTcvQmdBQUE5Z0JFU0FBQVo4QUFBQUFBZkFDbEFBQUFDQUFBM2ljaE0wN0s0VnhBTWZ4eitQODNZLzczZlIwTXRCWkdNN0l4blltbWFRb21XWGloVmlzQnJ1U1Mza2JCam5KeW92NEtjcXE3L3FwTHlvTkZacUtGNnlvRlVWdFRkdUdqaTA3dXZic08zRGt4Sm1MMW1Ick9FRnRWZHU2amszYnVuYi8xS256WDVXUGZPWXI3M25MYTU1em45czg1aUUzdWM1VkxudFB2YnVmLy85VnBzMllOMkhTbEFXTCtqUVUvUVlNbWpWbnlMQVJvNXJHakZ1MnhEY0FBQUQvL3dNQTZvQXU1QUI0bkZ4VVcyd1QyUm4rLzVPeEozRk13dGcrTTNaOGkyZmlHY2VCWER5ZW1UUkpFNUlsRjlUWThhNEF3MktTSlNxSmdleEZRQlV1b1VnRmdWcThiQ3NRbXhZSnRSRkkxWXBLcVhoSjk2R3RxcjVVbTZkdVYwaFZsYTYyKzlCcTFVQ3JxTzIyc1YyZHdaSFFQdGh6SHY3emY1Zi8rdzg0SUFkQVpzbGRxSU1HYUFZUFVBQmRpQWx4WGRNVTN0SXRTNUhxTEEwRlBrYzhsVWNQdFhhdXZaMUx0aTVITDgzTVlHYWEzQzB2SE12TXp2NXJwcisvOHVBWEgxYmV4WE1mQWlCa0FQQVpLVUdqM1kvR3FFNFZHcU1aWEs3OGIyTURtMGxwNmRybGUwdXdVL3RYVW9LR2wyc3plTC95bjg4K0k2V2w5NWZLc0ZOSGZrWktFR1YxdWxjVUpkMDBMYTh1S0ViYU5DMkY1eFZOVXlLRTBzeFBUcms4THM0bHVPWi9mSU52cU9PTTQ2OGVUM05jUFU5S2xZM1FZQ1F5R0VLNWZQNVo2MVF1ZXYvTEwrOUhjMU90enhpR1V0MGlMcklNU1FDSHJHcVdLT29wMDBpcm10WkpHSXFlRWlWZVZSWFpTWDJpSklraTlUbWQ2TnQzTlhWUU9aem8zS3QzSElvTnFQMm45dmUray94RzZ6NU4zZnUxNU1IK3NiNjMzTjJkSnlPcUhJNkdQVzFOWFdOZDVwSDBudVR4UURBYWlrUUUyWDl3MUN6MEFrSUFnSGhKQ1hpbVVURmlWQkhXbitCL241RGRTMHZsNXk5OE9GRGRJbE9rQklMTjBSQjB3V2V6WkFjblpxL2V1TnRuV1FPM3I3bnZQY1RweXAwM0ppZmZ3RGNyS3cvdkFZRmtkUXYvZ05zUUFBVkFrbFVqYlZxMkhGNnp4VkZCMFJTbjAwcVpsdUZrR24rNVAzZjlEbEhhby92YWpLNHpmVE56RjF4Y2RMdytFUGRtQjZMdS9GRDJTSE5NODlNVDRiYTN6bFkrMTBQS1djbWJkM1dFL1pMTjFRK0E1OG52d1A5Q2ovVVZEMWtzaE5kSFJ0cHlyMFRUdTRPN1d0ekJ5TkdqZU9WTlI5QTRuSFk3Rnh5T21CbzVWN2tHUUdDNE9rRkUzQVl2UkFBa1FXZmpaNVI5VHFjaXE1cEV2V3hVaXN4VFVSeSs0T0xDQjdUWGl3TXpadXRBaTJOS05ROTNKSDJKTmZMVG5oYmx1K2NPWFJnS0JxWitnRzFqa3pmMmZ1UnBZdjIxNmdSdTIvMWJBUnlHWmJmZElheGJ1bERIWE5rWlBwNXlCa2Jrd3R2OU0rbjJ3VERuUHZlNVgvTjRPM3lLMmJYMi9xUS9ldXZpcTk4YURMZjJsSTlnbXkvd2thZnBsZkVEbzdZbnd3RDRIbTZEaDNteW82TG1DQzh3NXNGSmxZWmMvbDJCM2FHdisvQjVQdFhqY0Z6bHVQWlU1Vk5BYUFMQUxYek9zcUo3TlYycUxZS2w4NUtpcVNxYkg4ODNMYi8zWUk5TGRISDFubnA1K2ZzL2ZORHRsdHhjZzY5QlE3S1pveDJVZHRCYzlSK3YwVDJVZG9pdk1WN3U2aUNXOFRrRTdXVFVzbTlaZFM4aDFEV1JDMktzdVlYMzFNY1RMdjVYZDhjYlBTNnVYbWdZZVBleDFEdjFHeWYzRGpyYXdpMzRsMC9rc2JneXJueFNhUnc4bEdTNUpSQ3ZidUVYNUNZME1nU1czSFJ0ZkZyS1pEdkdqR1hPaWxnL2QrWEtIUHNGRXBLVUNQZ1Rmbi9DL2NIS3lxTkhLeXNmbkkxUDUvTUZXUzdrODlOeHhuc01BUDlJTG9NYlFEZFl5a3pUMGdXZGpuMXZNVDBoTHl3dTR0dkhYQ0ZmZVh1UjhVQ1FxbHY0S2JrTTBaZDFHbWtHejJ2ZUdGVjR4c3ZPMWIrekMrcEllSCtpcDY5M1R5Z2VIdkZnOFcrTk1kVTYxanQ4MnAyT0gyK0pwM3E2VTAyZUpBNHZMVFluOC92SHZwbTJNU2FxR1V5UVA4TXVBRWxsU2kzSlhpZHBmV2gwZEtoZ3BWTFdrL21ONjljMzV0VVRUOCtjZmpvTENOM1ZETzZ1M2RGc1I5Z01xTTlaS3ZTbVVyMkZvZEhSSityczA5Tm5ucDVRN2J1QWtLOFdNVWwreTk0TFNXRExwTlA4eHlkUEx0Y1ZzdVY5MlJkNk82dEZ4RnFON1k4dWRNN05mYnljSmIvT2JqOThVU1BETkc0U2s3M1hscUVZdXFHejFhUy9YMTFkV0YyZFhpdXVyUlhYb0ZvRkdWWndFLzlKVkFqQ2VYQkNFRXExKzBYY0pOM3NEYmNNeXpJMHpYQlFlZlhtelZWY0wxN3M2K0s2K2k3K2ZJNWhFWkFCYXJXN0FPSnhJMDU1bmtvU0dqR0ttNVUwcmorK2Rlc3grLzdvOXFYYkZ6dGxUdTZzL0wxWXJPRWtjSk1zZ0JmQXNoUkR0eFFqWnVtOFRoVmVwekUrUFg3MHpvRS9JWjJZbm1DSHloY1RpVXZ6MzVtL1pQL1o5MUhFVGZ3MjFBRjRqUmlWY1IzRlloRUEvZzhBQVAvL0F3QzZqNUVuQUFBQUFRQUFBQUlMaFNSUXM3VmZEenoxQUFFRDZBQUFBQURZWGFDRUFBQUFBTjFtTHpiK04vN0VDRzBEOFFBQkFBTUFBZ0FBQUFBQUFBQUJBQUFEMlA3dkFBQUltUDQzL2pjSWJRQUJBQUFBQUFBQUFBQUFBQUFBQUFBQUhBS3lBRkFBeUFBQUFpUUFUUUlNQUUwQytnQk5BaXdBSXdJc0FCa0NtUUJKQWc4QUtnRlZBQmdDUFFCQkFqMEFKd0dPQUVFQ0FnQU9BZ2tBREFJUUFDVUNFQUJHQWhBQUZ3RllBRWdCV0FBd0FWZ0FWd0ZZQUM0Q0VBQWlBaEFBSWdJUUFDSUNFQUFpQWhBQUlnSVFBQ0lBQUFBc0FDd0FRZ0JXQUlnQXlBRGFBUGdCTUFGV0FZWUJ1Z0hhQWdZQ05nSmlBbm9DckFMR0F1QUM4Z01FQXhnREpBTTZBMWdEZUFPR0FBQUFBUUFBQUJ3QWtBQU1BR01BQndBQkFBQUFBQUFBQUFBQUFBQUFBQVFBQTNpY25KVFBiaHRsRk1WL1RtelRDc0VDUlZXNmliNEZpeUsxWTFNbFZkdXNKcVJXUmtSeDhMZ2dKSVEwdGllMjVmSE15RE4yR3A2QU5XL0JXM1RGUS9BY2lEVzYxOWV1WFJBRks0cDFadWIrT2QrNTUzN0FBWCt5VDZWNkgvaXRuaHF1Y0ZTL05yekh2ZnFGNFgxYTlUM0RWUjdWZmpkY1kxQmJHSzd6ZWExaitDUGVWbjh4ZkkvajZvK0c3M05ZYlJuK21LZlZBOE9mN0R2K01Qd3B4N3hkNGdvODUyZkRGUTdKRGU5eHdBK0c5M21BMWF4VWVVRFRjSTNQT0RKYzV3am9NcVlrWVV6S0VNY05ZNGJNbVJGVEVCSXpZOHdOTVFNY0FUNEpwYjVOaVJRNWh2LzROaUtrWkVha0ZVZVVPQkpDRWlJS1JsYnhKODNLdU5hTzBtZW1TTHI1bEl5STZHbkdoSWdVUjhhUWpKU1lpZFlwS2NsNVNZTUdCWDNsbTFOUzRGRXdKc0VqWThhUUJtMWFYTkpseEpnQ1Iwc3JDYk9RakJ0S2JvbTB2N01JVWFaUFRFcGhyT2FrREpTblUzNnhaZ2RjNG1pVGEreG01Y3V0Q285eGZLdlp3azFpSEYvaTZiL2JZTGJkZDhVbVlxRjZpb1k5RXVWNXF4TWNxZUxTMStjYnhTVXZjVHZwczgza3d4b05sSjNNZWt5UHVjNWY1aWQ1d2lURnVVTjhRblZRNkI3aU9OUG5nRkFWK1k2QUxoZTBlVTFYbjMwNmRQQzVva3ZBSzgxdDA4SHhGVzJ1T05lTVFQSHlXMHNkYzhYM09MNG0wQmlwSFpzK29yazh2U0UzZHd0M2NZYWNZMHF1V3lBemx2T0w4K09kSml3N2xHMjVvMUJYOUhXUEpGTDJRRlNSUFlzWW1pdHlkY1ZVdFZ4NW96RDlCdVlJK1ZycWJOOTlsMjFZMk82dHR2aU9USGZZTVRkT01ya2xvdzlOMVh2UE03ZjY1eEV4SUtPbkVYMHlwalFvdWRPelhSTXhKOEZ4cmo2KzBDMHA4ZGM1MHVkT1hSSXpWUVlCcWRhWmtldHZaTDRKalh0L3kvZk83aExadktudTZHUjlxbDI2U09WMFkwYXZWYjNWdDlCVWpqY20wTENwWnBZakU1Ykt5NU9LOXlYYTIrSWZxdnNMdmQweW5uQkdSc0xnYnpmQVV6eWFISFBDS1NQdElKVlRGblk3TlBXR2FQS0NVejM5aEZpajVMNThvenBKaFJNOG5uSENDUzk0OXA2T0t5Yk91TGcxbDgzZVB1ZWMwZWIwUDUxaUdkL21qRmZyZC8vZTlWZGwydFN6T0o2c241N3ZQTVZILzhPdFgvQjQ2NzdzNkMwZ203T3dhdSsyNG9xSXFYQnhoNXRhdUlkNGZ3RUFBUC8vQXdEMHQwOVJBQUFEQUFBQUFBQUEvODRBTWdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQSl9LmNvbm5lY3Rpb24sLnNoYXBle3N0cm9rZS1saW5lam9pbjpyb3VuZH0uc2hhcGV7c2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbn0uY29ubmVjdGlvbntzdHJva2UtbGluZWNhcDpyb3VuZH0uZDItMTQ1MDQ0NDU2NiAuZmlsbC1OMXtmaWxsOiMwYTBmMjV9LmQyLTE0NTA0NDQ1NjYgLnN0cm9rZS1CMXtzdHJva2U6IzBkMzJiMn08L3N0eWxlPjxnIGNsYXNzPSJabTl5YlhWc1lRPT0gbGF5ZXIiPjxwYXRoIGZpbGw9IiNlZWY0ZmYiIHN0cm9rZT0iIzRhNmZhNSIgZD0iTTEzMSAwaDI4M3Y4MkgxMzF6IiBjbGFzcz0ic2hhcGUiIHN0eWxlPSJzdHJva2Utd2lkdGg6MiIvPjx0ZXh0IHg9IjI3Mi41IiB5PSIzOC41IiBmaWxsPSIjMGEwZjI1IiBjbGFzcz0idGV4dC1ib2xkIGZpbGwtTjEiIHN0eWxlPSJ0ZXh0LWFuY2hvcjptaWRkbGU7Zm9udC1zaXplOjE2cHgiPjx0c3BhbiB4PSIyNzIuNSIgZHk9IjAiPlNNVCDlhazlvI88L3RzcGFuPjx0c3BhbiB4PSIyNzIuNSIgZHk9IjE4LjUiPih4ICsgeSAmZ3Q7IDEwKSDiiKcgKGFbMF0gPSA1KSDiiKcgZih4KSDiiaAgZih5KTwvdHNwYW4+PC90ZXh0PjwvZz48ZyBjbGFzcz0iYzJ0bGJHVjBiMjQ9IGxheWVyIj48cGF0aCBmaWxsPSIjZWVmNGZmIiBzdHJva2U9IiM0YTZmYTUiIGQ9Ik0xOTAgMTgyaDE2NnY4MkgxOTB6IiBjbGFzcz0ic2hhcGUiIHN0eWxlPSJzdHJva2Utd2lkdGg6MiIvPjx0ZXh0IHg9IjI3MyIgeT0iMjIwLjUiIGZpbGw9IiMwYTBmMjUiIGNsYXNzPSJ0ZXh0LWJvbGQgZmlsbC1OMSIgc3R5bGU9InRleHQtYW5jaG9yOm1pZGRsZTtmb250LXNpemU6MTZweCI+PHRzcGFuIHg9IjI3MyIgZHk9IjAiPuW4g+WwlOmqqOaetjwvdHNwYW4+PHRzcGFuIHg9IjI3MyIgZHk9IjE4LjUiPnAg4oinIHEg4oinIChyIOKIqCB5IOKJpCAwKTwvdHNwYW4+PC90ZXh0PjwvZz48ZyBjbGFzcz0iWVRFPSBhdG9tIj48cGF0aCBmaWxsPSIjZmZmOGU2IiBzdHJva2U9IiNjOWEyMjciIGQ9Ik00MTYgMzY0aDEyNHY4Mkg0MTZ6IiBjbGFzcz0ic2hhcGUiIHN0eWxlPSJzdHJva2Utd2lkdGg6MiIvPjx0ZXh0IHg9IjQ3OCIgeT0iNDAyLjUiIGZpbGw9IiMwYTBmMjUiIGNsYXNzPSJ0ZXh0LWJvbGQgZmlsbC1OMSIgc3R5bGU9InRleHQtYW5jaG9yOm1pZGRsZTtmb250LXNpemU6MTZweCI+PHRzcGFuIHg9IjQ3OCIgZHk9IjAiPnggKyB5ICZndDsgMTA8L3RzcGFuPjx0c3BhbiB4PSI0NzgiIGR5PSIxOC41Ij7nur\u002FmgKfnrpfmnK88L3RzcGFuPjwvdGV4dD48L2c+PGcgY2xhc3M9IllUST0gYXRvbSI+PHBhdGggZmlsbD0iI2ZmZjhlNiIgc3Ryb2tlPSIjYzlhMjI3IiBkPSJNMjI1IDM2NGg5NnY4MmgtOTZ6IiBjbGFzcz0ic2hhcGUiIHN0eWxlPSJzdHJva2Utd2lkdGg6MiIvPjx0ZXh0IHg9IjI3MyIgeT0iNDAyLjUiIGZpbGw9IiMwYTBmMjUiIGNsYXNzPSJ0ZXh0LWJvbGQgZmlsbC1OMSIgc3R5bGU9InRleHQtYW5jaG9yOm1pZGRsZTtmb250LXNpemU6MTZweCI+PHRzcGFuIHg9IjI3MyIgZHk9IjAiPmFbMF0gPSA1PC90c3Bhbj48dHNwYW4geD0iMjczIiBkeT0iMTguNSI+5pWw57uEPC90c3Bhbj48L3RleHQ+PC9nPjxnIGNsYXNzPSJZVE09IGF0b20iPjxwYXRoIGZpbGw9IiNmZmY4ZTYiIHN0cm9rZT0iI2M5YTIyNyIgZD0iTTAgMzY0aDE0NXY4MkgweiIgY2xhc3M9InNoYXBlIiBzdHlsZT0ic3Ryb2tlLXdpZHRoOjIiLz48dGV4dCB4PSI3Mi41IiB5PSI0MDIuNSIgZmlsbD0iIzBhMGYyNSIgY2xhc3M9InRleHQtYm9sZCBmaWxsLU4xIiBzdHlsZT0idGV4dC1hbmNob3I6bWlkZGxlO2ZvbnQtc2l6ZToxNnB4Ij48dHNwYW4geD0iNzIuNSIgZHk9IjAiPmYoeCkg4omgIGYoeSk8L3RzcGFuPjx0c3BhbiB4PSI3Mi41IiBkeT0iMTguNSI+5pyq6Kej6YeK5Ye95pWwPC90c3Bhbj48L3RleHQ+PC9nPjxnIGNsYXNzPSJjekU9IHNvbHZlciI+PHBhdGggZmlsbD0iI2VhZjdlZSIgc3Ryb2tlPSIjNGE5ZDZiIiBkPSJNNDA1IDU0NmgxNDV2NjZINDA1eiIgY2xhc3M9InNoYXBlIiBzdHlsZT0ic3Ryb2tlLXdpZHRoOjIiLz48dGV4dCB4PSI0NzcuNSIgeT0iNTg0LjUiIGZpbGw9IiMwYTBmMjUiIGNsYXNzPSJ0ZXh0LWJvbGQgZmlsbC1OMSIgc3R5bGU9InRleHQtYW5jaG9yOm1pZGRsZTtmb250LXNpemU6MTZweCI+566X5pyv5rGC6Kej5ZmoPC90ZXh0PjwvZz48ZyBjbGFzcz0iY3pJPSBzb2x2ZXIiPjxwYXRoIGZpbGw9IiNlYWY3ZWUiIHN0cm9rZT0iIzRhOWQ2YiIgZD0iTTIwMCA1NDZoMTQ1djY2SDIwMHoiIGNsYXNzPSJzaGFwZSIgc3R5bGU9InN0cm9rZS13aWR0aDoyIi8+PHRleHQgeD0iMjcyLjUiIHk9IjU4NC41IiBmaWxsPSIjMGEwZjI1IiBjbGFzcz0idGV4dC1ib2xkIGZpbGwtTjEiIHN0eWxlPSJ0ZXh0LWFuY2hvcjptaWRkbGU7Zm9udC1zaXplOjE2cHgiPuaVsOe7hOaxguino+WZqDwvdGV4dD48L2c+PGcgY2xhc3M9ImN6TT0gc29sdmVyIj48cGF0aCBmaWxsPSIjZWFmN2VlIiBzdHJva2U9IiM0YTlkNmIiIGQ9Ik01IDU0NmgxMzV2NjZINXoiIGNsYXNzPSJzaGFwZSIgc3R5bGU9InN0cm9rZS13aWR0aDoyIi8+PHRleHQgeD0iNzIuNSIgeT0iNTg0LjUiIGZpbGw9IiMwYTBmMjUiIGNsYXNzPSJ0ZXh0LWJvbGQgZmlsbC1OMSIgc3R5bGU9InRleHQtYW5jaG9yOm1pZGRsZTtmb250LXNpemU6MTZweCI+RVVGIOaxguino+WZqDwvdGV4dD48L2c+PGcgY2xhc3M9IktHWnZjbTExYkdFZ0xTWm5kRHNnYzJ0bGJHVjBiMjRwV3pCZCI+PG1hcmtlciBpZD0ibWstZDItMTQ1MDQ0NDU2Ni0zNDg4Mzc4MTM0IiBtYXJrZXJIZWlnaHQ9IjEyIiBtYXJrZXJVbml0cz0idXNlclNwYWNlT25Vc2UiIG1hcmtlcldpZHRoPSIxMCIgb3JpZW50PSJhdXRvIiByZWZYPSI3IiByZWZZPSI2IiB2aWV3Qm94PSIwIDAgMTAgMTIiPjxwYXRoIHN0cm9rZS13aWR0aD0iMiIgZD0ibTAgMCAxMCA2LTEwIDZ6IiBjbGFzcz0iY29ubmVjdGlvbiIgc3R5bGU9ImZpbGw6IzBkMzJiMiIvPjwvbWFya2VyPjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzBkMzJiMiIgbWFya2VyLWVuZD0idXJsKCNtay1kMi0xNDUwNDQ0NTY2LTM0ODgzNzgxMzQpIiBkPSJNMjcyLjUgODR2OTQiIGNsYXNzPSJjb25uZWN0aW9uIHN0cm9rZS1CMSIgbWFzaz0idXJsKCNkMi0xNDUwNDQ0NTY2KSIgc3R5bGU9InN0cm9rZS13aWR0aDoyIi8+PC9nPjxnIGNsYXNzPSJLSE5yWld4bGRHOXVJQzBtWjNRN0lHRXhLVnN3WFE9PSI+PHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMGQzMmIyIiBtYXJrZXItZW5kPSJ1cmwoI21rLWQyLTE0NTA0NDQ1NjYtMzQ4ODM3ODEzNCkiIGQ9Ik0zNTguMzI1IDI2MC42NkM0NTMuMyAzMDMuMTY4IDQ3Ny41IDMyNCA0NzcuNSAzNjAiIGNsYXNzPSJjb25uZWN0aW9uIHN0cm9rZS1CMSIgbWFzaz0idXJsKCNkMi0xNDUwNDQ0NTY2KSIgc3R5bGU9InN0cm9rZS13aWR0aDoyIi8+PC9nPjxnIGNsYXNzPSJLSE5yWld4bGRHOXVJQzBtWjNRN0lHRXlLVnN3WFE9PSI+PHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMGQzMmIyIiBtYXJrZXItZW5kPSJ1cmwoI21rLWQyLTE0NTA0NDQ1NjYtMzQ4ODM3ODEzNCkiIGQ9Ik0yNzIuNSAyNjZ2OTQiIGNsYXNzPSJjb25uZWN0aW9uIHN0cm9rZS1CMSIgbWFzaz0idXJsKCNkMi0xNDUwNDQ0NTY2KSIgc3R5bGU9InN0cm9rZS13aWR0aDoyIi8+PC9nPjxnIGNsYXNzPSJLSE5yWld4bGRHOXVJQzBtWjNRN0lHRXpLVnN3WFE9PSI+PHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMGQzMmIyIiBtYXJrZXItZW5kPSJ1cmwoI21rLWQyLTE0NTA0NDQ1NjYtMzQ4ODM3ODEzNCkiIGQ9Ik0xODcuNjggMjYxLjU5M0M5NS44OTkgMzAzLjM1MyA3Mi41IDMyNCA3Mi41IDM2MCIgY2xhc3M9ImNvbm5lY3Rpb24gc3Ryb2tlLUIxIiBtYXNrPSJ1cmwoI2QyLTE0NTA0NDQ1NjYpIiBzdHlsZT0ic3Ryb2tlLXdpZHRoOjIiLz48L2c+PGcgY2xhc3M9IktHRXhJQzBtWjNRN0lITXhLVnN3WFE9PSI+PHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMGQzMmIyIiBtYXJrZXItZW5kPSJ1cmwoI21rLWQyLTE0NTA0NDQ1NjYtMzQ4ODM3ODEzNCkiIGQ9Ik00NzcuNSA0NDh2OTQiIGNsYXNzPSJjb25uZWN0aW9uIHN0cm9rZS1CMSIgbWFzaz0idXJsKCNkMi0xNDUwNDQ0NTY2KSIgc3R5bGU9InN0cm9rZS13aWR0aDoyIi8+PC9nPjxnIGNsYXNzPSJLR0V5SUMwbVozUTdJSE15S1Zzd1hRPT0iPjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzBkMzJiMiIgbWFya2VyLWVuZD0idXJsKCNtay1kMi0xNDUwNDQ0NTY2LTM0ODgzNzgxMzQpIiBkPSJNMjcyLjUgNDQ4djk0IiBjbGFzcz0iY29ubmVjdGlvbiBzdHJva2UtQjEiIG1hc2s9InVybCgjZDItMTQ1MDQ0NDU2NikiIHN0eWxlPSJzdHJva2Utd2lkdGg6MiIvPjwvZz48ZyBjbGFzcz0iS0dFeklDMG1aM1E3SUhNektWc3dYUT09Ij48cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwZDMyYjIiIG1hcmtlci1lbmQ9InVybCgjbWstZDItMTQ1MDQ0NDU2Ni0zNDg4Mzc4MTM0KSIgZD0iTTcyLjUgNDQ4djk0IiBjbGFzcz0iY29ubmVjdGlvbiBzdHJva2UtQjEiIG1hc2s9InVybCgjZDItMTQ1MDQ0NDU2NikiIHN0eWxlPSJzdHJva2Utd2lkdGg6MiIvPjwvZz48bWFzayBpZD0iZDItMTQ1MDQ0NDU2NiIgd2lkdGg9IjU1MiIgaGVpZ2h0PSI2MTQiIHg9Ii0xIiB5PSItMSIgbWFza1VuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTS0xLTFoNTUydjYxNEgtMXoiLz48L21hc2s+PC9zdmc+PC9zdmc+",[11,2918,2919,2920,2923],{},"这张图就是 SMT 的骨架：",[183,2921,2922],{},"布尔层负责「怎么组合」，理论层负责「每个原子是什么意思」","。",[419,2925,2927],{"id":2926},"_13-背景理论","1.3 背景理论",[11,2929,2930],{},"SMT 里常用的理论有这么几类：",[2480,2932,2933,2943,3020,3032,3105,3122,3131],{},[2483,2934,2935,2942],{},[183,2936,2937,2938,2941],{},"EUF（",[25,2939,2940],{},"QF_UF","）","：只处理相等和未解释函数，适合描述对象相等、指针别名。",[2483,2944,2945,2955,2956,177,2984,3014,3015,3017,3018,2923],{},[183,2946,2947,2948,2951,2952,2941],{},"线性算术（",[25,2949,2950],{},"QF_LRA"," \u002F ",[25,2953,2954],{},"QF_LIA","：处理 ",[28,2957,2959,2972],{"className":2958,"translate":193},[197],[28,2960,2962],{"className":2961},[201],[203,2963,2964],{"xmlns":205},[208,2965,2966,2970],{},[211,2967,2968],{},[217,2969,124],{},[253,2971,124],{"encoding":255},[28,2973,2975],{"className":2974,"ariaHidden":261},[260],[28,2976,2978,2981],{"className":2977},[265],[28,2979],{"className":2980,"style":270},[269],[28,2982,124],{"className":2983},[274],[28,2985,2987,3001],{"className":2986,"translate":193},[197],[28,2988,2990],{"className":2989},[201],[203,2991,2992],{"xmlns":205},[208,2993,2994,2998],{},[211,2995,2996],{},[217,2997,1876],{},[253,2999,3000],{"encoding":255},"\\le",[28,3002,3004],{"className":3003,"ariaHidden":261},[260],[28,3005,3007,3011],{"className":3006},[265],[28,3008],{"className":3009,"style":3010},[269],"height:0.7719em;vertical-align:-0.136em;",[28,3012,1876],{"className":3013},[306]," 和常数；实数版是 ",[25,3016,2950],{},"，整数版是 ",[25,3019,2954],{},[2483,3021,3022,3031],{},[183,3023,3024,3025,2951,3028,2941],{},"非线性算术（",[25,3026,3027],{},"QF_NRA",[25,3029,3030],{},"QF_NIA","：允许乘法；实数版可判定，整数版不可判定。",[2483,3033,3034,3040,3041,3104],{},[183,3035,3036,3037,2941],{},"位向量（",[25,3038,3039],{},"QF_BV","：描述机器整数和硬件电路，加法是模 ",[28,3042,3044,3064],{"className":3043,"translate":193},[197],[28,3045,3047],{"className":3046},[201],[203,3048,3049],{"xmlns":205},[208,3050,3051,3061],{},[211,3052,3053],{},[3054,3055,3056,3058],"msup",{},[224,3057,1253],{},[214,3059,3060],{},"n",[253,3062,3063],{"encoding":255},"2^n",[28,3065,3067],{"className":3066,"ariaHidden":261},[260],[28,3068,3070,3074],{"className":3069},[265],[28,3071],{"className":3072,"style":3073},[269],"height:0.6644em;",[28,3075,3077,3080],{"className":3076},[274],[28,3078,1253],{"className":3079},[274],[28,3081,3083],{"className":3082},[556],[28,3084,3086],{"className":3085},[560],[28,3087,3089],{"className":3088},[565],[28,3090,3092],{"className":3091,"style":3073},[569],[28,3093,3095,3098],{"style":3094},"top:-3.063em;margin-right:0.05em;",[28,3096],{"className":3097,"style":578},[577],[28,3099,3101],{"className":3100},[582,583,584,585],[28,3102,3060],{"className":3103},[274,275,585]," 的。",[2483,3106,3107,3116,3117,2693,3119,3121],{},[183,3108,3109,3110,2951,3113,2941],{},"数组（",[25,3111,3112],{},"QF_AX",[25,3114,3115],{},"QF_AUFBV","：用 ",[25,3118,1713],{},[25,3120,2696],{}," 描述内存读写。",[2483,3123,3124,3130],{},[183,3125,3126,3127,2941],{},"浮点（",[25,3128,3129],{},"QF_FP","：描述 IEEE 754 浮点运算。",[2483,3132,3133,3136,3137,177,3140,3143],{},[183,3134,3135],{},"字符串","：描述 ",[25,3138,3139],{},"concat",[25,3141,3142],{},"contains"," 等操作，工业实现常常不完整。",[11,3145,3146,3149],{},[25,3147,3148],{},"QF"," 是 quantifier-free 的缩写，意思是「无量词」。绝大多数 SMT 求解器面对的都是这个片段。",[11,3151,3152,3153,3181],{},"可以把 SAT 看成 SMT 的一个特例：当理论 ",[28,3154,3156,3169],{"className":3155,"translate":193},[197],[28,3157,3159],{"className":3158},[201],[203,3160,3161],{"xmlns":205},[208,3162,3163,3167],{},[211,3164,3165],{},[214,3166,443],{},[253,3168,443],{"encoding":255},[28,3170,3172],{"className":3171,"ariaHidden":261},[260],[28,3173,3175,3178],{"className":3174},[265],[28,3176],{"className":3177,"style":455},[269],[28,3179,443],{"className":3180,"style":459},[274,275]," 为空、所有原子都是裸命题时，SMT 就退化成 SAT。",[11,3183,3184],{},"反过来，SMT 也可以看成 SAT 的一次「语义升级」：布尔骨架不变，但每个命题不再是黑盒，而是有内部结构、可以被理论求解器检查和反驳的对象。",[11,3186,3187],{},"这个升级带来的好处，要放到具体的历史困境里才看得清楚。",[414,3189,3191],{"id":3190},"二smt-之前","二、SMT 之前",[419,3193,3195],{"id":3194},"_21-位爆破","2.1 位爆破",[11,3197,3198,3199,3202],{},"SAT 只认布尔变量。要用它处理整数，标准做法叫",[183,3200,3201],{},"位爆破","（bit-blasting）：把整数拆成一个个布尔变量，再把算术运算展开成逻辑门电路，最后用 Tseitin 变换把电路转成 CNF 子句。",[11,3204,3205,3206,3248],{},"看一个具体的小例子。取两个 4 位无符号整数 ",[28,3207,3209,3227],{"className":3208,"translate":193},[197],[28,3210,3212],{"className":3211},[201],[203,3213,3214],{"xmlns":205},[208,3215,3216,3224],{},[211,3217,3218,3220,3222],{},[214,3219,176],{},[217,3221,1683],{"separator":261},[214,3223,180],{},[253,3225,3226],{"encoding":255},"x, y",[28,3228,3230],{"className":3229,"ariaHidden":261},[260],[28,3231,3233,3236,3239,3242,3245],{"className":3232},[265],[28,3234],{"className":3235,"style":612},[269],[28,3237,176],{"className":3238},[274,275],[28,3240,1683],{"className":3241},[1723],[28,3243],{"className":3244,"style":530},[279],[28,3246,180],{"className":3247,"style":298},[274,275],"，约束是：",[28,3250,3252],{"className":3251,"translate":193},[192],[28,3253,3255,3289],{"className":3254,"translate":193},[197],[28,3256,3258],{"className":3257},[201],[203,3259,3260],{"xmlns":205,"display":206},[208,3261,3262,3286],{},[211,3263,3264,3266,3268,3270,3272,3274,3276,3278,3280,3282,3284],{},[214,3265,176],{},[217,3267,124],{},[214,3269,180],{},[217,3271,83],{},[224,3273,226],{},[228,3275,230],{},[217,3277,233],{},[228,3279,230],{},[214,3281,176],{},[217,3283,130],{},[214,3285,180],{},[253,3287,3288],{"encoding":255},"x + y = 10 \\;\\wedge\\; x > y",[28,3290,3292,3310,3328,3352,3370],{"className":3291,"ariaHidden":261},[260],[28,3293,3295,3298,3301,3304,3307],{"className":3294},[265],[28,3296],{"className":3297,"style":270},[269],[28,3299,176],{"className":3300},[274,275],[28,3302],{"className":3303,"style":280},[279],[28,3305,124],{"className":3306},[284],[28,3308],{"className":3309,"style":280},[279],[28,3311,3313,3316,3319,3322,3325],{"className":3312},[265],[28,3314],{"className":3315,"style":612},[269],[28,3317,180],{"className":3318,"style":298},[274,275],[28,3320],{"className":3321,"style":302},[279],[28,3323,83],{"className":3324},[306],[28,3326],{"className":3327,"style":302},[279],[28,3329,3331,3334,3337,3340,3343,3346,3349],{"className":3330},[265],[28,3332],{"className":3333,"style":316},[269],[28,3335,226],{"className":3336},[274],[28,3338],{"className":3339,"style":302},[279],[28,3341],{"className":3342,"style":280},[279],[28,3344,233],{"className":3345},[284],[28,3347],{"className":3348,"style":302},[279],[28,3350],{"className":3351,"style":280},[279],[28,3353,3355,3358,3361,3364,3367],{"className":3354},[265],[28,3356],{"className":3357,"style":2616},[269],[28,3359,176],{"className":3360},[274,275],[28,3362],{"className":3363,"style":302},[279],[28,3365,130],{"className":3366},[306],[28,3368],{"className":3369,"style":302},[279],[28,3371,3373,3376],{"className":3372},[265],[28,3374],{"className":3375,"style":612},[269],[28,3377,180],{"className":3378,"style":298},[274,275],[11,3380,3381,3382,2693,3592,3801,3802,3908,3909,4010],{},"SAT 看到的是 8 个布尔变量 ",[28,3383,3385,3422],{"className":3384,"translate":193},[197],[28,3386,3388],{"className":3387},[201],[203,3389,3390],{"xmlns":205},[208,3391,3392,3419],{},[211,3393,3394,3401,3407,3413],{},[501,3395,3396,3398],{},[214,3397,176],{},[224,3399,3400],{},"3",[501,3402,3403,3405],{},[214,3404,176],{},[224,3406,1253],{},[501,3408,3409,3411],{},[214,3410,176],{},[224,3412,1244],{},[501,3414,3415,3417],{},[214,3416,176],{},[224,3418,89],{},[253,3420,3421],{"encoding":255},"x_3 x_2 x_1 x_0",[28,3423,3425],{"className":3424,"ariaHidden":261},[260],[28,3426,3428,3432,3472,3512,3552],{"className":3427},[265],[28,3429],{"className":3430,"style":3431},[269],"height:0.5806em;vertical-align:-0.15em;",[28,3433,3435,3438],{"className":3434},[274],[28,3436,176],{"className":3437},[274,275],[28,3439,3441],{"className":3440},[556],[28,3442,3444,3464],{"className":3443},[560,561],[28,3445,3447,3461],{"className":3446},[565],[28,3448,3450],{"className":3449,"style":1285},[569],[28,3451,3452,3455],{"style":573},[28,3453],{"className":3454,"style":578},[577],[28,3456,3458],{"className":3457},[582,583,584,585],[28,3459,3400],{"className":3460},[274,585],[28,3462,593],{"className":3463},[592],[28,3465,3467],{"className":3466},[565],[28,3468,3470],{"className":3469,"style":600},[569],[28,3471],{},[28,3473,3475,3478],{"className":3474},[274],[28,3476,176],{"className":3477},[274,275],[28,3479,3481],{"className":3480},[556],[28,3482,3484,3504],{"className":3483},[560,561],[28,3485,3487,3501],{"className":3486},[565],[28,3488,3490],{"className":3489,"style":1285},[569],[28,3491,3492,3495],{"style":573},[28,3493],{"className":3494,"style":578},[577],[28,3496,3498],{"className":3497},[582,583,584,585],[28,3499,1253],{"className":3500},[274,585],[28,3502,593],{"className":3503},[592],[28,3505,3507],{"className":3506},[565],[28,3508,3510],{"className":3509,"style":600},[569],[28,3511],{},[28,3513,3515,3518],{"className":3514},[274],[28,3516,176],{"className":3517},[274,275],[28,3519,3521],{"className":3520},[556],[28,3522,3524,3544],{"className":3523},[560,561],[28,3525,3527,3541],{"className":3526},[565],[28,3528,3530],{"className":3529,"style":1285},[569],[28,3531,3532,3535],{"style":573},[28,3533],{"className":3534,"style":578},[577],[28,3536,3538],{"className":3537},[582,583,584,585],[28,3539,1244],{"className":3540},[274,585],[28,3542,593],{"className":3543},[592],[28,3545,3547],{"className":3546},[565],[28,3548,3550],{"className":3549,"style":600},[569],[28,3551],{},[28,3553,3555,3558],{"className":3554},[274],[28,3556,176],{"className":3557},[274,275],[28,3559,3561],{"className":3560},[556],[28,3562,3564,3584],{"className":3563},[560,561],[28,3565,3567,3581],{"className":3566},[565],[28,3568,3570],{"className":3569,"style":1285},[569],[28,3571,3572,3575],{"style":573},[28,3573],{"className":3574,"style":578},[577],[28,3576,3578],{"className":3577},[582,583,584,585],[28,3579,89],{"className":3580},[274,585],[28,3582,593],{"className":3583},[592],[28,3585,3587],{"className":3586},[565],[28,3588,3590],{"className":3589,"style":600},[569],[28,3591],{},[28,3593,3595,3631],{"className":3594,"translate":193},[197],[28,3596,3598],{"className":3597},[201],[203,3599,3600],{"xmlns":205},[208,3601,3602,3628],{},[211,3603,3604,3610,3616,3622],{},[501,3605,3606,3608],{},[214,3607,180],{},[224,3609,3400],{},[501,3611,3612,3614],{},[214,3613,180],{},[224,3615,1253],{},[501,3617,3618,3620],{},[214,3619,180],{},[224,3621,1244],{},[501,3623,3624,3626],{},[214,3625,180],{},[224,3627,89],{},[253,3629,3630],{"encoding":255},"y_3 y_2 y_1 y_0",[28,3632,3634],{"className":3633,"ariaHidden":261},[260],[28,3635,3637,3640,3681,3721,3761],{"className":3636},[265],[28,3638],{"className":3639,"style":612},[269],[28,3641,3643,3646],{"className":3642},[274],[28,3644,180],{"className":3645,"style":298},[274,275],[28,3647,3649],{"className":3648},[556],[28,3650,3652,3673],{"className":3651},[560,561],[28,3653,3655,3670],{"className":3654},[565],[28,3656,3658],{"className":3657,"style":1285},[569],[28,3659,3661,3664],{"style":3660},"top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;",[28,3662],{"className":3663,"style":578},[577],[28,3665,3667],{"className":3666},[582,583,584,585],[28,3668,3400],{"className":3669},[274,585],[28,3671,593],{"className":3672},[592],[28,3674,3676],{"className":3675},[565],[28,3677,3679],{"className":3678,"style":600},[569],[28,3680],{},[28,3682,3684,3687],{"className":3683},[274],[28,3685,180],{"className":3686,"style":298},[274,275],[28,3688,3690],{"className":3689},[556],[28,3691,3693,3713],{"className":3692},[560,561],[28,3694,3696,3710],{"className":3695},[565],[28,3697,3699],{"className":3698,"style":1285},[569],[28,3700,3701,3704],{"style":3660},[28,3702],{"className":3703,"style":578},[577],[28,3705,3707],{"className":3706},[582,583,584,585],[28,3708,1253],{"className":3709},[274,585],[28,3711,593],{"className":3712},[592],[28,3714,3716],{"className":3715},[565],[28,3717,3719],{"className":3718,"style":600},[569],[28,3720],{},[28,3722,3724,3727],{"className":3723},[274],[28,3725,180],{"className":3726,"style":298},[274,275],[28,3728,3730],{"className":3729},[556],[28,3731,3733,3753],{"className":3732},[560,561],[28,3734,3736,3750],{"className":3735},[565],[28,3737,3739],{"className":3738,"style":1285},[569],[28,3740,3741,3744],{"style":3660},[28,3742],{"className":3743,"style":578},[577],[28,3745,3747],{"className":3746},[582,583,584,585],[28,3748,1244],{"className":3749},[274,585],[28,3751,593],{"className":3752},[592],[28,3754,3756],{"className":3755},[565],[28,3757,3759],{"className":3758,"style":600},[569],[28,3760],{},[28,3762,3764,3767],{"className":3763},[274],[28,3765,180],{"className":3766,"style":298},[274,275],[28,3768,3770],{"className":3769},[556],[28,3771,3773,3793],{"className":3772},[560,561],[28,3774,3776,3790],{"className":3775},[565],[28,3777,3779],{"className":3778,"style":1285},[569],[28,3780,3781,3784],{"style":3660},[28,3782],{"className":3783,"style":578},[577],[28,3785,3787],{"className":3786},[582,583,584,585],[28,3788,89],{"className":3789},[274,585],[28,3791,593],{"className":3792},[592],[28,3794,3796],{"className":3795},[565],[28,3797,3799],{"className":3798,"style":600},[569],[28,3800],{},"。为了表达加法，需要 4 个全加器。每个全加器有三个输入 ",[28,3803,3805,3836],{"className":3804,"translate":193},[197],[28,3806,3808],{"className":3807},[201],[203,3809,3810],{"xmlns":205},[208,3811,3812,3833],{},[211,3813,3814,3816,3818,3821,3823],{},[214,3815,238],{},[217,3817,1683],{"separator":261},[214,3819,3820],{},"b",[217,3822,1683],{"separator":261},[501,3824,3825,3827],{},[214,3826,22],{},[211,3828,3829,3831],{},[214,3830,1686],{},[214,3832,3060],{},[253,3834,3835],{"encoding":255},"a, b, c_{in}",[28,3837,3839],{"className":3838,"ariaHidden":261},[260],[28,3840,3842,3845,3848,3851,3854,3857,3860,3863],{"className":3841},[265],[28,3843],{"className":3844,"style":2371},[269],[28,3846,238],{"className":3847},[274,275],[28,3849,1683],{"className":3850},[1723],[28,3852],{"className":3853,"style":530},[279],[28,3855,3820],{"className":3856},[274,275],[28,3858,1683],{"className":3859},[1723],[28,3861],{"className":3862,"style":530},[279],[28,3864,3866,3869],{"className":3865},[274],[28,3867,22],{"className":3868},[274,275],[28,3870,3872],{"className":3871},[556],[28,3873,3875,3900],{"className":3874},[560,561],[28,3876,3878,3897],{"className":3877},[565],[28,3879,3882],{"className":3880,"style":3881},[569],"height:0.3117em;",[28,3883,3884,3887],{"style":573},[28,3885],{"className":3886,"style":578},[577],[28,3888,3890],{"className":3889},[582,583,584,585],[28,3891,3893],{"className":3892},[274,585],[28,3894,3896],{"className":3895},[274,275,585],"in",[28,3898,593],{"className":3899},[592],[28,3901,3903],{"className":3902},[565],[28,3904,3906],{"className":3905,"style":600},[569],[28,3907],{},"、两个输出 ",[28,3910,3912,3942],{"className":3911,"translate":193},[197],[28,3913,3915],{"className":3914},[201],[203,3916,3917],{"xmlns":205},[208,3918,3919,3939],{},[211,3920,3921,3923,3925],{},[214,3922,1664],{},[217,3924,1683],{"separator":261},[501,3926,3927,3929],{},[214,3928,22],{},[211,3930,3931,3934,3937],{},[214,3932,3933],{},"o",[214,3935,3936],{},"u",[214,3938,1241],{},[253,3940,3941],{"encoding":255},"s, c_{out}",[28,3943,3945],{"className":3944,"ariaHidden":261},[260],[28,3946,3948,3951,3954,3957,3960],{"className":3947},[265],[28,3949],{"className":3950,"style":612},[269],[28,3952,1664],{"className":3953},[274,275],[28,3955,1683],{"className":3956},[1723],[28,3958],{"className":3959,"style":530},[279],[28,3961,3963,3966],{"className":3962},[274],[28,3964,22],{"className":3965},[274,275],[28,3967,3969],{"className":3968},[556],[28,3970,3972,4002],{"className":3971},[560,561],[28,3973,3975,3999],{"className":3974},[565],[28,3976,3979],{"className":3977,"style":3978},[569],"height:0.2806em;",[28,3980,3981,3984],{"style":573},[28,3982],{"className":3983,"style":578},[577],[28,3985,3987],{"className":3986},[582,583,584,585],[28,3988,3990,3993,3996],{"className":3989},[274,585],[28,3991,3933],{"className":3992},[274,275,585],[28,3994,3936],{"className":3995},[274,275,585],[28,3997,1241],{"className":3998},[274,275,585],[28,4000,593],{"className":4001},[592],[28,4003,4005],{"className":4004},[565],[28,4006,4008],{"className":4007,"style":600},[569],[28,4009],{},"，满足：",[28,4012,4014],{"className":4013,"translate":193},[192],[28,4015,4017,4109],{"className":4016,"translate":193},[197],[28,4018,4020],{"className":4019},[201],[203,4021,4022],{"xmlns":205,"display":206},[208,4023,4024,4106],{},[211,4025,4026,4028,4030,4032,4035,4037,4039,4049,4051,4054,4066,4068,4070,4072,4074,4076,4078,4080,4082,4092,4094,4096,4098,4100,4102,4104],{},[214,4027,1664],{},[217,4029,83],{},[214,4031,238],{},[217,4033,4034],{},"⊕",[214,4036,3820],{},[217,4038,4034],{},[501,4040,4041,4043],{},[214,4042,22],{},[211,4044,4045,4047],{},[214,4046,1686],{},[214,4048,3060],{},[217,4050,1683],{"separator":261},[279,4052],{"width":4053},"2em",[501,4055,4056,4058],{},[214,4057,22],{},[211,4059,4060,4062,4064],{},[214,4061,3933],{},[214,4063,3936],{},[214,4065,1241],{},[217,4067,83],{},[217,4069,43],{"stretchy":241},[214,4071,238],{},[217,4073,233],{},[214,4075,3820],{},[217,4077,1522],{"stretchy":241},[217,4079,937],{},[217,4081,43],{"fence":261,"stretchy":261,"minsize":1810,"maxsize":1810},[501,4083,4084,4086],{},[214,4085,22],{},[211,4087,4088,4090],{},[214,4089,1686],{},[214,4091,3060],{},[217,4093,233],{},[217,4095,43],{"stretchy":241},[214,4097,238],{},[217,4099,4034],{},[214,4101,3820],{},[217,4103,1522],{"stretchy":241},[217,4105,1522],{"fence":261,"stretchy":261,"minsize":1810,"maxsize":1810},[253,4107,4108],{"encoding":255},"s = a \\oplus b \\oplus c_{in}, \\qquad c_{out} = (a \\wedge b) \\vee \\bigl(c_{in} \\wedge (a \\oplus b)\\bigr)",[28,4110,4112,4130,4148,4167,4284,4305,4326,4390,4411],{"className":4111,"ariaHidden":261},[260],[28,4113,4115,4118,4121,4124,4127],{"className":4114},[265],[28,4116],{"className":4117,"style":645},[269],[28,4119,1664],{"className":4120},[274,275],[28,4122],{"className":4123,"style":302},[279],[28,4125,83],{"className":4126},[306],[28,4128],{"className":4129,"style":302},[279],[28,4131,4133,4136,4139,4142,4145],{"className":4132},[265],[28,4134],{"className":4135,"style":270},[269],[28,4137,238],{"className":4138},[274,275],[28,4140],{"className":4141,"style":280},[279],[28,4143,4034],{"className":4144},[284],[28,4146],{"className":4147,"style":280},[279],[28,4149,4151,4155,4158,4161,4164],{"className":4150},[265],[28,4152],{"className":4153,"style":4154},[269],"height:0.7778em;vertical-align:-0.0833em;",[28,4156,3820],{"className":4157},[274,275],[28,4159],{"className":4160,"style":280},[279],[28,4162,4034],{"className":4163},[284],[28,4165],{"className":4166,"style":280},[279],[28,4168,4170,4173,4216,4219,4223,4226,4275,4278,4281],{"className":4169},[265],[28,4171],{"className":4172,"style":612},[269],[28,4174,4176,4179],{"className":4175},[274],[28,4177,22],{"className":4178},[274,275],[28,4180,4182],{"className":4181},[556],[28,4183,4185,4208],{"className":4184},[560,561],[28,4186,4188,4205],{"className":4187},[565],[28,4189,4191],{"className":4190,"style":3881},[569],[28,4192,4193,4196],{"style":573},[28,4194],{"className":4195,"style":578},[577],[28,4197,4199],{"className":4198},[582,583,584,585],[28,4200,4202],{"className":4201},[274,585],[28,4203,3896],{"className":4204},[274,275,585],[28,4206,593],{"className":4207},[592],[28,4209,4211],{"className":4210},[565],[28,4212,4214],{"className":4213,"style":600},[569],[28,4215],{},[28,4217,1683],{"className":4218},[1723],[28,4220],{"className":4221,"style":4222},[279],"margin-right:2em;",[28,4224],{"className":4225,"style":530},[279],[28,4227,4229,4232],{"className":4228},[274],[28,4230,22],{"className":4231},[274,275],[28,4233,4235],{"className":4234},[556],[28,4236,4238,4267],{"className":4237},[560,561],[28,4239,4241,4264],{"className":4240},[565],[28,4242,4244],{"className":4243,"style":3978},[569],[28,4245,4246,4249],{"style":573},[28,4247],{"className":4248,"style":578},[577],[28,4250,4252],{"className":4251},[582,583,584,585],[28,4253,4255,4258,4261],{"className":4254},[274,585],[28,4256,3933],{"className":4257},[274,275,585],[28,4259,3936],{"className":4260},[274,275,585],[28,4262,1241],{"className":4263},[274,275,585],[28,4265,593],{"className":4266},[592],[28,4268,4270],{"className":4269},[565],[28,4271,4273],{"className":4272,"style":600},[569],[28,4274],{},[28,4276],{"className":4277,"style":302},[279],[28,4279,83],{"className":4280},[306],[28,4282],{"className":4283,"style":302},[279],[28,4285,4287,4290,4293,4296,4299,4302],{"className":4286},[265],[28,4288],{"className":4289,"style":341},[269],[28,4291,43],{"className":4292},[348],[28,4294,238],{"className":4295},[274,275],[28,4297],{"className":4298,"style":280},[279],[28,4300,233],{"className":4301},[284],[28,4303],{"className":4304,"style":280},[279],[28,4306,4308,4311,4314,4317,4320,4323],{"className":4307},[265],[28,4309],{"className":4310,"style":341},[269],[28,4312,3820],{"className":4313},[274,275],[28,4315,1522],{"className":4316},[355],[28,4318],{"className":4319,"style":280},[279],[28,4321,937],{"className":4322},[284],[28,4324],{"className":4325,"style":280},[279],[28,4327,4329,4332,4338,4381,4384,4387],{"className":4328},[265],[28,4330],{"className":4331,"style":2469},[269],[28,4333,4335],{"className":4334},[348],[28,4336,43],{"className":4337},[2169,2170],[28,4339,4341,4344],{"className":4340},[274],[28,4342,22],{"className":4343},[274,275],[28,4345,4347],{"className":4346},[556],[28,4348,4350,4373],{"className":4349},[560,561],[28,4351,4353,4370],{"className":4352},[565],[28,4354,4356],{"className":4355,"style":3881},[569],[28,4357,4358,4361],{"style":573},[28,4359],{"className":4360,"style":578},[577],[28,4362,4364],{"className":4363},[582,583,584,585],[28,4365,4367],{"className":4366},[274,585],[28,4368,3896],{"className":4369},[274,275,585],[28,4371,593],{"className":4372},[592],[28,4374,4376],{"className":4375},[565],[28,4377,4379],{"className":4378,"style":600},[569],[28,4380],{},[28,4382],{"className":4383,"style":280},[279],[28,4385,233],{"className":4386},[284],[28,4388],{"className":4389,"style":280},[279],[28,4391,4393,4396,4399,4402,4405,4408],{"className":4392},[265],[28,4394],{"className":4395,"style":341},[269],[28,4397,43],{"className":4398},[348],[28,4400,238],{"className":4401},[274,275],[28,4403],{"className":4404,"style":280},[279],[28,4406,4034],{"className":4407},[284],[28,4409],{"className":4410,"style":280},[279],[28,4412,4414,4417,4420,4423],{"className":4413},[265],[28,4415],{"className":4416,"style":2469},[269],[28,4418,3820],{"className":4419},[274,275],[28,4421,1522],{"className":4422},[355],[28,4424,4426],{"className":4425},[355],[28,4427,1522],{"className":4428},[2169,2170],[11,4430,4431],{},"把这两个等式转成 CNF，一个全加器大约 17 条子句。4 位加法器就是 4 个全加器，约 70 条子句。再加上「和等于 1010、进位为 0」的 5 条单元子句，以及一个 4 位比较器的几十条子句，整个约束变成一百多条子句、几十个辅助变量。",[11,4433,4434],{},"而原始约束只有一行：",[18,4436,4438],{"className":20,"code":4437,"language":22,"meta":23,"style":23},"x + y == 10 && x > y\n",[25,4439,4440],{"__ignoreMap":23},[28,4441,4442,4445,4447,4449,4451,4453,4455,4458,4460],{"class":30,"line":31},[28,4443,4444],{"class":42},"x ",[28,4446,124],{"class":34},[28,4448,127],{"class":42},[28,4450,147],{"class":34},[28,4452,133],{"class":76},[28,4454,136],{"class":34},[28,4456,4457],{"class":42}," x ",[28,4459,130],{"class":34},[28,4461,4462],{"class":42}," y\n",[11,4464,4465,4466,177,4518,4570],{},"求解器可能给出 ",[28,4467,4469,4488],{"className":4468,"translate":193},[197],[28,4470,4472],{"className":4471},[201],[203,4473,4474],{"xmlns":205},[208,4475,4476,4485],{},[211,4477,4478,4480,4482],{},[214,4479,176],{},[217,4481,83],{},[224,4483,4484],{},"0110",[253,4486,4487],{"encoding":255},"x = 0110",[28,4489,4491,4509],{"className":4490,"ariaHidden":261},[260],[28,4492,4494,4497,4500,4503,4506],{"className":4493},[265],[28,4495],{"className":4496,"style":645},[269],[28,4498,176],{"className":4499},[274,275],[28,4501],{"className":4502,"style":302},[279],[28,4504,83],{"className":4505},[306],[28,4507],{"className":4508,"style":302},[279],[28,4510,4512,4515],{"className":4511},[265],[28,4513],{"className":4514,"style":316},[269],[28,4516,4484],{"className":4517},[274],[28,4519,4521,4540],{"className":4520,"translate":193},[197],[28,4522,4524],{"className":4523},[201],[203,4525,4526],{"xmlns":205},[208,4527,4528,4537],{},[211,4529,4530,4532,4534],{},[214,4531,180],{},[217,4533,83],{},[224,4535,4536],{},"0100",[253,4538,4539],{"encoding":255},"y = 0100",[28,4541,4543,4561],{"className":4542,"ariaHidden":261},[260],[28,4544,4546,4549,4552,4555,4558],{"className":4545},[265],[28,4547],{"className":4548,"style":612},[269],[28,4550,180],{"className":4551,"style":298},[274,275],[28,4553],{"className":4554,"style":302},[279],[28,4556,83],{"className":4557},[306],[28,4559],{"className":4560,"style":302},[279],[28,4562,4564,4567],{"className":4563},[265],[28,4565],{"className":4566,"style":316},[269],[28,4568,4536],{"className":4569},[274],"，但它并不知道这是 6 和 4。它只知道这一组真假值恰好让所有子句为真。",[11,4572,4573,4574,4577,4578,4674,4675,4703,4704,4732,4733,4703,4761,4789],{},"规模还不是最麻烦的，",[183,4575,4576],{},"语义丢失","才是。假设我们想证明 ",[28,4579,4581,4607],{"className":4580,"translate":193},[197],[28,4582,4584],{"className":4583},[201],[203,4585,4586],{"xmlns":205},[208,4587,4588,4604],{},[211,4589,4590,4592,4594,4596,4598,4600,4602],{},[214,4591,176],{},[217,4593,124],{},[214,4595,180],{},[217,4597,83],{},[214,4599,180],{},[217,4601,124],{},[214,4603,176],{},[253,4605,4606],{"encoding":255},"x + y = y + x",[28,4608,4610,4628,4646,4665],{"className":4609,"ariaHidden":261},[260],[28,4611,4613,4616,4619,4622,4625],{"className":4612},[265],[28,4614],{"className":4615,"style":270},[269],[28,4617,176],{"className":4618},[274,275],[28,4620],{"className":4621,"style":280},[279],[28,4623,124],{"className":4624},[284],[28,4626],{"className":4627,"style":280},[279],[28,4629,4631,4634,4637,4640,4643],{"className":4630},[265],[28,4632],{"className":4633,"style":612},[269],[28,4635,180],{"className":4636,"style":298},[274,275],[28,4638],{"className":4639,"style":302},[279],[28,4641,83],{"className":4642},[306],[28,4644],{"className":4645,"style":302},[279],[28,4647,4649,4653,4656,4659,4662],{"className":4648},[265],[28,4650],{"className":4651,"style":4652},[269],"height:0.7778em;vertical-align:-0.1944em;",[28,4654,180],{"className":4655,"style":298},[274,275],[28,4657],{"className":4658,"style":280},[279],[28,4660,124],{"className":4661},[284],[28,4663],{"className":4664,"style":280},[279],[28,4666,4668,4671],{"className":4667},[265],[28,4669],{"className":4670,"style":645},[269],[28,4672,176],{"className":4673},[274,275],"。在算术里这是一条公理，一秒都不用。但在 SAT 里，左边是一个「先加 ",[28,4676,4678,4691],{"className":4677,"translate":193},[197],[28,4679,4681],{"className":4680},[201],[203,4682,4683],{"xmlns":205},[208,4684,4685,4689],{},[211,4686,4687],{},[214,4688,176],{},[253,4690,176],{"encoding":255},[28,4692,4694],{"className":4693,"ariaHidden":261},[260],[28,4695,4697,4700],{"className":4696},[265],[28,4698],{"className":4699,"style":645},[269],[28,4701,176],{"className":4702},[274,275]," 再加 ",[28,4705,4707,4720],{"className":4706,"translate":193},[197],[28,4708,4710],{"className":4709},[201],[203,4711,4712],{"xmlns":205},[208,4713,4714,4718],{},[211,4715,4716],{},[214,4717,180],{},[253,4719,180],{"encoding":255},[28,4721,4723],{"className":4722,"ariaHidden":261},[260],[28,4724,4726,4729],{"className":4725},[265],[28,4727],{"className":4728,"style":612},[269],[28,4730,180],{"className":4731,"style":298},[274,275],"」的电路，右边是一个「先加 ",[28,4734,4736,4749],{"className":4735,"translate":193},[197],[28,4737,4739],{"className":4738},[201],[203,4740,4741],{"xmlns":205},[208,4742,4743,4747],{},[211,4744,4745],{},[214,4746,180],{},[253,4748,180],{"encoding":255},[28,4750,4752],{"className":4751,"ariaHidden":261},[260],[28,4753,4755,4758],{"className":4754},[265],[28,4756],{"className":4757,"style":612},[269],[28,4759,180],{"className":4760,"style":298},[274,275],[28,4762,4764,4777],{"className":4763,"translate":193},[197],[28,4765,4767],{"className":4766},[201],[203,4768,4769],{"xmlns":205},[208,4770,4771,4775],{},[211,4772,4773],{},[214,4774,176],{},[253,4776,176],{"encoding":255},[28,4778,4780],{"className":4779,"ariaHidden":261},[260],[28,4781,4783,4786],{"className":4782},[265],[28,4784],{"className":4785,"style":645},[269],[28,4787,176],{"className":4788},[274,275],"」的电路，两个电路内部结构不同，SAT 只能把两边都展开，再逐位证明输出相等。它不知道「加法可交换」，只知道一堆门。",[11,4791,4792],{},"打个比方：这就像为了判断一首诗是否押韵，先把它拆成一个个字母，再让机器从字母的排列里重新发现什么是韵脚。信息没有丢，但结构没了。",[419,4794,4796],{"id":4795},"_22-不可判定","2.2 不可判定",[11,4798,4799],{},"那干脆用表达力最强的一阶逻辑，让自动定理证明器去证，不行吗？",[11,4801,4802],{},"不行。看一个具体方程：",[28,4804,4806],{"className":4805,"translate":193},[192],[28,4807,4809,4849],{"className":4808,"translate":193},[197],[28,4810,4812],{"className":4811},[201],[203,4813,4814],{"xmlns":205,"display":206},[208,4815,4816,4846],{},[211,4817,4818,4824,4826,4832,4834,4841,4843],{},[3054,4819,4820,4822],{},[214,4821,176],{},[224,4823,3400],{},[217,4825,124],{},[3054,4827,4828,4830],{},[214,4829,180],{},[224,4831,3400],{},[217,4833,124],{},[3054,4835,4836,4839],{},[214,4837,4838],{},"z",[224,4840,3400],{},[217,4842,83],{},[224,4844,4845],{},"33",[253,4847,4848],{"encoding":255},"x^3 + y^3 + z^3 = 33",[28,4850,4852,4899,4944,4989],{"className":4851,"ariaHidden":261},[260],[28,4853,4855,4859,4890,4893,4896],{"className":4854},[265],[28,4856],{"className":4857,"style":4858},[269],"height:0.9474em;vertical-align:-0.0833em;",[28,4860,4862,4865],{"className":4861},[274],[28,4863,176],{"className":4864},[274,275],[28,4866,4868],{"className":4867},[556],[28,4869,4871],{"className":4870},[560],[28,4872,4874],{"className":4873},[565],[28,4875,4878],{"className":4876,"style":4877},[569],"height:0.8641em;",[28,4879,4881,4884],{"style":4880},"top:-3.113em;margin-right:0.05em;",[28,4882],{"className":4883,"style":578},[577],[28,4885,4887],{"className":4886},[582,583,584,585],[28,4888,3400],{"className":4889},[274,585],[28,4891],{"className":4892,"style":280},[279],[28,4894,124],{"className":4895},[284],[28,4897],{"className":4898,"style":280},[279],[28,4900,4902,4906,4935,4938,4941],{"className":4901},[265],[28,4903],{"className":4904,"style":4905},[269],"height:1.0585em;vertical-align:-0.1944em;",[28,4907,4909,4912],{"className":4908},[274],[28,4910,180],{"className":4911,"style":298},[274,275],[28,4913,4915],{"className":4914},[556],[28,4916,4918],{"className":4917},[560],[28,4919,4921],{"className":4920},[565],[28,4922,4924],{"className":4923,"style":4877},[569],[28,4925,4926,4929],{"style":4880},[28,4927],{"className":4928,"style":578},[577],[28,4930,4932],{"className":4931},[582,583,584,585],[28,4933,3400],{"className":4934},[274,585],[28,4936],{"className":4937,"style":280},[279],[28,4939,124],{"className":4940},[284],[28,4942],{"className":4943,"style":280},[279],[28,4945,4947,4950,4980,4983,4986],{"className":4946},[265],[28,4948],{"className":4949,"style":4877},[269],[28,4951,4953,4957],{"className":4952},[274],[28,4954,4838],{"className":4955,"style":4956},[274,275],"margin-right:0.044em;",[28,4958,4960],{"className":4959},[556],[28,4961,4963],{"className":4962},[560],[28,4964,4966],{"className":4965},[565],[28,4967,4969],{"className":4968,"style":4877},[569],[28,4970,4971,4974],{"style":4880},[28,4972],{"className":4973,"style":578},[577],[28,4975,4977],{"className":4976},[582,583,584,585],[28,4978,3400],{"className":4979},[274,585],[28,4981],{"className":4982,"style":302},[279],[28,4984,83],{"className":4985},[306],[28,4987],{"className":4988,"style":302},[279],[28,4990,4992,4995],{"className":4991},[265],[28,4993],{"className":4994,"style":316},[269],[28,4996,4845],{"className":4997},[274],[11,4999,5000],{},"它看起来很简单。它有整数解，一个已知解是：",[28,5002,5004],{"className":5003,"translate":193},[192],[28,5005,5007,5118],{"className":5006,"translate":193},[197],[28,5008,5010],{"className":5009},[201],[203,5011,5012],{"xmlns":205,"display":206},[208,5013,5014,5115],{},[5015,5016,5020,5052,5084],"mtable",{"rowspacing":5017,"columnalign":5018,"columnspacing":5019},"0.25em","right left","0em",[5021,5022,5023,5037],"mtr",{},[5024,5025,5026],"mtd",{},[5027,5028,5029],"mstyle",{"scriptlevel":89,"displaystyle":261},[211,5030,5031,5033,5035],{},[224,5032,4845],{},[217,5034,83],{},[211,5036],{},[5024,5038,5039],{},[5027,5040,5041],{"scriptlevel":89,"displaystyle":261},[211,5042,5043,5045],{},[211,5044],{},[3054,5046,5047,5050],{},[224,5048,5049],{},"8866128975287528",[224,5051,3400],{},[5021,5053,5054,5060],{},[5024,5055,5056],{},[5027,5057,5058],{"scriptlevel":89,"displaystyle":261},[211,5059],{},[5024,5061,5062],{},[5027,5063,5064],{"scriptlevel":89,"displaystyle":261},[211,5065,5066,5068,5070,5072,5075,5078],{},[211,5067],{},[217,5069,124],{},[217,5071,43],{"stretchy":241},[217,5073,5074],{},"−",[224,5076,5077],{},"8778405442862239",[3054,5079,5080,5082],{},[217,5081,1522],{"stretchy":241},[224,5083,3400],{},[5021,5085,5086,5092],{},[5024,5087,5088],{},[5027,5089,5090],{"scriptlevel":89,"displaystyle":261},[211,5091],{},[5024,5093,5094],{},[5027,5095,5096],{"scriptlevel":89,"displaystyle":261},[211,5097,5098,5100,5102,5104,5106,5109],{},[211,5099],{},[217,5101,124],{},[217,5103,43],{"stretchy":241},[217,5105,5074],{},[224,5107,5108],{},"2736111468807040",[3054,5110,5111,5113],{},[217,5112,1522],{"stretchy":241},[224,5114,3400],{},[253,5116,5117],{"encoding":255},"\\begin{aligned}\n33 ={}& 8866128975287528^3 \\\\\n      &+ (-8778405442862239)^3 \\\\\n      &+ (-2736111468807040)^3\n\\end{aligned}",[28,5119,5121],{"className":5120,"ariaHidden":261},[260],[28,5122,5124,5128],{"className":5123},[265],[28,5125],{"className":5126,"style":5127},[269],"height:4.2723em;vertical-align:-1.8862em;",[28,5129,5131],{"className":5130},[274],[28,5132,5134,5202],{"className":5133},[5015],[28,5135,5138],{"className":5136},[5137],"col-align-r",[28,5139,5141,5193],{"className":5140},[560,561],[28,5142,5144,5190],{"className":5143},[565],[28,5145,5148,5172,5181],{"className":5146,"style":5147},[569],"height:2.3862em;",[28,5149,5151,5154],{"style":5150},"top:-4.5221em;",[28,5152],{"className":5153,"style":1914},[577],[28,5155,5157,5160,5163,5166,5169],{"className":5156},[274],[28,5158,4845],{"className":5159},[274],[28,5161],{"className":5162,"style":302},[279],[28,5164,83],{"className":5165},[306],[28,5167],{"className":5168,"style":302},[279],[28,5170],{"className":5171},[274],[28,5173,5175,5178],{"style":5174},"top:-2.9979em;",[28,5176],{"className":5177,"style":1914},[577],[28,5179],{"className":5180},[274],[28,5182,5184,5187],{"style":5183},"top:-1.4738em;",[28,5185],{"className":5186,"style":1914},[577],[28,5188],{"className":5189},[274],[28,5191,593],{"className":5192},[592],[28,5194,5196],{"className":5195},[565],[28,5197,5200],{"className":5198,"style":5199},[569],"height:1.8862em;",[28,5201],{},[28,5203,5206],{"className":5204},[5205],"col-align-l",[28,5207,5209,5379],{"className":5208},[560,561],[28,5210,5212,5376],{"className":5211},[565],[28,5213,5215,5260,5318],{"className":5214,"style":5147},[569],[28,5216,5217,5220],{"style":5150},[28,5218],{"className":5219,"style":1914},[577],[28,5221,5223,5226,5230],{"className":5222},[274],[28,5224],{"className":5225},[274],[28,5227,5229],{"className":5228},[274],"886612897528752",[28,5231,5233,5237],{"className":5232},[274],[28,5234,5236],{"className":5235},[274],"8",[28,5238,5240],{"className":5239},[556],[28,5241,5243],{"className":5242},[560],[28,5244,5246],{"className":5245},[565],[28,5247,5249],{"className":5248,"style":4877},[569],[28,5250,5251,5254],{"style":4880},[28,5252],{"className":5253,"style":578},[577],[28,5255,5257],{"className":5256},[582,583,584,585],[28,5258,3400],{"className":5259},[274,585],[28,5261,5262,5265],{"style":5174},[28,5263],{"className":5264,"style":1914},[577],[28,5266,5268,5271,5274,5277,5280,5283,5286,5289],{"className":5267},[274],[28,5269],{"className":5270},[274],[28,5272],{"className":5273,"style":280},[279],[28,5275,124],{"className":5276},[284],[28,5278],{"className":5279,"style":280},[279],[28,5281,43],{"className":5282},[348],[28,5284,5074],{"className":5285},[274],[28,5287,5077],{"className":5288},[274],[28,5290,5292,5295],{"className":5291},[355],[28,5293,1522],{"className":5294},[355],[28,5296,5298],{"className":5297},[556],[28,5299,5301],{"className":5300},[560],[28,5302,5304],{"className":5303},[565],[28,5305,5307],{"className":5306,"style":4877},[569],[28,5308,5309,5312],{"style":4880},[28,5310],{"className":5311,"style":578},[577],[28,5313,5315],{"className":5314},[582,583,584,585],[28,5316,3400],{"className":5317},[274,585],[28,5319,5320,5323],{"style":5183},[28,5321],{"className":5322,"style":1914},[577],[28,5324,5326,5329,5332,5335,5338,5341,5344,5347],{"className":5325},[274],[28,5327],{"className":5328},[274],[28,5330],{"className":5331,"style":280},[279],[28,5333,124],{"className":5334},[284],[28,5336],{"className":5337,"style":280},[279],[28,5339,43],{"className":5340},[348],[28,5342,5074],{"className":5343},[274],[28,5345,5108],{"className":5346},[274],[28,5348,5350,5353],{"className":5349},[355],[28,5351,1522],{"className":5352},[355],[28,5354,5356],{"className":5355},[556],[28,5357,5359],{"className":5358},[560],[28,5360,5362],{"className":5361},[565],[28,5363,5365],{"className":5364,"style":4877},[569],[28,5366,5367,5370],{"style":4880},[28,5368],{"className":5369,"style":578},[577],[28,5371,5373],{"className":5372},[582,583,584,585],[28,5374,3400],{"className":5375},[274,585],[28,5377,593],{"className":5378},[592],[28,5380,5382],{"className":5381},[565],[28,5383,5385],{"className":5384,"style":5199},[569],[28,5386],{},[11,5388,5389,5390,5445,5446,5510,5511,5577],{},"这三个数都是 16 位数，直到 2019 年才被找到。如果把 ",[28,5391,5393,5415],{"className":5392,"translate":193},[197],[28,5394,5396],{"className":5395},[201],[203,5397,5398],{"xmlns":205},[208,5399,5400,5412],{},[211,5401,5402,5404,5406,5408,5410],{},[214,5403,176],{},[217,5405,1683],{"separator":261},[214,5407,180],{},[217,5409,1683],{"separator":261},[214,5411,4838],{},[253,5413,5414],{"encoding":255},"x, y, z",[28,5416,5418],{"className":5417,"ariaHidden":261},[260],[28,5419,5421,5424,5427,5430,5433,5436,5439,5442],{"className":5420},[265],[28,5422],{"className":5423,"style":612},[269],[28,5425,176],{"className":5426},[274,275],[28,5428,1683],{"className":5429},[1723],[28,5431],{"className":5432,"style":530},[279],[28,5434,180],{"className":5435,"style":298},[274,275],[28,5437,1683],{"className":5438},[1723],[28,5440],{"className":5441,"style":530},[279],[28,5443,4838],{"className":5444,"style":4956},[274,275]," 都编码成 64 位整数，搜索空间是 ",[28,5447,5449,5468],{"className":5448,"translate":193},[197],[28,5450,5452],{"className":5451},[201],[203,5453,5454],{"xmlns":205},[208,5455,5456,5465],{},[211,5457,5458],{},[3054,5459,5460,5462],{},[224,5461,1253],{},[224,5463,5464],{},"192",[253,5466,5467],{"encoding":255},"2^{192}",[28,5469,5471],{"className":5470,"ariaHidden":261},[260],[28,5472,5474,5478],{"className":5473},[265],[28,5475],{"className":5476,"style":5477},[269],"height:0.8141em;",[28,5479,5481,5484],{"className":5480},[274],[28,5482,1253],{"className":5483},[274],[28,5485,5487],{"className":5486},[556],[28,5488,5490],{"className":5489},[560],[28,5491,5493],{"className":5492},[565],[28,5494,5496],{"className":5495,"style":5477},[569],[28,5497,5498,5501],{"style":3094},[28,5499],{"className":5500,"style":578},[577],[28,5502,5504],{"className":5503},[582,583,584,585],[28,5505,5507],{"className":5506},[274,585],[28,5508,5464],{"className":5509},[274,585],"；按每秒试十亿个赋值来算，也要 ",[28,5512,5514,5533],{"className":5513,"translate":193},[197],[28,5515,5517],{"className":5516},[201],[203,5518,5519],{"xmlns":205},[208,5520,5521,5530],{},[211,5522,5523],{},[3054,5524,5525,5527],{},[224,5526,226],{},[224,5528,5529],{},"41",[253,5531,5532],{"encoding":255},"10^{41}",[28,5534,5536],{"className":5535,"ariaHidden":261},[260],[28,5537,5539,5542,5545],{"className":5538},[265],[28,5540],{"className":5541,"style":5477},[269],[28,5543,1244],{"className":5544},[274],[28,5546,5548,5551],{"className":5547},[274],[28,5549,89],{"className":5550},[274],[28,5552,5554],{"className":5553},[556],[28,5555,5557],{"className":5556},[560],[28,5558,5560],{"className":5559},[565],[28,5561,5563],{"className":5562,"style":5477},[569],[28,5564,5565,5568],{"style":3094},[28,5566],{"className":5567,"style":578},[577],[28,5569,5571],{"className":5570},[582,583,584,585],[28,5572,5574],{"className":5573},[274,585],[28,5575,5529],{"className":5576},[274,585]," 年量级。位爆破在这里基本不可行。",[11,5579,5580],{},"更根本的是，这不是「这一个方程特别难」的问题。希尔伯特第十问题问的是「是否存在算法判定整系数多项式方程有没有整数解」，这个问题在 1970 年被马蒂亚谢维奇证明为否。证明的思路很巧妙：任给一台图灵机和一段输入，都能构造出一个整系数多项式方程，使方程有解当且仅当图灵机停机。既然停机问题不可判定，一般的方程判定问题也不可判定。换句话说，想写一个能判定所有这类方程的通用算法，这件事本身就是不可能的。",[11,5582,5583],{},"工程上的后果很直接：自动定理证明器可能跑了一整天，最后告诉你「我不知道」。对于一个需要每秒判定成千上万条路径条件的程序分析工具来说，这是不可接受的。",[419,5585,5587],{"id":5586},"_23-难以组合","2.3 难以组合",[11,5589,5590],{},"另一条路是「一个问题配一个专用算法」：线性规划用单纯形法，只懂实数线性约束；并查集只懂「相等」；BDD 只懂布尔函数；自动机只懂正则语言和字符串匹配。",[11,5592,5593],{},"这些算法在各自领域都很好用，但真实的程序约束往往是混合的。看一个只有两个原子的例子：",[28,5595,5597],{"className":5596,"translate":193},[192],[28,5598,5600,5642],{"className":5599,"translate":193},[197],[28,5601,5603],{"className":5602},[201],[203,5604,5605],{"xmlns":205,"display":206},[208,5606,5607,5639],{},[211,5608,5609,5611,5613,5615,5617,5619,5621,5623,5625,5627,5629,5631,5633,5635,5637],{},[214,5610,176],{},[217,5612,83],{},[214,5614,180],{},[228,5616,230],{},[217,5618,233],{},[228,5620,230],{},[214,5622,1511],{},[217,5624,43],{"stretchy":241},[214,5626,176],{},[217,5628,1522],{"stretchy":241},[217,5630,1854],{"mathvariant":484},[214,5632,1511],{},[217,5634,43],{"stretchy":241},[214,5636,180],{},[217,5638,1522],{"stretchy":241},[253,5640,5641],{"encoding":255},"x = y \\;\\wedge\\; f(x) \\ne f(y)",[28,5643,5645,5663,5687,5747],{"className":5644,"ariaHidden":261},[260],[28,5646,5648,5651,5654,5657,5660],{"className":5647},[265],[28,5649],{"className":5650,"style":645},[269],[28,5652,176],{"className":5653},[274,275],[28,5655],{"className":5656,"style":302},[279],[28,5658,83],{"className":5659},[306],[28,5661],{"className":5662,"style":302},[279],[28,5664,5666,5669,5672,5675,5678,5681,5684],{"className":5665},[265],[28,5667],{"className":5668,"style":1083},[269],[28,5670,180],{"className":5671,"style":298},[274,275],[28,5673],{"className":5674,"style":302},[279],[28,5676],{"className":5677,"style":280},[279],[28,5679,233],{"className":5680},[284],[28,5682],{"className":5683,"style":302},[279],[28,5685],{"className":5686,"style":280},[279],[28,5688,5690,5693,5696,5699,5702,5705,5708,5744],{"className":5689},[265],[28,5691],{"className":5692,"style":341},[269],[28,5694,1511],{"className":5695,"style":1546},[274,275],[28,5697,43],{"className":5698},[348],[28,5700,176],{"className":5701},[274,275],[28,5703,1522],{"className":5704},[355],[28,5706],{"className":5707,"style":302},[279],[28,5709,5711,5738,5741],{"className":5710},[306],[28,5712,5714],{"className":5713},[306],[28,5715,5717],{"className":5716},[274,2359],[28,5718,5720],{"className":5719},[2363],[28,5721,5723,5726,5735],{"className":5722},[2367],[28,5724],{"className":5725,"style":2371},[269],[28,5727,5729],{"className":5728},[2375],[28,5730,5732],{"className":5731},[274],[28,5733,2382],{"className":5734},[306],[28,5736],{"className":5737},[2386],[28,5739],{"className":5740},[279,2390],[28,5742,83],{"className":5743},[306],[28,5745],{"className":5746,"style":302},[279],[28,5748,5750,5753,5756,5759,5762],{"className":5749},[265],[28,5751],{"className":5752,"style":341},[269],[28,5754,1511],{"className":5755,"style":1546},[274,275],[28,5757,43],{"className":5758},[348],[28,5760,180],{"className":5761,"style":298},[274,275],[28,5763,1522],{"className":5764},[355],[11,5766,5767],{},"假设我们分别去问两个求解器：",[2480,5769,5770,5902],{},[2483,5771,5772,5773,5824,5825,5827,5828,5901],{},"算术求解器只看 ",[28,5774,5776,5794],{"className":5775,"translate":193},[197],[28,5777,5779],{"className":5778},[201],[203,5780,5781],{"xmlns":205},[208,5782,5783,5791],{},[211,5784,5785,5787,5789],{},[214,5786,176],{},[217,5788,83],{},[214,5790,180],{},[253,5792,5793],{"encoding":255},"x = y",[28,5795,5797,5815],{"className":5796,"ariaHidden":261},[260],[28,5798,5800,5803,5806,5809,5812],{"className":5799},[265],[28,5801],{"className":5802,"style":645},[269],[28,5804,176],{"className":5805},[274,275],[28,5807],{"className":5808,"style":302},[279],[28,5810,83],{"className":5811},[306],[28,5813],{"className":5814,"style":302},[279],[28,5816,5818,5821],{"className":5817},[265],[28,5819],{"className":5820,"style":612},[269],[28,5822,180],{"className":5823,"style":298},[274,275],"，回答 ",[183,5826,405],{},"，比如 ",[28,5829,5831,5853],{"className":5830,"translate":193},[197],[28,5832,5834],{"className":5833},[201],[203,5835,5836],{"xmlns":205},[208,5837,5838,5850],{},[211,5839,5840,5842,5844,5846,5848],{},[214,5841,176],{},[217,5843,83],{},[214,5845,180],{},[217,5847,83],{},[224,5849,89],{},[253,5851,5852],{"encoding":255},"x = y = 0",[28,5854,5856,5874,5892],{"className":5855,"ariaHidden":261},[260],[28,5857,5859,5862,5865,5868,5871],{"className":5858},[265],[28,5860],{"className":5861,"style":645},[269],[28,5863,176],{"className":5864},[274,275],[28,5866],{"className":5867,"style":302},[279],[28,5869,83],{"className":5870},[306],[28,5872],{"className":5873,"style":302},[279],[28,5875,5877,5880,5883,5886,5889],{"className":5876},[265],[28,5878],{"className":5879,"style":612},[269],[28,5881,180],{"className":5882,"style":298},[274,275],[28,5884],{"className":5885,"style":302},[279],[28,5887,83],{"className":5888},[306],[28,5890],{"className":5891,"style":302},[279],[28,5893,5895,5898],{"className":5894},[265],[28,5896],{"className":5897,"style":316},[269],[28,5899,89],{"className":5900},[274],"；",[2483,5903,5904,5905,6018,6019,6021,6022,6063,6064,177,6130,2923],{},"EUF 求解器只看 ",[28,5906,5908,5937],{"className":5907,"translate":193},[197],[28,5909,5911],{"className":5910},[201],[203,5912,5913],{"xmlns":205},[208,5914,5915,5935],{},[211,5916,5917,5919,5921,5923,5925,5927,5929,5931,5933],{},[214,5918,1511],{},[217,5920,43],{"stretchy":241},[214,5922,176],{},[217,5924,1522],{"stretchy":241},[217,5926,1854],{"mathvariant":484},[214,5928,1511],{},[217,5930,43],{"stretchy":241},[214,5932,180],{},[217,5934,1522],{"stretchy":241},[253,5936,2732],{"encoding":255},[28,5938,5940,6000],{"className":5939,"ariaHidden":261},[260],[28,5941,5943,5946,5949,5952,5955,5958,5961,5997],{"className":5942},[265],[28,5944],{"className":5945,"style":341},[269],[28,5947,1511],{"className":5948,"style":1546},[274,275],[28,5950,43],{"className":5951},[348],[28,5953,176],{"className":5954},[274,275],[28,5956,1522],{"className":5957},[355],[28,5959],{"className":5960,"style":302},[279],[28,5962,5964,5991,5994],{"className":5963},[306],[28,5965,5967],{"className":5966},[306],[28,5968,5970],{"className":5969},[274,2359],[28,5971,5973],{"className":5972},[2363],[28,5974,5976,5979,5988],{"className":5975},[2367],[28,5977],{"className":5978,"style":2371},[269],[28,5980,5982],{"className":5981},[2375],[28,5983,5985],{"className":5984},[274],[28,5986,2382],{"className":5987},[306],[28,5989],{"className":5990},[2386],[28,5992],{"className":5993},[279,2390],[28,5995,83],{"className":5996},[306],[28,5998],{"className":5999,"style":302},[279],[28,6001,6003,6006,6009,6012,6015],{"className":6002},[265],[28,6004],{"className":6005,"style":341},[269],[28,6007,1511],{"className":6008,"style":1546},[274,275],[28,6010,43],{"className":6011},[348],[28,6013,180],{"className":6014,"style":298},[274,275],[28,6016,1522],{"className":6017},[355],"，也回答 ",[183,6020,405],{},"：它把 ",[28,6023,6025,6042],{"className":6024,"translate":193},[197],[28,6026,6028],{"className":6027},[201],[203,6029,6030],{"xmlns":205},[208,6031,6032,6040],{},[211,6033,6034,6036,6038],{},[214,6035,176],{},[217,6037,1683],{"separator":261},[214,6039,180],{},[253,6041,3226],{"encoding":255},[28,6043,6045],{"className":6044,"ariaHidden":261},[260],[28,6046,6048,6051,6054,6057,6060],{"className":6047},[265],[28,6049],{"className":6050,"style":612},[269],[28,6052,176],{"className":6053},[274,275],[28,6055,1683],{"className":6056},[1723],[28,6058],{"className":6059,"style":530},[279],[28,6061,180],{"className":6062,"style":298},[274,275]," 当成两个不同的常量，令 ",[28,6065,6067,6091],{"className":6066,"translate":193},[197],[28,6068,6070],{"className":6069},[201],[203,6071,6072],{"xmlns":205},[208,6073,6074,6088],{},[211,6075,6076,6078,6080,6082,6084,6086],{},[214,6077,1511],{},[217,6079,43],{"stretchy":241},[214,6081,176],{},[217,6083,1522],{"stretchy":241},[217,6085,83],{},[224,6087,89],{},[253,6089,6090],{"encoding":255},"f(x) = 0",[28,6092,6094,6121],{"className":6093,"ariaHidden":261},[260],[28,6095,6097,6100,6103,6106,6109,6112,6115,6118],{"className":6096},[265],[28,6098],{"className":6099,"style":341},[269],[28,6101,1511],{"className":6102,"style":1546},[274,275],[28,6104,43],{"className":6105},[348],[28,6107,176],{"className":6108},[274,275],[28,6110,1522],{"className":6111},[355],[28,6113],{"className":6114,"style":302},[279],[28,6116,83],{"className":6117},[306],[28,6119],{"className":6120,"style":302},[279],[28,6122,6124,6127],{"className":6123},[265],[28,6125],{"className":6126,"style":316},[269],[28,6128,89],{"className":6129},[274],[28,6131,6133,6157],{"className":6132,"translate":193},[197],[28,6134,6136],{"className":6135},[201],[203,6137,6138],{"xmlns":205},[208,6139,6140,6154],{},[211,6141,6142,6144,6146,6148,6150,6152],{},[214,6143,1511],{},[217,6145,43],{"stretchy":241},[214,6147,180],{},[217,6149,1522],{"stretchy":241},[217,6151,83],{},[224,6153,1244],{},[253,6155,6156],{"encoding":255},"f(y) = 1",[28,6158,6160,6187],{"className":6159,"ariaHidden":261},[260],[28,6161,6163,6166,6169,6172,6175,6178,6181,6184],{"className":6162},[265],[28,6164],{"className":6165,"style":341},[269],[28,6167,1511],{"className":6168,"style":1546},[274,275],[28,6170,43],{"className":6171},[348],[28,6173,180],{"className":6174,"style":298},[274,275],[28,6176,1522],{"className":6177},[355],[28,6179],{"className":6180,"style":302},[279],[28,6182,83],{"className":6183},[306],[28,6185],{"className":6186,"style":302},[279],[28,6188,6190,6193],{"className":6189},[265],[28,6191],{"className":6192,"style":316},[269],[28,6194,1244],{"className":6195},[274],[11,6197,6198,6199,6249,6250,6294,6295,6339,6340,6453,6454,2923],{},"如果把两个答案一拼，说「两边都可满足，所以整体可满足」，就错了。因为 ",[28,6200,6202,6219],{"className":6201,"translate":193},[197],[28,6203,6205],{"className":6204},[201],[203,6206,6207],{"xmlns":205},[208,6208,6209,6217],{},[211,6210,6211,6213,6215],{},[214,6212,176],{},[217,6214,83],{},[214,6216,180],{},[253,6218,5793],{"encoding":255},[28,6220,6222,6240],{"className":6221,"ariaHidden":261},[260],[28,6223,6225,6228,6231,6234,6237],{"className":6224},[265],[28,6226],{"className":6227,"style":645},[269],[28,6229,176],{"className":6230},[274,275],[28,6232],{"className":6233,"style":302},[279],[28,6235,83],{"className":6236},[306],[28,6238],{"className":6239,"style":302},[279],[28,6241,6243,6246],{"className":6242},[265],[28,6244],{"className":6245,"style":612},[269],[28,6247,180],{"className":6248,"style":298},[274,275]," 意味着 ",[28,6251,6253,6273],{"className":6252,"translate":193},[197],[28,6254,6256],{"className":6255},[201],[203,6257,6258],{"xmlns":205},[208,6259,6260,6270],{},[211,6261,6262,6264,6266,6268],{},[214,6263,1511],{},[217,6265,43],{"stretchy":241},[214,6267,176],{},[217,6269,1522],{"stretchy":241},[253,6271,6272],{"encoding":255},"f(x)",[28,6274,6276],{"className":6275,"ariaHidden":261},[260],[28,6277,6279,6282,6285,6288,6291],{"className":6278},[265],[28,6280],{"className":6281,"style":341},[269],[28,6283,1511],{"className":6284,"style":1546},[274,275],[28,6286,43],{"className":6287},[348],[28,6289,176],{"className":6290},[274,275],[28,6292,1522],{"className":6293},[355]," 必须等于 ",[28,6296,6298,6318],{"className":6297,"translate":193},[197],[28,6299,6301],{"className":6300},[201],[203,6302,6303],{"xmlns":205},[208,6304,6305,6315],{},[211,6306,6307,6309,6311,6313],{},[214,6308,1511],{},[217,6310,43],{"stretchy":241},[214,6312,180],{},[217,6314,1522],{"stretchy":241},[253,6316,6317],{"encoding":255},"f(y)",[28,6319,6321],{"className":6320,"ariaHidden":261},[260],[28,6322,6324,6327,6330,6333,6336],{"className":6323},[265],[28,6325],{"className":6326,"style":341},[269],[28,6328,1511],{"className":6329,"style":1546},[274,275],[28,6331,43],{"className":6332},[348],[28,6334,180],{"className":6335,"style":298},[274,275],[28,6337,1522],{"className":6338},[355],"，与 ",[28,6341,6343,6372],{"className":6342,"translate":193},[197],[28,6344,6346],{"className":6345},[201],[203,6347,6348],{"xmlns":205},[208,6349,6350,6370],{},[211,6351,6352,6354,6356,6358,6360,6362,6364,6366,6368],{},[214,6353,1511],{},[217,6355,43],{"stretchy":241},[214,6357,176],{},[217,6359,1522],{"stretchy":241},[217,6361,1854],{"mathvariant":484},[214,6363,1511],{},[217,6365,43],{"stretchy":241},[214,6367,180],{},[217,6369,1522],{"stretchy":241},[253,6371,2732],{"encoding":255},[28,6373,6375,6435],{"className":6374,"ariaHidden":261},[260],[28,6376,6378,6381,6384,6387,6390,6393,6396,6432],{"className":6377},[265],[28,6379],{"className":6380,"style":341},[269],[28,6382,1511],{"className":6383,"style":1546},[274,275],[28,6385,43],{"className":6386},[348],[28,6388,176],{"className":6389},[274,275],[28,6391,1522],{"className":6392},[355],[28,6394],{"className":6395,"style":302},[279],[28,6397,6399,6426,6429],{"className":6398},[306],[28,6400,6402],{"className":6401},[306],[28,6403,6405],{"className":6404},[274,2359],[28,6406,6408],{"className":6407},[2363],[28,6409,6411,6414,6423],{"className":6410},[2367],[28,6412],{"className":6413,"style":2371},[269],[28,6415,6417],{"className":6416},[2375],[28,6418,6420],{"className":6419},[274],[28,6421,2382],{"className":6422},[306],[28,6424],{"className":6425},[2386],[28,6427],{"className":6428},[279,2390],[28,6430,83],{"className":6431},[306],[28,6433],{"className":6434,"style":302},[279],[28,6436,6438,6441,6444,6447,6450],{"className":6437},[265],[28,6439],{"className":6440,"style":341},[269],[28,6442,1511],{"className":6443,"style":1546},[274,275],[28,6445,43],{"className":6446},[348],[28,6448,180],{"className":6449,"style":298},[274,275],[28,6451,1522],{"className":6452},[355]," 直接矛盾。整体其实是 ",[183,6455,6456],{},"unsat",[11,6458,6459,6460,6510,6511,6592],{},"要得到正确答案，两个求解器必须交换信息：算术把等式 ",[28,6461,6463,6480],{"className":6462,"translate":193},[197],[28,6464,6466],{"className":6465},[201],[203,6467,6468],{"xmlns":205},[208,6469,6470,6478],{},[211,6471,6472,6474,6476],{},[214,6473,176],{},[217,6475,83],{},[214,6477,180],{},[253,6479,5793],{"encoding":255},[28,6481,6483,6501],{"className":6482,"ariaHidden":261},[260],[28,6484,6486,6489,6492,6495,6498],{"className":6485},[265],[28,6487],{"className":6488,"style":645},[269],[28,6490,176],{"className":6491},[274,275],[28,6493],{"className":6494,"style":302},[279],[28,6496,83],{"className":6497},[306],[28,6499],{"className":6500,"style":302},[279],[28,6502,6504,6507],{"className":6503},[265],[28,6505],{"className":6506,"style":612},[269],[28,6508,180],{"className":6509,"style":298},[274,275]," 告诉 EUF，EUF 立刻推出 ",[28,6512,6514,6544],{"className":6513,"translate":193},[197],[28,6515,6517],{"className":6516},[201],[203,6518,6519],{"xmlns":205},[208,6520,6521,6541],{},[211,6522,6523,6525,6527,6529,6531,6533,6535,6537,6539],{},[214,6524,1511],{},[217,6526,43],{"stretchy":241},[214,6528,176],{},[217,6530,1522],{"stretchy":241},[217,6532,83],{},[214,6534,1511],{},[217,6536,43],{"stretchy":241},[214,6538,180],{},[217,6540,1522],{"stretchy":241},[253,6542,6543],{"encoding":255},"f(x) = f(y)",[28,6545,6547,6574],{"className":6546,"ariaHidden":261},[260],[28,6548,6550,6553,6556,6559,6562,6565,6568,6571],{"className":6549},[265],[28,6551],{"className":6552,"style":341},[269],[28,6554,1511],{"className":6555,"style":1546},[274,275],[28,6557,43],{"className":6558},[348],[28,6560,176],{"className":6561},[274,275],[28,6563,1522],{"className":6564},[355],[28,6566],{"className":6567,"style":302},[279],[28,6569,83],{"className":6570},[306],[28,6572],{"className":6573,"style":302},[279],[28,6575,6577,6580,6583,6586,6589],{"className":6576},[265],[28,6578],{"className":6579,"style":341},[269],[28,6581,1511],{"className":6582,"style":1546},[274,275],[28,6584,43],{"className":6585},[348],[28,6587,180],{"className":6588,"style":298},[274,275],[28,6590,1522],{"className":6591},[355],"，冲突。谁来负责交换？交换哪些事实？什么时候交换？在 SMT 之前，这些都是需要人工设计的事情。",[11,6594,6595,6596,6599],{},"数组和算术之间也有同样的坑。",[25,6597,6598],{},"i = j ∧ a[i] ≠ a[j]"," 单独看两边都可满足，合起来却不可满足，因为下标相等就意味着读到的值相等。没有任何一个专用算法能独自看出这一点。",[419,6601,6603],{"id":6602},"_24-门槛太高","2.4 门槛太高",[11,6605,6606,6607,2923],{},"还有一条路是 Coq、Isabelle、ACL2 这类交互式定理证明器。它们的表达力极强，能处理带量词、带归纳的复杂性质，但代价是",[183,6608,6609],{},"需要人写证明脚本",[11,6611,6612],{},"比如在 Coq 里证明「任何自然数加零都等于它自己」，要写：",[18,6614,6618],{"className":6615,"code":6616,"language":6617,"meta":23,"style":23},"language-coq shiki shiki-themes github-dark","Theorem plus_0_r : forall n : nat, n + 0 = n.\nProof.\n  induction n as [| n' IH].\n  - simpl. reflexivity.\n  - simpl. rewrite IH. reflexivity.\nQed.\n","coq",[25,6619,6620,6625,6630,6635,6640,6645],{"__ignoreMap":23},[28,6621,6622],{"class":30,"line":31},[28,6623,6624],{},"Theorem plus_0_r : forall n : nat, n + 0 = n.\n",[28,6626,6627],{"class":30,"line":64},[28,6628,6629],{},"Proof.\n",[28,6631,6632],{"class":30,"line":95},[28,6633,6634],{},"  induction n as [| n' IH].\n",[28,6636,6637],{"class":30,"line":115},[28,6638,6639],{},"  - simpl. reflexivity.\n",[28,6641,6642],{"class":30,"line":154},[28,6643,6644],{},"  - simpl. rewrite IH. reflexivity.\n",[28,6646,6647],{"class":30,"line":161},[28,6648,6649],{},"Qed.\n",[11,6651,6652],{},"这几行不是装饰：",[2480,6654,6655,6816,6909],{},[2483,6656,6657,6660,6661,2693,6712,5901],{},[25,6658,6659],{},"induction n"," 把目标拆成两种情况：",[28,6662,6664,6682],{"className":6663,"translate":193},[197],[28,6665,6667],{"className":6666},[201],[203,6668,6669],{"xmlns":205},[208,6670,6671,6679],{},[211,6672,6673,6675,6677],{},[214,6674,3060],{},[217,6676,83],{},[224,6678,89],{},[253,6680,6681],{"encoding":255},"n = 0",[28,6683,6685,6703],{"className":6684,"ariaHidden":261},[260],[28,6686,6688,6691,6694,6697,6700],{"className":6687},[265],[28,6689],{"className":6690,"style":645},[269],[28,6692,3060],{"className":6693},[274,275],[28,6695],{"className":6696,"style":302},[279],[28,6698,83],{"className":6699},[306],[28,6701],{"className":6702,"style":302},[279],[28,6704,6706,6709],{"className":6705},[265],[28,6707],{"className":6708,"style":316},[269],[28,6710,89],{"className":6711},[274],[28,6713,6715,6745],{"className":6714,"translate":193},[197],[28,6716,6718],{"className":6717},[201],[203,6719,6720],{"xmlns":205},[208,6721,6722,6742],{},[211,6723,6724,6726,6728,6731,6733,6740],{},[214,6725,3060],{},[217,6727,83],{},[214,6729,6730],{},"S",[217,6732,43],{"stretchy":241},[3054,6734,6735,6737],{},[214,6736,3060],{},[217,6738,6739],{"mathvariant":484,"lspace":5019,"rspace":5019},"′",[217,6741,1522],{"stretchy":241},[253,6743,6744],{"encoding":255},"n = S(n')",[28,6746,6748,6766],{"className":6747,"ariaHidden":261},[260],[28,6749,6751,6754,6757,6760,6763],{"className":6750},[265],[28,6752],{"className":6753,"style":645},[269],[28,6755,3060],{"className":6756},[274,275],[28,6758],{"className":6759,"style":302},[279],[28,6761,83],{"className":6762},[306],[28,6764],{"className":6765,"style":302},[279],[28,6767,6769,6773,6777,6780,6813],{"className":6768},[265],[28,6770],{"className":6771,"style":6772},[269],"height:1.0019em;vertical-align:-0.25em;",[28,6774,6730],{"className":6775,"style":6776},[274,275],"margin-right:0.0576em;",[28,6778,43],{"className":6779},[348],[28,6781,6783,6786],{"className":6782},[274],[28,6784,3060],{"className":6785},[274,275],[28,6787,6789],{"className":6788},[556],[28,6790,6792],{"className":6791},[560],[28,6793,6795],{"className":6794},[565],[28,6796,6799],{"className":6797,"style":6798},[569],"height:0.7519em;",[28,6800,6801,6804],{"style":3094},[28,6802],{"className":6803,"style":578},[577],[28,6805,6807],{"className":6806},[582,583,584,585],[28,6808,6810],{"className":6809},[274,585],[28,6811,6739],{"className":6812},[274,585],[28,6814,1522],{"className":6815},[355],[2483,6817,6818,6819,6822,6823,6875,6876,6904,6905,6908],{},"第一种情况，",[25,6820,6821],{},"simpl"," 把 ",[28,6824,6826,6844],{"className":6825,"translate":193},[197],[28,6827,6829],{"className":6828},[201],[203,6830,6831],{"xmlns":205},[208,6832,6833,6841],{},[211,6834,6835,6837,6839],{},[224,6836,89],{},[217,6838,124],{},[224,6840,89],{},[253,6842,6843],{"encoding":255},"0 + 0",[28,6845,6847,6866],{"className":6846,"ariaHidden":261},[260],[28,6848,6850,6854,6857,6860,6863],{"className":6849},[265],[28,6851],{"className":6852,"style":6853},[269],"height:0.7278em;vertical-align:-0.0833em;",[28,6855,89],{"className":6856},[274],[28,6858],{"className":6859,"style":280},[279],[28,6861,124],{"className":6862},[284],[28,6864],{"className":6865,"style":280},[279],[28,6867,6869,6872],{"className":6868},[265],[28,6870],{"className":6871,"style":316},[269],[28,6873,89],{"className":6874},[274]," 化简成 ",[28,6877,6879,6892],{"className":6878,"translate":193},[197],[28,6880,6882],{"className":6881},[201],[203,6883,6884],{"xmlns":205},[208,6885,6886,6890],{},[211,6887,6888],{},[224,6889,89],{},[253,6891,89],{"encoding":255},[28,6893,6895],{"className":6894,"ariaHidden":261},[260],[28,6896,6898,6901],{"className":6897},[265],[28,6899],{"className":6900,"style":316},[269],[28,6902,89],{"className":6903},[274],"，",[25,6906,6907],{},"reflexivity"," 确认两边相等；",[2483,6910,6911,6912,6822,6914,7013,7014,7113,7114,6822,7117,7202,7203,7265,7266,7268],{},"第二种情况，",[25,6913,6821],{},[28,6915,6917,6945],{"className":6916,"translate":193},[197],[28,6918,6920],{"className":6919},[201],[203,6921,6922],{"xmlns":205},[208,6923,6924,6942],{},[211,6925,6926,6928,6930,6936,6938,6940],{},[214,6927,6730],{},[217,6929,43],{"stretchy":241},[3054,6931,6932,6934],{},[214,6933,3060],{},[217,6935,6739],{"mathvariant":484,"lspace":5019,"rspace":5019},[217,6937,1522],{"stretchy":241},[217,6939,124],{},[224,6941,89],{},[253,6943,6944],{"encoding":255},"S(n') + 0",[28,6946,6948,7004],{"className":6947,"ariaHidden":261},[260],[28,6949,6951,6954,6957,6960,6992,6995,6998,7001],{"className":6950},[265],[28,6952],{"className":6953,"style":6772},[269],[28,6955,6730],{"className":6956,"style":6776},[274,275],[28,6958,43],{"className":6959},[348],[28,6961,6963,6966],{"className":6962},[274],[28,6964,3060],{"className":6965},[274,275],[28,6967,6969],{"className":6968},[556],[28,6970,6972],{"className":6971},[560],[28,6973,6975],{"className":6974},[565],[28,6976,6978],{"className":6977,"style":6798},[569],[28,6979,6980,6983],{"style":3094},[28,6981],{"className":6982,"style":578},[577],[28,6984,6986],{"className":6985},[582,583,584,585],[28,6987,6989],{"className":6988},[274,585],[28,6990,6739],{"className":6991},[274,585],[28,6993,1522],{"className":6994},[355],[28,6996],{"className":6997,"style":280},[279],[28,6999,124],{"className":7000},[284],[28,7002],{"className":7003,"style":280},[279],[28,7005,7007,7010],{"className":7006},[265],[28,7008],{"className":7009,"style":316},[269],[28,7011,89],{"className":7012},[274]," 化成 ",[28,7015,7017,7045],{"className":7016,"translate":193},[197],[28,7018,7020],{"className":7019},[201],[203,7021,7022],{"xmlns":205},[208,7023,7024,7042],{},[211,7025,7026,7028,7030,7036,7038,7040],{},[214,7027,6730],{},[217,7029,43],{"stretchy":241},[3054,7031,7032,7034],{},[214,7033,3060],{},[217,7035,6739],{"mathvariant":484,"lspace":5019,"rspace":5019},[217,7037,124],{},[224,7039,89],{},[217,7041,1522],{"stretchy":241},[253,7043,7044],{"encoding":255},"S(n' + 0)",[28,7046,7048,7101],{"className":7047,"ariaHidden":261},[260],[28,7049,7051,7054,7057,7060,7092,7095,7098],{"className":7050},[265],[28,7052],{"className":7053,"style":6772},[269],[28,7055,6730],{"className":7056,"style":6776},[274,275],[28,7058,43],{"className":7059},[348],[28,7061,7063,7066],{"className":7062},[274],[28,7064,3060],{"className":7065},[274,275],[28,7067,7069],{"className":7068},[556],[28,7070,7072],{"className":7071},[560],[28,7073,7075],{"className":7074},[565],[28,7076,7078],{"className":7077,"style":6798},[569],[28,7079,7080,7083],{"style":3094},[28,7081],{"className":7082,"style":578},[577],[28,7084,7086],{"className":7085},[582,583,584,585],[28,7087,7089],{"className":7088},[274,585],[28,7090,6739],{"className":7091},[274,585],[28,7093],{"className":7094,"style":280},[279],[28,7096,124],{"className":7097},[284],[28,7099],{"className":7100,"style":280},[279],[28,7102,7104,7107,7110],{"className":7103},[265],[28,7105],{"className":7106,"style":341},[269],[28,7108,89],{"className":7109},[274],[28,7111,1522],{"className":7112},[355],"，再用归纳假设 ",[25,7115,7116],{},"IH",[28,7118,7120,7142],{"className":7119,"translate":193},[197],[28,7121,7123],{"className":7122},[201],[203,7124,7125],{"xmlns":205},[208,7126,7127,7139],{},[211,7128,7129,7135,7137],{},[3054,7130,7131,7133],{},[214,7132,3060],{},[217,7134,6739],{"mathvariant":484,"lspace":5019,"rspace":5019},[217,7136,124],{},[224,7138,89],{},[253,7140,7141],{"encoding":255},"n' + 0",[28,7143,7145,7193],{"className":7144,"ariaHidden":261},[260],[28,7146,7148,7152,7184,7187,7190],{"className":7147},[265],[28,7149],{"className":7150,"style":7151},[269],"height:0.8352em;vertical-align:-0.0833em;",[28,7153,7155,7158],{"className":7154},[274],[28,7156,3060],{"className":7157},[274,275],[28,7159,7161],{"className":7160},[556],[28,7162,7164],{"className":7163},[560],[28,7165,7167],{"className":7166},[565],[28,7168,7170],{"className":7169,"style":6798},[569],[28,7171,7172,7175],{"style":3094},[28,7173],{"className":7174,"style":578},[577],[28,7176,7178],{"className":7177},[582,583,584,585],[28,7179,7181],{"className":7180},[274,585],[28,7182,6739],{"className":7183},[274,585],[28,7185],{"className":7186,"style":280},[279],[28,7188,124],{"className":7189},[284],[28,7191],{"className":7192,"style":280},[279],[28,7194,7196,7199],{"className":7195},[265],[28,7197],{"className":7198,"style":316},[269],[28,7200,89],{"className":7201},[274]," 换成 ",[28,7204,7206,7224],{"className":7205,"translate":193},[197],[28,7207,7209],{"className":7208},[201],[203,7210,7211],{"xmlns":205},[208,7212,7213,7221],{},[211,7214,7215],{},[3054,7216,7217,7219],{},[214,7218,3060],{},[217,7220,6739],{"mathvariant":484,"lspace":5019,"rspace":5019},[253,7222,7223],{"encoding":255},"n'",[28,7225,7227],{"className":7226,"ariaHidden":261},[260],[28,7228,7230,7233],{"className":7229},[265],[28,7231],{"className":7232,"style":6798},[269],[28,7234,7236,7239],{"className":7235},[274],[28,7237,3060],{"className":7238},[274,275],[28,7240,7242],{"className":7241},[556],[28,7243,7245],{"className":7244},[560],[28,7246,7248],{"className":7247},[565],[28,7249,7251],{"className":7250,"style":6798},[569],[28,7252,7253,7256],{"style":3094},[28,7254],{"className":7255,"style":578},[577],[28,7257,7259],{"className":7258},[582,583,584,585],[28,7260,7262],{"className":7261},[274,585],[28,7263,6739],{"className":7264},[274,585],"，最后 ",[25,7267,6907],{}," 收尾。",[11,7270,7271],{},"每一步往哪走、用哪条归纳假设，都是人选的。这还只是自然数加零。真实的程序验证要证循环不变式、数组不变式、指针分离，脚本可能几百上千行。",[11,7273,7274],{},"程序分析场景里，工具每秒要生成并判定几千条路径条件。不可能每条都停下来等工程师写一段证明。自动化程度不够，就无法工业部署。",[419,7276,7278],{"id":7277},"_25-小结","2.5 小结",[11,7280,7281],{},"几条路，各有各的难处：",[2480,7283,7284,7287,7290,7293],{},[2483,7285,7286],{},"纯 SAT 快，但把高层语义压成门电路之后，规模爆炸、语义丢失；",[2483,7288,7289],{},"一阶逻辑表达力强，但一般情形不可判定，自动证明器可能永远给不出答案；",[2483,7291,7292],{},"专用算法在自己的理论里很好用，碰到混合约束就各自为政；",[2483,7294,7295],{},"交互式定理证明能处理复杂性质，但每条路径都等人写脚本，工业化无从谈起。",[11,7297,7298,7299],{},"SMT 要做的，就是在这几条路的夹缝里找一个中间地带：",[183,7300,7301],{},"表达力足够描述程序，判定过程保证自动，还能把多个理论组合起来。",[414,7303,7305],{"id":7304},"三smt-的解法","三、SMT 的解法",[419,7307,7309],{"id":7308},"_31-收缩片段","3.1 收缩片段",[11,7311,7312,7313,7316],{},"SMT 的第一个策略是",[183,7314,7315],{},"主动放弃一部分表达力","，只保留可判定的片段。",[11,7318,7319],{},"具体做法是：把主战场放在无量词片段，只允许特定理论的组合。这样既避开了 2.2 节里的不可判定性，又保留了描述程序行为所需的大部分能力。",[11,7321,7322,7323,6904,7352,7418],{},"为什么可以放弃量词？因为程序分析产生的验证条件，大多数天然就是无量词的。符号执行收集到的路径条件，是对「这一条路径上各个变量的具体取值」的约束，不需要「对所有 ",[28,7324,7326,7339],{"className":7325,"translate":193},[197],[28,7327,7329],{"className":7328},[201],[203,7330,7331],{"xmlns":205},[208,7332,7333,7337],{},[211,7334,7335],{},[214,7336,1686],{},[253,7338,1686],{"encoding":255},[28,7340,7342],{"className":7341,"ariaHidden":261},[260],[28,7343,7345,7349],{"className":7344},[265],[28,7346],{"className":7347,"style":7348},[269],"height:0.6595em;",[28,7350,1686],{"className":7351},[274,275],[28,7353,7355,7379],{"className":7354,"translate":193},[197],[28,7356,7358],{"className":7357},[201],[203,7359,7360],{"xmlns":205},[208,7361,7362,7376],{},[211,7363,7364,7366,7368,7370,7372,7374],{},[214,7365,238],{},[217,7367,73],{"stretchy":241},[214,7369,1686],{},[217,7371,246],{"stretchy":241},[217,7373,130],{},[224,7375,89],{},[253,7377,7378],{"encoding":255},"a[i] > 0",[28,7380,7382,7409],{"className":7381,"ariaHidden":261},[260],[28,7383,7385,7388,7391,7394,7397,7400,7403,7406],{"className":7384},[265],[28,7386],{"className":7387,"style":341},[269],[28,7389,238],{"className":7390},[274,275],[28,7392,73],{"className":7393},[348],[28,7395,1686],{"className":7396},[274,275],[28,7398,246],{"className":7399},[355],[28,7401],{"className":7402,"style":302},[279],[28,7404,130],{"className":7405},[306],[28,7407],{"className":7408,"style":302},[279],[28,7410,7412,7415],{"className":7411},[265],[28,7413],{"className":7414,"style":316},[269],[28,7416,89],{"className":7417},[274],"」这种全称陈述。",[11,7420,7421,7422,7453],{},"需要量词的地方——循环不变式、数组的整体性质、归纳证明——通常由上层工具负责：抽象解释负责生成不变式，",[28,7423,7425,7439],{"className":7424,"translate":193},[197],[28,7426,7428],{"className":7427},[201],[203,7429,7430],{"xmlns":205},[208,7431,7432,7437],{},[211,7433,7434],{},[214,7435,7436],{},"k",[253,7438,7436],{"encoding":255},[28,7440,7442],{"className":7441,"ariaHidden":261},[260],[28,7443,7445,7449],{"className":7444},[265],[28,7446],{"className":7447,"style":7448},[269],"height:0.6944em;",[28,7450,7436],{"className":7451,"style":7452},[274,275],"margin-right:0.0315em;","-induction 负责把归纳化归为有限次查询，SMT 只作为底层的判定引擎。这是一个分工，而不是缺陷。",[11,7455,7456,7457,177,7459,177,7461,7463,7464,7466,7467,7469,7470,7472],{},"当然，「可判定」不等于「容易」。",[25,7458,2940],{},[25,7460,2954],{},[25,7462,3039],{}," 都是 NP-complete；",[25,7465,2950],{}," 是多项式时间；",[25,7468,3027],{}," 可判定，但最坏情况是双指数；",[25,7471,3030],{}," 则直接不可判定。",[11,7474,7475],{},"SMT 在选定的片段内保证了「答案一定会来」，但不保证「答案来得快」。工程上的成败，很大程度上取决于启发式和问题编码。",[419,7477,7479],{"id":7478},"_32-直接表达","3.2 直接表达",[11,7481,7482,7483,2923],{},"第二个策略是",[183,7484,7485],{},"让公式直接说人话",[11,7487,7488,7489,7561,7562,7627,7628,7669],{},"同样是「",[28,7490,7492,7513],{"className":7491,"translate":193},[197],[28,7493,7495],{"className":7494},[201],[203,7496,7497],{"xmlns":205},[208,7498,7499,7511],{},[211,7500,7501,7503,7505,7507,7509],{},[214,7502,176],{},[217,7504,124],{},[214,7506,180],{},[217,7508,130],{},[224,7510,226],{},[253,7512,390],{"encoding":255},[28,7514,7516,7534,7552],{"className":7515,"ariaHidden":261},[260],[28,7517,7519,7522,7525,7528,7531],{"className":7518},[265],[28,7520],{"className":7521,"style":270},[269],[28,7523,176],{"className":7524},[274,275],[28,7526],{"className":7527,"style":280},[279],[28,7529,124],{"className":7530},[284],[28,7532],{"className":7533,"style":280},[279],[28,7535,7537,7540,7543,7546,7549],{"className":7536},[265],[28,7538],{"className":7539,"style":294},[269],[28,7541,180],{"className":7542,"style":298},[274,275],[28,7544],{"className":7545,"style":302},[279],[28,7547,130],{"className":7548},[306],[28,7550],{"className":7551,"style":302},[279],[28,7553,7555,7558],{"className":7554},[265],[28,7556],{"className":7557,"style":316},[269],[28,7559,226],{"className":7560},[274]," 且 ",[28,7563,7565,7588],{"className":7564,"translate":193},[197],[28,7566,7568],{"className":7567},[201],[203,7569,7570],{"xmlns":205},[208,7571,7572,7586],{},[211,7573,7574,7576,7578,7580,7582,7584],{},[214,7575,238],{},[217,7577,73],{"stretchy":241},[224,7579,89],{},[217,7581,246],{"stretchy":241},[217,7583,83],{},[224,7585,251],{},[253,7587,394],{"encoding":255},[28,7589,7591,7618],{"className":7590,"ariaHidden":261},[260],[28,7592,7594,7597,7600,7603,7606,7609,7612,7615],{"className":7593},[265],[28,7595],{"className":7596,"style":341},[269],[28,7598,238],{"className":7599},[274,275],[28,7601,73],{"className":7602},[348],[28,7604,89],{"className":7605},[274],[28,7607,246],{"className":7608},[355],[28,7610],{"className":7611,"style":302},[279],[28,7613,83],{"className":7614},[306],[28,7616],{"className":7617,"style":302},[279],[28,7619,7621,7624],{"className":7620},[265],[28,7622],{"className":7623,"style":316},[269],[28,7625,251],{"className":7626},[274],"」，SMT 不需要把 ",[28,7629,7631,7648],{"className":7630,"translate":193},[197],[28,7632,7634],{"className":7633},[201],[203,7635,7636],{"xmlns":205},[208,7637,7638,7646],{},[211,7639,7640,7642,7644],{},[214,7641,176],{},[217,7643,1683],{"separator":261},[214,7645,180],{},[253,7647,3226],{"encoding":255},[28,7649,7651],{"className":7650,"ariaHidden":261},[260],[28,7652,7654,7657,7660,7663,7666],{"className":7653},[265],[28,7655],{"className":7656,"style":612},[269],[28,7658,176],{"className":7659},[274,275],[28,7661,1683],{"className":7662},[1723],[28,7664],{"className":7665,"style":530},[279],[28,7667,180],{"className":7668,"style":298},[274,275]," 拆成 64 个布尔变量，也不需要把数组展开成 100 个元素。它把这两个条件原样保留为两个理论原子，交给对应的求解器。",[11,7671,7672],{},"关键在于「按需展开」：",[2480,7674,7675,7681,7687],{},[2483,7676,7677,7680],{},[183,7678,7679],{},"算术","：直接用单纯形法或分支定界，在整数\u002F实数域上推理，完全不经过布尔编码。",[2483,7682,7683,7686],{},[183,7684,7685],{},"数组","：用 read-over-write 公理，只在公式里真的出现某个下标时才实例化。",[2483,7688,7689,7692,7693,7696,7697,177,7769,7842],{},[183,7690,7691],{},"位向量","：这一条要诚实一点——大多数求解器内部",[183,7694,7695],{},"仍然会做位爆破","，因为位级编码对硬件电路太有效了。但这件事发生在求解器内部，只针对相关子表达式，而且会配合字级重写（比如 ",[28,7698,7700,7727],{"className":7699,"translate":193},[197],[28,7701,7703],{"className":7702},[201],[203,7704,7705],{"xmlns":205},[208,7706,7707,7724],{},[211,7708,7709,7711,7713,7716,7718,7720,7722],{},[214,7710,176],{},[228,7712,488],{},[214,7714,7715],{"mathvariant":484},"&",[228,7717,488],{},[224,7719,89],{},[217,7721,83],{},[224,7723,89],{},[253,7725,7726],{"encoding":255},"x \\,\\&\\, 0 = 0",[28,7728,7730,7760],{"className":7729,"ariaHidden":261},[260],[28,7731,7733,7736,7739,7742,7745,7748,7751,7754,7757],{"className":7732},[265],[28,7734],{"className":7735,"style":7448},[269],[28,7737,176],{"className":7738},[274,275],[28,7740],{"className":7741,"style":530},[279],[28,7743,7715],{"className":7744},[274],[28,7746],{"className":7747,"style":530},[279],[28,7749,89],{"className":7750},[274],[28,7752],{"className":7753,"style":302},[279],[28,7755,83],{"className":7756},[306],[28,7758],{"className":7759,"style":302},[279],[28,7761,7763,7766],{"className":7762},[265],[28,7764],{"className":7765,"style":316},[269],[28,7767,89],{"className":7768},[274],[28,7770,7772,7794],{"className":7771,"translate":193},[197],[28,7773,7775],{"className":7774},[201],[203,7776,7777],{"xmlns":205},[208,7778,7779,7791],{},[211,7780,7781,7783,7785,7787,7789],{},[214,7782,176],{},[217,7784,5074],{},[214,7786,176],{},[217,7788,83],{},[224,7790,89],{},[253,7792,7793],{"encoding":255},"x - x = 0",[28,7795,7797,7815,7833],{"className":7796,"ariaHidden":261},[260],[28,7798,7800,7803,7806,7809,7812],{"className":7799},[265],[28,7801],{"className":7802,"style":270},[269],[28,7804,176],{"className":7805},[274,275],[28,7807],{"className":7808,"style":280},[279],[28,7810,5074],{"className":7811},[284],[28,7813],{"className":7814,"style":280},[279],[28,7816,7818,7821,7824,7827,7830],{"className":7817},[265],[28,7819],{"className":7820,"style":645},[269],[28,7822,176],{"className":7823},[274,275],[28,7825],{"className":7826,"style":302},[279],[28,7828,83],{"className":7829},[306],[28,7831],{"className":7832,"style":302},[279],[28,7834,7836,7839],{"className":7835},[265],[28,7837],{"className":7838,"style":316},[269],[28,7840,89],{"className":7841},[274],"）和等价类合并。对使用者来说，它仍然是透明的。",[11,7844,7845],{},"数组的 read-over-write 公理长这样：",[28,7847,7849],{"className":7848,"translate":193},[192],[28,7850,7852,7994],{"className":7851,"translate":193},[197],[28,7853,7855],{"className":7854},[201],[203,7856,7857],{"xmlns":205,"display":206},[208,7858,7859,7991],{},[211,7860,7861,7875,7877,7889,7891,7893,7895,7897,7899,7901,7903,7905,7908,7910,7912],{},[211,7862,7863,7865,7867,7869,7871,7873],{},[214,7864,1664],{"mathvariant":484},[214,7866,1667],{"mathvariant":484},[214,7868,1670],{"mathvariant":484},[214,7870,1667],{"mathvariant":484},[214,7872,22],{"mathvariant":484},[214,7874,1241],{"mathvariant":484},[217,7876,43],{"fence":261,"stretchy":261,"minsize":1810,"maxsize":1810},[211,7878,7879,7881,7883,7885,7887],{},[214,7880,1664],{"mathvariant":484},[214,7882,1241],{"mathvariant":484},[214,7884,3933],{"mathvariant":484},[214,7886,1867],{"mathvariant":484},[214,7888,1667],{"mathvariant":484},[217,7890,43],{"stretchy":241},[214,7892,238],{},[217,7894,1683],{"separator":261},[214,7896,1686],{},[217,7898,1683],{"separator":261},[214,7900,1693],{},[217,7902,1522],{"stretchy":241},[217,7904,1683],{"separator":261},[214,7906,7907],{},"j",[217,7909,1522],{"fence":261,"stretchy":261,"minsize":1810,"maxsize":1810},[217,7911,83],{},[211,7913,7914,7917],{},[217,7915,7916],{"fence":261},"{",[5015,7918,7921,7945],{"rowspacing":7919,"columnalign":7920,"columnspacing":497},"0.36em","left left",[5021,7922,7923,7933],{},[5024,7924,7925],{},[5027,7926,7927],{"scriptlevel":89,"displaystyle":241},[211,7928,7929,7931],{},[214,7930,1693],{},[217,7932,1683],{"separator":261},[5024,7934,7935],{},[5027,7936,7937],{"scriptlevel":89,"displaystyle":241},[211,7938,7939,7941,7943],{},[214,7940,1686],{},[217,7942,83],{},[214,7944,7907],{},[5021,7946,7947,7979],{},[5024,7948,7949],{},[5027,7950,7951],{"scriptlevel":89,"displaystyle":241},[211,7952,7953,7967,7969,7971,7973,7975,7977],{},[211,7954,7955,7957,7959,7961,7963,7965],{},[214,7956,1664],{"mathvariant":484},[214,7958,1667],{"mathvariant":484},[214,7960,1670],{"mathvariant":484},[214,7962,1667],{"mathvariant":484},[214,7964,22],{"mathvariant":484},[214,7966,1241],{"mathvariant":484},[217,7968,43],{"stretchy":241},[214,7970,238],{},[217,7972,1683],{"separator":261},[214,7974,7907],{},[217,7976,1522],{"stretchy":241},[217,7978,1683],{"separator":261},[5024,7980,7981],{},[5027,7982,7983],{"scriptlevel":89,"displaystyle":241},[211,7984,7985,7987,7989],{},[214,7986,1686],{},[217,7988,1854],{"mathvariant":484},[214,7990,7907],{},[253,7992,7993],{"encoding":255},"\\mathrm{select}\\bigl(\\mathrm{store}(a, i, v), j\\bigr) =\n\\begin{cases}\nv, & i = j \\\\\n\\mathrm{select}(a, j), & i \\ne j\n\\end{cases}",[28,7995,7997,8073],{"className":7996,"ariaHidden":261},[260],[28,7998,8000,8003,8009,8015,8021,8024,8027,8030,8033,8036,8039,8042,8045,8048,8051,8054,8058,8064,8067,8070],{"className":7999},[265],[28,8001],{"className":8002,"style":2469},[269],[28,8004,8006],{"className":8005},[274],[28,8007,1713],{"className":8008},[274,1712],[28,8010,8012],{"className":8011},[348],[28,8013,43],{"className":8014},[2169,2170],[28,8016,8018],{"className":8017},[274],[28,8019,2696],{"className":8020},[274,1712],[28,8022,43],{"className":8023},[348],[28,8025,238],{"className":8026},[274,275],[28,8028,1683],{"className":8029},[1723],[28,8031],{"className":8032,"style":530},[279],[28,8034,1686],{"className":8035},[274,275],[28,8037,1683],{"className":8038},[1723],[28,8040],{"className":8041,"style":530},[279],[28,8043,1693],{"className":8044,"style":298},[274,275],[28,8046,1522],{"className":8047},[355],[28,8049,1683],{"className":8050},[1723],[28,8052],{"className":8053,"style":530},[279],[28,8055,7907],{"className":8056,"style":8057},[274,275],"margin-right:0.0572em;",[28,8059,8061],{"className":8060},[355],[28,8062,1522],{"className":8063},[2169,2170],[28,8065],{"className":8066,"style":302},[279],[28,8068,83],{"className":8069},[306],[28,8071],{"className":8072,"style":302},[279],[28,8074,8076,8080],{"className":8075},[265],[28,8077],{"className":8078,"style":8079},[269],"height:3em;vertical-align:-1.25em;",[28,8081,8083,8092,8282],{"className":8082},[1897],[28,8084,8088],{"className":8085,"style":8087},[348,8086],"delimcenter","top:0em;",[28,8089,7916],{"className":8090},[2169,8091],"size4",[28,8093,8095],{"className":8094},[274],[28,8096,8098,8175,8180],{"className":8097},[5015],[28,8099,8101],{"className":8100},[5205],[28,8102,8104,8166],{"className":8103},[560,561],[28,8105,8107,8163],{"className":8106},[565],[28,8108,8111,8127],{"className":8109,"style":8110},[569],"height:1.69em;",[28,8112,8114,8118],{"style":8113},"top:-3.69em;",[28,8115],{"className":8116,"style":8117},[577],"height:3.008em;",[28,8119,8121,8124],{"className":8120},[274],[28,8122,1693],{"className":8123,"style":298},[274,275],[28,8125,1683],{"className":8126},[1723],[28,8128,8130,8133],{"style":8129},"top:-2.25em;",[28,8131],{"className":8132,"style":8117},[577],[28,8134,8136,8142,8145,8148,8151,8154,8157,8160],{"className":8135},[274],[28,8137,8139],{"className":8138},[274],[28,8140,1713],{"className":8141},[274,1712],[28,8143,43],{"className":8144},[348],[28,8146,238],{"className":8147},[274,275],[28,8149,1683],{"className":8150},[1723],[28,8152],{"className":8153,"style":530},[279],[28,8155,7907],{"className":8156,"style":8057},[274,275],[28,8158,1522],{"className":8159},[355],[28,8161,1683],{"className":8162},[1723],[28,8164,593],{"className":8165},[592],[28,8167,8169],{"className":8168},[565],[28,8170,8173],{"className":8171,"style":8172},[569],"height:1.19em;",[28,8174],{},[28,8176],{"className":8177,"style":8179},[8178],"arraycolsep","width:1em;",[28,8181,8183],{"className":8182},[5205],[28,8184,8186,8274],{"className":8185},[560,561],[28,8187,8189,8271],{"className":8188},[565],[28,8190,8192,8215],{"className":8191,"style":8110},[569],[28,8193,8194,8197],{"style":8113},[28,8195],{"className":8196,"style":8117},[577],[28,8198,8200,8203,8206,8209,8212],{"className":8199},[274],[28,8201,1686],{"className":8202},[274,275],[28,8204],{"className":8205,"style":302},[279],[28,8207,83],{"className":8208},[306],[28,8210],{"className":8211,"style":302},[279],[28,8213,7907],{"className":8214,"style":8057},[274,275],[28,8216,8217,8220],{"style":8129},[28,8218],{"className":8219,"style":8117},[577],[28,8221,8223,8226,8229,8265,8268],{"className":8222},[274],[28,8224,1686],{"className":8225},[274,275],[28,8227],{"className":8228,"style":302},[279],[28,8230,8232,8259,8262],{"className":8231},[306],[28,8233,8235],{"className":8234},[306],[28,8236,8238],{"className":8237},[274,2359],[28,8239,8241],{"className":8240},[2363],[28,8242,8244,8247,8256],{"className":8243},[2367],[28,8245],{"className":8246,"style":2371},[269],[28,8248,8250],{"className":8249},[2375],[28,8251,8253],{"className":8252},[274],[28,8254,2382],{"className":8255},[306],[28,8257],{"className":8258},[2386],[28,8260],{"className":8261},[279,2390],[28,8263,83],{"className":8264},[306],[28,8266],{"className":8267,"style":302},[279],[28,8269,7907],{"className":8270,"style":8057},[274,275],[28,8272,593],{"className":8273},[592],[28,8275,8277],{"className":8276},[565],[28,8278,8280],{"className":8279,"style":8172},[569],[28,8281],{},[28,8283],{"className":8284},[355,8285],"nulldelimiter",[11,8287,8288,8289,8333,8334,8385],{},"如果公式里只关心 ",[28,8290,8292,8312],{"className":8291,"translate":193},[197],[28,8293,8295],{"className":8294},[201],[203,8296,8297],{"xmlns":205},[208,8298,8299,8309],{},[211,8300,8301,8303,8305,8307],{},[214,8302,238],{},[217,8304,73],{"stretchy":241},[224,8306,89],{},[217,8308,246],{"stretchy":241},[253,8310,8311],{"encoding":255},"a[0]",[28,8313,8315],{"className":8314,"ariaHidden":261},[260],[28,8316,8318,8321,8324,8327,8330],{"className":8317},[265],[28,8319],{"className":8320,"style":341},[269],[28,8322,238],{"className":8323},[274,275],[28,8325,73],{"className":8326},[348],[28,8328,89],{"className":8329},[274],[28,8331,246],{"className":8332},[355],"，求解器就只实例化 ",[28,8335,8337,8355],{"className":8336,"translate":193},[197],[28,8338,8340],{"className":8339},[201],[203,8341,8342],{"xmlns":205},[208,8343,8344,8352],{},[211,8345,8346,8348,8350],{},[214,8347,1686],{},[217,8349,83],{},[224,8351,89],{},[253,8353,8354],{"encoding":255},"i = 0",[28,8356,8358,8376],{"className":8357,"ariaHidden":261},[260],[28,8359,8361,8364,8367,8370,8373],{"className":8360},[265],[28,8362],{"className":8363,"style":7348},[269],[28,8365,1686],{"className":8366},[274,275],[28,8368],{"className":8369,"style":302},[279],[28,8371,83],{"className":8372},[306],[28,8374],{"className":8375,"style":302},[279],[28,8377,8379,8382],{"className":8378},[265],[28,8380],{"className":8381,"style":316},[269],[28,8383,89],{"className":8384},[274]," 这一条，剩下的 99 个元素根本不会出现。这是「按需」和「全局」的区别，也是 SMT 能在数组上跑赢位爆破的原因。",[11,8387,8388,8389,8392],{},"所以更准确的说法不是「SMT 消灭了底层编码」，而是：",[183,8390,8391],{},"SMT 把「怎么编码」的决定权从用户手里交给了求解器","。求解器可以根据理论特性选择最合适的内部表示，而不是让用户先做一次不可逆的全局展开。",[11,8394,8395,8396,8437,8438,2923],{},"用同一个约束对比一下。纯 SAT 的版本要生成数百到上千个布尔变量、上千条子句；SMT 的版本只保留两个理论原子。SAT 只能做布尔剪枝，SMT 能利用算术和数组的语义；SAT 的答案是一组布尔赋值，还要反解出 ",[28,8397,8399,8416],{"className":8398,"translate":193},[197],[28,8400,8402],{"className":8401},[201],[203,8403,8404],{"xmlns":205},[208,8405,8406,8414],{},[211,8407,8408,8410,8412],{},[214,8409,176],{},[217,8411,1683],{"separator":261},[214,8413,180],{},[253,8415,3226],{"encoding":255},[28,8417,8419],{"className":8418,"ariaHidden":261},[260],[28,8420,8422,8425,8428,8431,8434],{"className":8421},[265],[28,8423],{"className":8424,"style":612},[269],[28,8426,176],{"className":8427},[274,275],[28,8429,1683],{"className":8430},[1723],[28,8432],{"className":8433,"style":530},[279],[28,8435,180],{"className":8436,"style":298},[274,275],"，SMT 直接给出 ",[28,8439,8441,8467],{"className":8440,"translate":193},[197],[28,8442,8444],{"className":8443},[201],[203,8445,8446],{"xmlns":205},[208,8447,8448,8465],{},[211,8449,8450,8452,8454,8457,8459,8461,8463],{},[214,8451,176],{},[217,8453,83],{},[224,8455,8456],{},"6",[217,8458,1683],{"separator":261},[214,8460,180],{},[217,8462,83],{},[224,8464,251],{},[253,8466,398],{"encoding":255},[28,8468,8470,8488,8516],{"className":8469,"ariaHidden":261},[260],[28,8471,8473,8476,8479,8482,8485],{"className":8472},[265],[28,8474],{"className":8475,"style":645},[269],[28,8477,176],{"className":8478},[274,275],[28,8480],{"className":8481,"style":302},[279],[28,8483,83],{"className":8484},[306],[28,8486],{"className":8487,"style":302},[279],[28,8489,8491,8495,8498,8501,8504,8507,8510,8513],{"className":8490},[265],[28,8492],{"className":8493,"style":8494},[269],"height:0.8389em;vertical-align:-0.1944em;",[28,8496,8456],{"className":8497},[274],[28,8499,1683],{"className":8500},[1723],[28,8502],{"className":8503,"style":530},[279],[28,8505,180],{"className":8506,"style":298},[274,275],[28,8508],{"className":8509,"style":302},[279],[28,8511,83],{"className":8512},[306],[28,8514],{"className":8515,"style":302},[279],[28,8517,8519,8522],{"className":8518},[265],[28,8520],{"className":8521,"style":316},[269],[28,8523,251],{"className":8524},[274],[419,8526,8528],{"id":8527},"_33-组合理论","3.3 组合理论",[11,8530,8531,8532,2923],{},"第三个策略是",[183,8533,8534],{},"让不同理论通过共享等式来协作",[11,8536,8537,8538,8541],{},"最经典的方法是 Nelson–Oppen 组合。它的前提是：两个理论的签名不相交（各自管各自的符号），并且都满足「稳定无限」性质（任何可满足的公式都有无穷模型）。在这个前提下，两个理论只需要交换",[183,8539,8540],{},"变量之间的等式","，就能组合成一个完整的判定过程。",[11,8543,8544],{},"看一个例子：",[28,8546,8548],{"className":8547,"translate":193},[192],[28,8549,8551,8592],{"className":8550,"translate":193},[197],[28,8552,8554],{"className":8553},[201],[203,8555,8556],{"xmlns":205,"display":206},[208,8557,8558,8590],{},[211,8559,8560,8562,8564,8566,8568,8570,8572,8574,8576,8578,8580,8582,8584,8586,8588],{},[214,8561,176],{},[217,8563,83],{},[214,8565,180],{},[228,8567,230],{},[217,8569,233],{},[228,8571,230],{},[214,8573,1511],{},[217,8575,43],{"stretchy":241},[214,8577,176],{},[217,8579,1522],{"stretchy":241},[217,8581,1854],{"mathvariant":484},[214,8583,1511],{},[217,8585,43],{"stretchy":241},[214,8587,180],{},[217,8589,1522],{"stretchy":241},[253,8591,5641],{"encoding":255},[28,8593,8595,8613,8637,8697],{"className":8594,"ariaHidden":261},[260],[28,8596,8598,8601,8604,8607,8610],{"className":8597},[265],[28,8599],{"className":8600,"style":645},[269],[28,8602,176],{"className":8603},[274,275],[28,8605],{"className":8606,"style":302},[279],[28,8608,83],{"className":8609},[306],[28,8611],{"className":8612,"style":302},[279],[28,8614,8616,8619,8622,8625,8628,8631,8634],{"className":8615},[265],[28,8617],{"className":8618,"style":1083},[269],[28,8620,180],{"className":8621,"style":298},[274,275],[28,8623],{"className":8624,"style":302},[279],[28,8626],{"className":8627,"style":280},[279],[28,8629,233],{"className":8630},[284],[28,8632],{"className":8633,"style":302},[279],[28,8635],{"className":8636,"style":280},[279],[28,8638,8640,8643,8646,8649,8652,8655,8658,8694],{"className":8639},[265],[28,8641],{"className":8642,"style":341},[269],[28,8644,1511],{"className":8645,"style":1546},[274,275],[28,8647,43],{"className":8648},[348],[28,8650,176],{"className":8651},[274,275],[28,8653,1522],{"className":8654},[355],[28,8656],{"className":8657,"style":302},[279],[28,8659,8661,8688,8691],{"className":8660},[306],[28,8662,8664],{"className":8663},[306],[28,8665,8667],{"className":8666},[274,2359],[28,8668,8670],{"className":8669},[2363],[28,8671,8673,8676,8685],{"className":8672},[2367],[28,8674],{"className":8675,"style":2371},[269],[28,8677,8679],{"className":8678},[2375],[28,8680,8682],{"className":8681},[274],[28,8683,2382],{"className":8684},[306],[28,8686],{"className":8687},[2386],[28,8689],{"className":8690},[279,2390],[28,8692,83],{"className":8693},[306],[28,8695],{"className":8696,"style":302},[279],[28,8698,8700,8703,8706,8709,8712],{"className":8699},[265],[28,8701],{"className":8702,"style":341},[269],[28,8704,1511],{"className":8705,"style":1546},[274,275],[28,8707,43],{"className":8708},[348],[28,8710,180],{"className":8711,"style":298},[274,275],[28,8713,1522],{"className":8714},[355],[2480,8716,8717,8771,8912],{},[2483,8718,8719,8720,8770],{},"算术部分看到 ",[28,8721,8723,8740],{"className":8722,"translate":193},[197],[28,8724,8726],{"className":8725},[201],[203,8727,8728],{"xmlns":205},[208,8729,8730,8738],{},[211,8731,8732,8734,8736],{},[214,8733,176],{},[217,8735,83],{},[214,8737,180],{},[253,8739,5793],{"encoding":255},[28,8741,8743,8761],{"className":8742,"ariaHidden":261},[260],[28,8744,8746,8749,8752,8755,8758],{"className":8745},[265],[28,8747],{"className":8748,"style":645},[269],[28,8750,176],{"className":8751},[274,275],[28,8753],{"className":8754,"style":302},[279],[28,8756,83],{"className":8757},[306],[28,8759],{"className":8760,"style":302},[279],[28,8762,8764,8767],{"className":8763},[265],[28,8765],{"className":8766,"style":612},[269],[28,8768,180],{"className":8769,"style":298},[274,275],"，本身没有矛盾；",[2483,8772,8773,8774,8824,8825,2693,8868,8911],{},"EUF 部分如果不知道 ",[28,8775,8777,8794],{"className":8776,"translate":193},[197],[28,8778,8780],{"className":8779},[201],[203,8781,8782],{"xmlns":205},[208,8783,8784,8792],{},[211,8785,8786,8788,8790],{},[214,8787,176],{},[217,8789,83],{},[214,8791,180],{},[253,8793,5793],{"encoding":255},[28,8795,8797,8815],{"className":8796,"ariaHidden":261},[260],[28,8798,8800,8803,8806,8809,8812],{"className":8799},[265],[28,8801],{"className":8802,"style":645},[269],[28,8804,176],{"className":8805},[274,275],[28,8807],{"className":8808,"style":302},[279],[28,8810,83],{"className":8811},[306],[28,8813],{"className":8814,"style":302},[279],[28,8816,8818,8821],{"className":8817},[265],[28,8819],{"className":8820,"style":612},[269],[28,8822,180],{"className":8823,"style":298},[274,275],"，就会认为 ",[28,8826,8828,8847],{"className":8827,"translate":193},[197],[28,8829,8831],{"className":8830},[201],[203,8832,8833],{"xmlns":205},[208,8834,8835,8845],{},[211,8836,8837,8839,8841,8843],{},[214,8838,1511],{},[217,8840,43],{"stretchy":241},[214,8842,176],{},[217,8844,1522],{"stretchy":241},[253,8846,6272],{"encoding":255},[28,8848,8850],{"className":8849,"ariaHidden":261},[260],[28,8851,8853,8856,8859,8862,8865],{"className":8852},[265],[28,8854],{"className":8855,"style":341},[269],[28,8857,1511],{"className":8858,"style":1546},[274,275],[28,8860,43],{"className":8861},[348],[28,8863,176],{"className":8864},[274,275],[28,8866,1522],{"className":8867},[355],[28,8869,8871,8890],{"className":8870,"translate":193},[197],[28,8872,8874],{"className":8873},[201],[203,8875,8876],{"xmlns":205},[208,8877,8878,8888],{},[211,8879,8880,8882,8884,8886],{},[214,8881,1511],{},[217,8883,43],{"stretchy":241},[214,8885,180],{},[217,8887,1522],{"stretchy":241},[253,8889,6317],{"encoding":255},[28,8891,8893],{"className":8892,"ariaHidden":261},[260],[28,8894,8896,8899,8902,8905,8908],{"className":8895},[265],[28,8897],{"className":8898,"style":341},[269],[28,8900,1511],{"className":8901,"style":1546},[274,275],[28,8903,43],{"className":8904},[348],[28,8906,180],{"className":8907,"style":298},[274,275],[28,8909,1522],{"className":8910},[355]," 可以不同，也不会报错；",[2483,8913,8914,8915,8965,8966,6339,9046,9159],{},"一旦算术把等式 ",[28,8916,8918,8935],{"className":8917,"translate":193},[197],[28,8919,8921],{"className":8920},[201],[203,8922,8923],{"xmlns":205},[208,8924,8925,8933],{},[211,8926,8927,8929,8931],{},[214,8928,176],{},[217,8930,83],{},[214,8932,180],{},[253,8934,5793],{"encoding":255},[28,8936,8938,8956],{"className":8937,"ariaHidden":261},[260],[28,8939,8941,8944,8947,8950,8953],{"className":8940},[265],[28,8942],{"className":8943,"style":645},[269],[28,8945,176],{"className":8946},[274,275],[28,8948],{"className":8949,"style":302},[279],[28,8951,83],{"className":8952},[306],[28,8954],{"className":8955,"style":302},[279],[28,8957,8959,8962],{"className":8958},[265],[28,8960],{"className":8961,"style":612},[269],[28,8963,180],{"className":8964,"style":298},[274,275]," 传给 EUF，EUF 立刻推出 ",[28,8967,8969,8998],{"className":8968,"translate":193},[197],[28,8970,8972],{"className":8971},[201],[203,8973,8974],{"xmlns":205},[208,8975,8976,8996],{},[211,8977,8978,8980,8982,8984,8986,8988,8990,8992,8994],{},[214,8979,1511],{},[217,8981,43],{"stretchy":241},[214,8983,176],{},[217,8985,1522],{"stretchy":241},[217,8987,83],{},[214,8989,1511],{},[217,8991,43],{"stretchy":241},[214,8993,180],{},[217,8995,1522],{"stretchy":241},[253,8997,6543],{"encoding":255},[28,8999,9001,9028],{"className":9000,"ariaHidden":261},[260],[28,9002,9004,9007,9010,9013,9016,9019,9022,9025],{"className":9003},[265],[28,9005],{"className":9006,"style":341},[269],[28,9008,1511],{"className":9009,"style":1546},[274,275],[28,9011,43],{"className":9012},[348],[28,9014,176],{"className":9015},[274,275],[28,9017,1522],{"className":9018},[355],[28,9020],{"className":9021,"style":302},[279],[28,9023,83],{"className":9024},[306],[28,9026],{"className":9027,"style":302},[279],[28,9029,9031,9034,9037,9040,9043],{"className":9030},[265],[28,9032],{"className":9033,"style":341},[269],[28,9035,1511],{"className":9036,"style":1546},[274,275],[28,9038,43],{"className":9039},[348],[28,9041,180],{"className":9042,"style":298},[274,275],[28,9044,1522],{"className":9045},[355],[28,9047,9049,9078],{"className":9048,"translate":193},[197],[28,9050,9052],{"className":9051},[201],[203,9053,9054],{"xmlns":205},[208,9055,9056,9076],{},[211,9057,9058,9060,9062,9064,9066,9068,9070,9072,9074],{},[214,9059,1511],{},[217,9061,43],{"stretchy":241},[214,9063,176],{},[217,9065,1522],{"stretchy":241},[217,9067,1854],{"mathvariant":484},[214,9069,1511],{},[217,9071,43],{"stretchy":241},[214,9073,180],{},[217,9075,1522],{"stretchy":241},[253,9077,2732],{"encoding":255},[28,9079,9081,9141],{"className":9080,"ariaHidden":261},[260],[28,9082,9084,9087,9090,9093,9096,9099,9102,9138],{"className":9083},[265],[28,9085],{"className":9086,"style":341},[269],[28,9088,1511],{"className":9089,"style":1546},[274,275],[28,9091,43],{"className":9092},[348],[28,9094,176],{"className":9095},[274,275],[28,9097,1522],{"className":9098},[355],[28,9100],{"className":9101,"style":302},[279],[28,9103,9105,9132,9135],{"className":9104},[306],[28,9106,9108],{"className":9107},[306],[28,9109,9111],{"className":9110},[274,2359],[28,9112,9114],{"className":9113},[2363],[28,9115,9117,9120,9129],{"className":9116},[2367],[28,9118],{"className":9119,"style":2371},[269],[28,9121,9123],{"className":9122},[2375],[28,9124,9126],{"className":9125},[274],[28,9127,2382],{"className":9128},[306],[28,9130],{"className":9131},[2386],[28,9133],{"className":9134},[279,2390],[28,9136,83],{"className":9137},[306],[28,9139],{"className":9140,"style":302},[279],[28,9142,9144,9147,9150,9153,9156],{"className":9143},[265],[28,9145],{"className":9146,"style":341},[269],[28,9148,1511],{"className":9149,"style":1546},[274,275],[28,9151,43],{"className":9152},[348],[28,9154,180],{"className":9155,"style":298},[274,275],[28,9157,1522],{"className":9158},[355]," 冲突。",[11,9161,9162],{},"于是整个公式被判为不可满足。这个结论不是某一个理论单独得出的，而是两个理论「对了一下账」才对出来的。",[11,9164,9165],{},"再看一个反方向的例子：",[28,9167,9169],{"className":9168,"translate":193},[192],[28,9170,9172,9219],{"className":9171,"translate":193},[197],[28,9173,9175],{"className":9174},[201],[203,9176,9177],{"xmlns":205,"display":206},[208,9178,9179,9216],{},[211,9180,9181,9183,9185,9187,9189,9191,9193,9195,9197,9199,9201,9203,9205,9207,9209,9211,9213],{},[214,9182,176],{},[217,9184,124],{},[214,9186,180],{},[217,9188,130],{},[224,9190,226],{},[228,9192,230],{},[217,9194,233],{},[228,9196,230],{},[214,9198,176],{},[217,9200,83],{},[224,9202,3400],{},[228,9204,230],{},[217,9206,233],{},[228,9208,230],{},[214,9210,180],{},[217,9212,83],{},[224,9214,9215],{},"4",[253,9217,9218],{"encoding":255},"x + y > 10 \\;\\wedge\\; x = 3 \\;\\wedge\\; y = 4",[28,9220,9222,9240,9258,9282,9300,9324,9342],{"className":9221,"ariaHidden":261},[260],[28,9223,9225,9228,9231,9234,9237],{"className":9224},[265],[28,9226],{"className":9227,"style":270},[269],[28,9229,176],{"className":9230},[274,275],[28,9232],{"className":9233,"style":280},[279],[28,9235,124],{"className":9236},[284],[28,9238],{"className":9239,"style":280},[279],[28,9241,9243,9246,9249,9252,9255],{"className":9242},[265],[28,9244],{"className":9245,"style":294},[269],[28,9247,180],{"className":9248,"style":298},[274,275],[28,9250],{"className":9251,"style":302},[279],[28,9253,130],{"className":9254},[306],[28,9256],{"className":9257,"style":302},[279],[28,9259,9261,9264,9267,9270,9273,9276,9279],{"className":9260},[265],[28,9262],{"className":9263,"style":316},[269],[28,9265,226],{"className":9266},[274],[28,9268],{"className":9269,"style":302},[279],[28,9271],{"className":9272,"style":280},[279],[28,9274,233],{"className":9275},[284],[28,9277],{"className":9278,"style":302},[279],[28,9280],{"className":9281,"style":280},[279],[28,9283,9285,9288,9291,9294,9297],{"className":9284},[265],[28,9286],{"className":9287,"style":645},[269],[28,9289,176],{"className":9290},[274,275],[28,9292],{"className":9293,"style":302},[279],[28,9295,83],{"className":9296},[306],[28,9298],{"className":9299,"style":302},[279],[28,9301,9303,9306,9309,9312,9315,9318,9321],{"className":9302},[265],[28,9304],{"className":9305,"style":316},[269],[28,9307,3400],{"className":9308},[274],[28,9310],{"className":9311,"style":302},[279],[28,9313],{"className":9314,"style":280},[279],[28,9316,233],{"className":9317},[284],[28,9319],{"className":9320,"style":302},[279],[28,9322],{"className":9323,"style":280},[279],[28,9325,9327,9330,9333,9336,9339],{"className":9326},[265],[28,9328],{"className":9329,"style":612},[269],[28,9331,180],{"className":9332,"style":298},[274,275],[28,9334],{"className":9335,"style":302},[279],[28,9337,83],{"className":9338},[306],[28,9340],{"className":9341,"style":302},[279],[28,9343,9345,9348],{"className":9344},[265],[28,9346],{"className":9347,"style":316},[269],[28,9349,9215],{"className":9350},[274],[11,9352,9353,9354,9451],{},"这里算术部分自己就能算出 ",[28,9355,9357,9384],{"className":9356,"translate":193},[197],[28,9358,9360],{"className":9359},[201],[203,9361,9362],{"xmlns":205},[208,9363,9364,9381],{},[211,9365,9366,9368,9370,9372,9374,9377,9379],{},[224,9367,3400],{},[217,9369,124],{},[224,9371,9215],{},[217,9373,83],{},[224,9375,9376],{},"7",[217,9378,1383],{},[224,9380,226],{},[253,9382,9383],{"encoding":255},"3 + 4 = 7 \u003C 10",[28,9385,9387,9405,9423,9442],{"className":9386,"ariaHidden":261},[260],[28,9388,9390,9393,9396,9399,9402],{"className":9389},[265],[28,9391],{"className":9392,"style":6853},[269],[28,9394,3400],{"className":9395},[274],[28,9397],{"className":9398,"style":280},[279],[28,9400,124],{"className":9401},[284],[28,9403],{"className":9404,"style":280},[279],[28,9406,9408,9411,9414,9417,9420],{"className":9407},[265],[28,9409],{"className":9410,"style":316},[269],[28,9412,9215],{"className":9413},[274],[28,9415],{"className":9416,"style":302},[279],[28,9418,83],{"className":9419},[306],[28,9421],{"className":9422,"style":302},[279],[28,9424,9426,9430,9433,9436,9439],{"className":9425},[265],[28,9427],{"className":9428,"style":9429},[269],"height:0.6835em;vertical-align:-0.0391em;",[28,9431,9376],{"className":9432},[274],[28,9434],{"className":9435,"style":302},[279],[28,9437,1383],{"className":9438},[306],[28,9440],{"className":9441,"style":302},[279],[28,9443,9445,9448],{"className":9444},[265],[28,9446],{"className":9447,"style":316},[269],[28,9449,226],{"className":9450},[274],"，直接判 unsat，根本不需要 EUF 参与。",[11,9453,9454,9455],{},"现代求解器（Z3、cvc5 等）通常不严格照搬经典 Nelson–Oppen，而是在 DPLL(T) 框架下做「理论传播 + 冲突解释」。但核心思想没变：",[183,9456,9457],{},"每个理论只懂自己那一摊，通过交换少量关键事实来达成全局一致。",[11,9459,9460,9461,9545,9546,9647],{},"有一个细节值得注意：如果理论是「非凸」的，光交换等式还不够。比如在整数算术里，",[28,9462,9464,9482],{"className":9463,"translate":193},[197],[28,9465,9467],{"className":9466},[201],[203,9468,9469],{"xmlns":205},[208,9470,9471,9479],{},[211,9472,9473,9475,9477],{},[214,9474,176],{},[217,9476,1854],{"mathvariant":484},[224,9478,89],{},[253,9480,9481],{"encoding":255},"x \\ne 0",[28,9483,9485,9536],{"className":9484,"ariaHidden":261},[260],[28,9486,9488,9491,9494,9497,9533],{"className":9487},[265],[28,9489],{"className":9490,"style":2371},[269],[28,9492,176],{"className":9493},[274,275],[28,9495],{"className":9496,"style":302},[279],[28,9498,9500,9527,9530],{"className":9499},[306],[28,9501,9503],{"className":9502},[306],[28,9504,9506],{"className":9505},[274,2359],[28,9507,9509],{"className":9508},[2363],[28,9510,9512,9515,9524],{"className":9511},[2367],[28,9513],{"className":9514,"style":2371},[269],[28,9516,9518],{"className":9517},[2375],[28,9519,9521],{"className":9520},[274],[28,9522,2382],{"className":9523},[306],[28,9525],{"className":9526},[2386],[28,9528],{"className":9529},[279,2390],[28,9531,83],{"className":9532},[306],[28,9534],{"className":9535,"style":302},[279],[28,9537,9539,9542],{"className":9538},[265],[28,9540],{"className":9541,"style":316},[269],[28,9543,89],{"className":9544},[274]," 等价于 ",[28,9547,9549,9578],{"className":9548,"translate":193},[197],[28,9550,9552],{"className":9551},[201],[203,9553,9554],{"xmlns":205},[208,9555,9556,9575],{},[211,9557,9558,9560,9562,9564,9566,9568,9570,9573],{},[214,9559,176],{},[217,9561,1876],{},[217,9563,5074],{},[224,9565,1244],{},[217,9567,937],{},[214,9569,176],{},[217,9571,9572],{},"≥",[224,9574,1244],{},[253,9576,9577],{"encoding":255},"x \\le -1 \\vee x \\ge 1",[28,9579,9581,9599,9620,9638],{"className":9580,"ariaHidden":261},[260],[28,9582,9584,9587,9590,9593,9596],{"className":9583},[265],[28,9585],{"className":9586,"style":3010},[269],[28,9588,176],{"className":9589},[274,275],[28,9591],{"className":9592,"style":302},[279],[28,9594,1876],{"className":9595},[306],[28,9597],{"className":9598,"style":302},[279],[28,9600,9602,9605,9608,9611,9614,9617],{"className":9601},[265],[28,9603],{"className":9604,"style":6853},[269],[28,9606,5074],{"className":9607},[274],[28,9609,1244],{"className":9610},[274],[28,9612],{"className":9613,"style":280},[279],[28,9615,937],{"className":9616},[284],[28,9618],{"className":9619,"style":280},[279],[28,9621,9623,9626,9629,9632,9635],{"className":9622},[265],[28,9624],{"className":9625,"style":3010},[269],[28,9627,176],{"className":9628},[274,275],[28,9630],{"className":9631,"style":302},[279],[28,9633,9572],{"className":9634},[306],[28,9636],{"className":9637,"style":302},[279],[28,9639,9641,9644],{"className":9640},[265],[28,9642],{"className":9643,"style":316},[269],[28,9645,1244],{"className":9646},[274],"，这是一个析取，没法用一组等式表达。上层只能做情况分裂（case split），分别假设每一支再检查。这会让组合复杂度上升，也是混合理论求解有时会突然变慢的原因之一。",[419,9649,9651],{"id":9650},"_34-给出解释","3.4 给出解释",[11,9653,9654,9655,2923],{},"第四个策略是",[183,9656,9657],{},"不只回答是或否，还给出可操作的结果",[2480,9659,9660,9665,9670,9731],{},[2483,9661,9662,9664],{},[183,9663,405],{},"：求解器返回一个模型，给出每个变量的具体取值。对符号执行来说，这就是一条能触发目标路径的测试输入。",[2483,9666,9667,9669],{},[183,9668,6456],{},"：求解器可以返回一个 unsat core，也就是一组不可满足的子约束，告诉你「是这几条打架了」。",[2483,9671,9672,9675,9676,9730],{},[183,9673,9674],{},"插值","：从 ",[28,9677,9679,9699],{"className":9678,"translate":193},[197],[28,9680,9682],{"className":9681},[201],[203,9683,9684],{"xmlns":205},[208,9685,9686,9696],{},[211,9687,9688,9690,9693],{},[214,9689,903],{},[217,9691,9692],{},"⇒",[214,9694,9695],{},"B",[253,9697,9698],{"encoding":255},"A \\Rightarrow B",[28,9700,9702,9720],{"className":9701,"ariaHidden":261},[260],[28,9703,9705,9708,9711,9714,9717],{"className":9704},[265],[28,9706],{"className":9707,"style":455},[269],[28,9709,903],{"className":9710},[274,275],[28,9712],{"className":9713,"style":302},[279],[28,9715,9692],{"className":9716},[306],[28,9718],{"className":9719,"style":302},[279],[28,9721,9723,9726],{"className":9722},[265],[28,9724],{"className":9725,"style":455},[269],[28,9727,9695],{"className":9728,"style":9729},[274,275],"margin-right:0.0502em;"," 的不可满足性中提取一个只含共同变量的中间公式（Craig interpolant），用于程序验证中的不变式合成和抽象精化。",[2483,9732,9733,9736],{},[183,9734,9735],{},"证明","：部分求解器能输出 resolution 证明，供独立检查，避免「求解器说有漏洞，但你不知道为什么」的黑盒困境。",[11,9738,9739,9740,9742],{},"这一点经常被忽略，但它决定了 SMT 能不能真正嵌进工具链。一个只会输出 ",[25,9741,6456],{}," 的求解器，在调试时几乎没用；一个能告诉你「第 3、7、9 条约束冲突」的求解器，才能帮工程师定位问题。",[419,9744,9746],{"id":9745},"_35-增量求解","3.5 增量求解",[11,9748,9749,9750,9753],{},"第五个策略是",[183,9751,9752],{},"增量求解","（incremental solving）。",[11,9755,9756],{},"符号执行的路径是一棵树：父路径的约束是子路径约束的前缀。如果每换一条路径都从头求解，大量工作会被重复浪费。",[11,9758,9759,9760,2951,9763,2693,9766,9769],{},"SMT-LIB 提供了 ",[25,9761,9762],{},"push",[25,9764,9765],{},"pop",[25,9767,9768],{},"check-sat-assuming","，允许在已有约束的基础上临时加入假设、求解、再回退。求解器会保留之前学到的子句和理论状态。一条路径判 unsat 后回退到分叉点，下一条路径可以接着用。",[11,9771,9772],{},"KLEE、angr 这类工具都重度依赖这个特性。没有增量求解，符号执行的性能会差一个数量级。",[414,9774,9776],{"id":9775},"四dpllt","四、DPLL(T)",[419,9778,9780],{"id":9779},"_41-总体架构","4.1 总体架构",[11,9782,9783,9784,9787,9788,9791],{},"现代 SMT 求解器的标准架构叫 ",[183,9785,9786],{},"DPLL(T)","，更准确的名字是 ",[183,9789,9790],{},"CDCL(T)","：外层是带冲突学习的 SAT 求解器，内层挂一个或多个理论求解器。",[2907,9793,9794],{},[2910,9795],{"height":9796,"width":9797,"style":2914,"data-d2-theme":2915,"alt":23,"src":9798},320,2578,"data:image\u002Fsvg+xml;base64,PHN2ZyB3aWR0aD0iMjU3OCIgaGVpZ2h0PSIzMjAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgZGF0YS1kMi12ZXJzaW9uPSJ2MC45LjAiIHZpZXdCb3g9IjAgMCAyNTc4IDMyMCI+PHN2ZyB3aWR0aD0iMjU3OCIgaGVpZ2h0PSIzMjAiIGNsYXNzPSJkMi0yNDgwMjc2NjA0IGQyLXN2ZyIgdmlld0JveD0iLTEgLTEgMjU3OCAzMjAiPjxyZWN0IHdpZHRoPSIyNTc4IiBoZWlnaHQ9IjMyMCIgeD0iLTEiIHk9Ii0xIiBzdHJva2Utd2lkdGg9IjAiIHJ4PSIwIiBzdHlsZT0iZmlsbDojZmZmIi8+PHN0eWxlPi5kMi0yNDgwMjc2NjA0IC50ZXh0LWJvbGR7Zm9udC1mYW1pbHk6JnF1b3Q7ZDItMjQ4MDI3NjYwNC1mb250LWJvbGQmcXVvdDt9QGZvbnQtZmFjZXtmb250LWZhbWlseTpkMi0yNDgwMjc2NjA0LWZvbnQtYm9sZDtzcmM6dXJsKGRhdGE6YXBwbGljYXRpb24vZm9udC13b2ZmO2Jhc2U2NCxkMDlHUmdBQkFBQUFBQXk0QUFvQUFBQUFFMUFBQWd1RkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQlBVeTh5QUFBQTlBQUFBR0FBQUFCZ1h4SFhybU50WVhBQUFBRlVBQUFBcGdBQUFOcERFT29VWjJ4NVpnQUFBZndBQUFaTEFBQUgvR0k3b05ob1pXRmtBQUFJU0FBQUFEWUFBQUEyRzM4ZTFHaG9aV0VBQUFpQUFBQUFKQUFBQUNRS2Z3WGFhRzEwZUFBQUNLUUFBQUJzQUFBQWJEY2VCTmhzYjJOaEFBQUpFQUFBQURnQUFBQTRHdFljNG0xaGVIQUFBQWxJQUFBQUlBQUFBQ0FBTXdEM2JtRnRaUUFBQ1dnQUFBTXZBQUFJS2dqd1ZrRndiM04wQUFBTW1BQUFBQ0FBQUFBZy85RUFNZ0FEQWlvQ3ZBQUZBQUFDaWdKWUFBQUFTd0tLQWxnQUFBRmVBRElCS1FBQUFnc0hBd01FQXdJQ0JHQUFBdmNBQUFBREFBQUFBQUFBQUFCQlJFSlBBQ0FBSVAvL0F1Ny9CZ0FBQTlnQkVTQUFBWjhBQUFBQUFmQUNsQUFBQUNBQUEzaWNoTTI3S2tjQkFNZnh6N200SC9lNzZUQXhlQWFKa1F5OGdFRVpsRklHYjJDMktpa3BEMkN4c1JpdE5tVTFlUUQxVXpybWY5LzFVMThVS2dVYXRUZXNhTlZLclRYck5temF0dXZBb1NQSFRwMjdxRjZYcnhLMFZqdXpaY2QrWjA2Yy9adDg1anRmZWM5TG52T1V4enprUG5lNXpVMnVmL1krTHYvT3ZTb3NXRFJ2VHFsUzY5TnZ3S0FodzBZMFJvMFpOMkhTbEdrelppM3hDd0FBLy84REFKNXFMUzRBQUhpY1hKVmJUQnZwRmNmUDk4MTRKamhPWUd6UGpHMThIM3ZHRjJ6d2pHY0dBc2FRMkpBQUJnTWhGeTBrRzVSdExpUXN5bnFWTkVMYUY3b1ByYU5JUzdwS2w2b1hxZnVRYXZzUThkS3VsSzNVbDIwazN0b3RMMVcyTjdXUFFhcTdhaUlZcjJZSVdjaUxQOHVmdm5QTzczLys1eGhzVUFYQTgvZ0JFTkFDcmVBRUZrQmhJa3hja1NTQjFoVmRGM2hDbHhCRFY3SFQrUFJYVXBKTUpzbFUrR0hvN3NXTHFISUJQOWk1OFZabGZ2NmJpNzI5eHM5Kzk3bHhENzMzT1FCdXZnVEFKM0FkV29BQmNOR0tKSXFTUUZHRVMzRUpra0QvdSsxSHJVZmFqNUFPNzh1Tnh4cy9UWHlaUUNOOWZibEZKWC9UK0FHdTc5VFcxZ0FBRUdTYkRkeUZIMEk3Z0MwcWltcGUweFNaNDJsUkZLSVV4Ym81UmRaMG5rSnpVeitjbnJrM1Zid2NHZmZxUXNlcDlKbVRpYUpuZk1veDl1T2JOMzR5cVVRdjhBSDV3dkhMU3pIdjdOdUFvUUtBeDNBZDdMdkVpc3h4ckp1aUJFbVJOVTNOaTZJZ1ZINTcrYVBKNnYyM00vN3U2V3gydXR1UDY2WDdTMHNmRGQ5T3pJNlBuNDliOVZVQTBEOXdIV3hXRkNiQ1ZsWVJ4dldkcldYWXU4ZS93WFVJV2ZjdWp1TVZUZE5kQ2lPWUtMcEEwNElrQ1VITXNwVmZYck03N2FTZHNWLzV4WWQwQzBHcWM1TnplWkk4Uk9PNjhjemZId3oyKzFGMHAvWThQRkVOcmIxNHNSYXFUb1NmbXptRVpnUGI4VU5JV1JwSk9zY3Bzc2tnU1ZsOFVERFd6Zkg4TGlseUQzd2dueGJPSkxJWkpUMFQ2Uk43cjVXNmwxS2o0UUZKelBTa1R2Y09IVnQwZEdYZkNZclJRQ2pnakIzdEhPclV6dVU3VW5QZTlwQS9HR1NpbnRObGJiWWJFSGdCc0F2WGdUWVpCVFhDQ3N6R09ucTVqdHVXbDNlMlRCMHdwSm9OOUdlMERWNFFBUGlvcU9ZMTNTcUpscXdDV1VZdy9hSExtcTVhZmYyaVZGMVp4VUl5TkJCVE94ZU9YZnplSFRzWkdqN2tqYnZHKzBLT3M4WHhjNjBSeWNOZUNzUVdieG4vVXZ6Q0xkNTExcDRPZUhnclg2elpRSDlIMitDQjBBSG5tT3gweEZSSTV5bUtVUEptRFNnMGZPdjRpUnU5dzNPZEpEWTI3VU01VmN1SkZ6NVpsenFpbXFPL05qVlpLeFlYU3E1NGk2WkV6dnVDNkZoUzdUUzVFQXlheWZBVGNKdnNDa3Z2d1RCV1lKb1pYS1g5by9Ma3FkVkEySi93NENlZm5mZW1GK2FNRFJUUkVsN2VlR3pGYURhUUV6K0IxbDFsR0lYWnN6WDF4N0hlVmFiRlJsTk9SOXp4MWlnV2RqWjVKMEkzYmJUNURvQUlvRzJJV0xsTlk1bWRQbEFCL2ZvY05QVWJ5cW1EcnNoSXJqcTZHZ2pIdTh5UFRyUTFFTXFrRTlIY1hsbGR4dU5YeHg0ZjJnYjMvaHo3K2U3WXlYRGxOU0RhS2dZekIva3d4Sm9OVEtOdGFIMWppczFlVUpKbDFWMXZJcTc0YnFuMGJyRzRXQ290RmpQWmJDYWJ5VGdLNzA5TjF3cUYydlRVKzRYYmxZSEJzYkhCZ2NvcjdkRjl0QTNPQS95MCtGMWw3V01pNjdkN2puamIvQVUzMmpvcjUyeTJEMGd5S1J0L0F3UnNzNEYranJaQnNuVC9ibTdFM2JsNUhjeWNtaUJtM2RTZmNsZkU0OUZpS0JJTVpIM0Izc1MxbVo2em9lTyt2SytuUnd3WGtsY2RZbWpXMjg2N0dNNWxkOFI2a3VVemt1ZWNtNU04M3FPSGhaN3NpYmxkenpETkJsckVOZUF0TlZSVlVIVmRZUlZXWUYvM0hjSHNSR21NdVh2N3RoQndlTzI4UzNkY1AvUDBKcld5OHQ2WHFUaEZMbENPM1ZoOXpRYjZQOW9DOXh2ZVlaVGRnZnJMNUtuVllOZ3ZjcXQzRGhPaEVjZkNITW9iWDZ0Slh3Q2ROTnJLOFE1QTRHajJveDIwQmUzN2RkQjFRdUZmclN0ZElZN2lPMXlrMVVjN0Q4VVRkdnIzRDRZUE8rM2tJYWFsNzk1bmZQZkVIeWh5Q2RsaUFSLzY1MWZSb2Jnd0xIeGxITzZmU1prMUVoQnJUdUF2Y0ExWThKdlRiMU10ZVRWZFZWaExWb3BtQ1RmSE14Umx5NHNTbzJrb1c3NDdPbnEzL09IUTk4M2pSVEdmTDZJYi9hcmEvL2dSMmJkVXJTNFZpT1Zsb21CKzZ5TWZvVWZsRVFMRmlKRnllWVF3L2txTUFJWmtzNEUreGI4R0g0Z0F1dGhQcVBsOTI0WmozVWNKbnJiV2tEa3RidW9UaXBOU2dYalFuM1pQQ3ZQSHRCazUySkh5a1lPaUxJdWlvdnduT2FobTBsd283SE9QSk9YWVdHKzhwNnRUai8xWGxSS3FtcEJVcXhkcGVJb2lLQWNFZ01tVy91YnAxYXZtN3llYkZaVEFYOE1SQU40eXY3bDZURk50Rk12bDRxd3V5L3I2bFdjcks4K3VpSmMyRjY1dnpnT0NybVlGdGIxNkkxbi9TS1kvV1RkVm4rMlc1ZTdaWXJtOExzNXZYbC9ZdkNSYWJ3RkJvdmtjVCtNV2FBR3dTWHBFalVnNllsRmg2R05qRGIzejhSRGltSW1WMnNxRThUOFNBTDRGQUFELy93TUF0N3l4M3dBQUFRQUFBQUlMaFpzT1JCRmZEenoxQUFFRDZBQUFBQURZWGFDRUFBQUFBTjFtTHpiK04vN0VDRzBEOFFBQkFBTUFBZ0FBQUFBQUFBQUJBQUFEMlA3dkFBQUltUDQzL2pjSWJRQUJBQUFBQUFBQUFBQUFBQUFBQUFBQUd3S3lBRkFBeUFBQUFqMy8rZ0pHQUM0Q2V3Qk5BZ1lBVFFMNkFFMENMQUFqQWl3QUdRSVBBQ29DQmdBa0Fqc0FRUUVlQUVFRFdRQkJBandBUVFJckFDUUJqZ0JCQWJzQUZRRi9BQkVDT0FBOEFna0FEQUxpQUNRQnp3QXBBVXdBS3dGWUFFZ0JXQUF3QW1rQUtBQUFBQ3dBTEFCUUFId0FvQUN3QU9JQklnRTBBV3dCb0FIQ0FkNENFQUl5QWw0Q2ZnSzZBdUFEQWdNeUEyd0RwZ095QTh3RDVnUCtBQUVBQUFBYkFKQUFEQUJqQUFjQUFRQUFBQUFBQUFBQUFBQUFBQUFFQUFONG5KeVV6MjRiWlJURmYwNXMwd3JCQWtWVnVvbStCWXNpdFdOVEpWWGJyQ2FrVmtaRWNmQzRJQ1NFTkxZbnR1WHh6TWd6ZGhxZWdEVnZ3VnQweFVQd0hJZzF1dGZYcmwwUUJTdUtkV2JtL2puZnVlZCt3QUYvc2srbGVoLzRyWjRhcm5CVXZ6YTh4NzM2aGVGOVd2VTl3MVVlMVg0M1hHTlFXeGl1ODNtdFkvZ2ozbFovTVh5UDQrcVBodTl6V0cwWi9waW4xUVBEbit3Ny9qRDhLY2U4WGVJS1BPZG53eFVPeVEzdmNjQVBodmQ1Z05Xc1ZIbEEwM0NOenpneVhPY0k2REttSkdGTXloREhEV09HekprUlV4QVNNMlBNRFRFREhBRStDYVcrVFlrVU9ZYi8rRFlpcEdSR3BCVkhsRGdTUWhJaUNrWlc4U2ZOeXJqV2p0Sm5wa2k2K1pTTWlPaHB4b1NJRkVmR2tJeVVtSW5XS1NuSmVVbURCZ1Y5NVp0VFV1QlJNQ2JCSTJQR2tBWnRXbHpTWmNTWUFrZExLd216a0l3YlNtNkp0TCt6Q0ZHbVQweEtZYXptcEF5VXAxTitzV1lIWE9Kb2sydnNadVhMclFxUGNYeXIyY0pOWWh4ZjR1bS8yMkMyM1hmRkptS2hlb3FHUFJMbGVhc1RIS25pMHRmbkc4VWxMM0U3NmJQTjVNTWFEWlNkekhwTWo3bk9YK1luZWNJa3hibERmRUoxVU9nZTRqalQ1NEJRRmZtT2dDNFh0SGxOVjU5OU9uVHd1YUpMd0N2TmJkUEI4UlZ0cmpqWGpFRHg4bHRMSFhQRjl6aStKdEFZcVIyYlBxSzVQTDBoTjNjTGQzR0duR05LcmxzZ001YnppL1BqblNZc081UnR1YU5RVi9SMWp5UlM5a0JVa1QyTEdKb3JjblhGVkxWY2VhTXcvUWJtQ1BsYTZtemZmWmR0V05qdXJiYjRqa3gzMkRFM1RqSzVKYU1QVGRWN3p6TzMrdWNSTVNDanB4RjlNcVkwS0xuVHMxMFRNU2ZCY2E0K3Z0QXRLZkhYT2RMblRsMFNNMVVHQWFuV21aSHJiMlMrQ1kxN2Y4djN6dTRTMmJ5cDd1aGtmYXBkdWtqbGRHTkdyMVc5MWJmUVZJNDNKdEN3cVdhV0l4T1d5c3VUaXZjbDJ0dmlINnI3QzczZE1wNXdSa2JDNEc4M3dGTThtaHh6d2lrajdTQ1ZVeFoyT3pUMWhtanlnbE05L1lSWW8rUytmS002U1lVVFBKNXh3Z2t2ZVBhZWppc216cmk0TlpmTjNqN25uTkhtOUQrZFlobmY1b3hYNjNmLzN2VlhaZHJVc3ppZXJKK2U3enpGUi8vRHJWL3dlT3UrN09ndElKdXpzR3J2dHVLS2lLbHdjWWViV3JpSGVIOEJBQUQvL3dNQTlMZFBVUUFBQXdBQUFBQUFBUC9PQURJQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBPT0pfS5kMi0yNDgwMjc2NjA0IC50ZXh0LWl0YWxpY3tmb250LWZhbWlseTomcXVvdDtkMi0yNDgwMjc2NjA0LWZvbnQtaXRhbGljJnF1b3Q7fUBmb250LWZhY2V7Zm9udC1mYW1pbHk6ZDItMjQ4MDI3NjYwNC1mb250LWl0YWxpYztzcmM6dXJsKGRhdGE6YXBwbGljYXRpb24vZm9udC13b2ZmO2Jhc2U2NCxkMDlHUmdBQkFBQUFBQXlvQUFvQUFBQUFFMmdBQVJoUkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQlBVeTh5QUFBQTlBQUFBR0FBQUFCZ1cxU1ZlR050WVhBQUFBRlVBQUFBb0FBQUFOQURnQ1djWjJ4NVpnQUFBZlFBQUFaTEFBQUlIRi9IOERSb1pXRmtBQUFJUUFBQUFEWUFBQUEyRzdVcjJtaG9aV0VBQUFoNEFBQUFKQUFBQUNRTGVBaSthRzEwZUFBQUNKd0FBQUJvQUFBQWFDL0JBdkZzYjJOaEFBQUpCQUFBQURZQUFBQTJIRmdhTG0xaGVIQUFBQWs4QUFBQUlBQUFBQ0FBTWdEMmJtRnRaUUFBQ1Z3QUFBTXJBQUFJTWdudFZ6TndiM04wQUFBTWlBQUFBQ0FBQUFBZy84WUFNZ0FEQWVFQmtBQUZBQUFDaWdKWS8vRUFTd0tLQWxnQVJBRmVBRElCSXdBQUFnc0ZBd01FQXdrQ0JDQUFBSGNBQUFBREFBQUFBQUFBQUFCQlJFSlBBQUVBSVAvL0F1Ny9CZ0FBQTlnQkVTQUFBWk1BQUFBQUFlWUNsQUFBQUNBQUEzaWNmTTI5Q2tGaEFNYngvM0ZlMzhmMzkzWnNESzVCWW1UaUJnektvSlF5dUFLN1ZVbEp1UUNMalhJTlJtVTB1WVJIdmM2c1ozaVdYLzBCQnhjSDhERGNBUjhmWTc5Sml6WWRlZ3dZTVdiQ2xEbExWdldOWkVVakVGMzZEQU14WS9FVGV1bWp0eDY2NmFxTHpqcnBxSVAyMm1uN1hOdm0vemxVcUZLbVJBZ1hRNWdJVVdMRVNaREVJMFdhREZseTVDbFFwQVpmQUFBQS8vOERBQnAvS2lWNG5HU1ZiMndiZHhuSG45L3Z6bmR4NmppeHp6N0hydi9FUHZ2T2RzN241TTYraSszNFg1ei9jZFltVzdxcXJkTVcxcTdOQ2tTZ3NuVmJOVmlsVWlTWXNxcENBbzJCTm9TQXZaa1liL2dqUmlrdnVvMEtJUlUwVkdsSUREclVJQTBpdnhpSTNLR2Y0MlZwZVhOdmZ2THpmSi9QOC8wK0JodkVBZkJuOFRXZ3dBNzk0QVl2Z01aRktVb3pETUZIYVpJa3NLd2hjUndiZng3ZGZQNWJkT1BJMzVMZi9iY2NvV2UrL01PRmY1eDREVi9iUG9lKzFIcnVPZlBvbFZPbkh0M2NOTlBvajVzQUFOaDZCd0Q5QVcrQUhWd0FIS3RKb2lnSkRJT1F4Z21Td0w1ZnZORkw5OUowUUROL2l4NDcwbHh5Ly8wc3VyQytubHNiS3p4dUx1R043ZlZidHdBUUZLdzJ6dUNYSUFKZ2k0bGlQbGZCbXNyN1dGRVVZazdzOWZDOHB1cUdqMkZRYk9HTVBuTGtZbk5zYVZEbmRMRjRmQ0llbXk4bEcwTkN2T1ZvUFBYUTRyVW5aNHgwYWtncVAvYlVlS21WSDlxdlJqSkVLd2dBV085bzVRZ0JUZVc5SG9ZUkpFM1Y5WHhPRkFUaDB0TmYvZnJLZHo1MzZOREtzNDNIUDYzamphOWNlUElucDJxUGZPTms2eXlaRjVFYTZDcmVBRnVuQWhWbGhVc1BmUkY1K3ZERzlvOG5kdDd4TC9BRytEdnZuRTh6T0kwU09GMDNCSllTS01LR3BZUkxyUUpQVDk5b1hWcG8yZ01PK3NCMXVjelRqTE5uSG0rWUwxKzVnajYxdlk0K0w2OE5YelcvaDQ1ZGxjL0s1Z3VBd0dHMWtZbGZnalNBTHlaS1JvZEpQaWRLRWdHbTY3dkFHTWJyNFgwK3ZqUGZCNDMxWkNHMFlvd3ZaUkxOZENsL3JGUTZFZEg4MDBvaUh4cU5ON081MG1sSHNUZzhyRTZPeFZWZUNjd1o2ckthU3lyaFZHUmt2NWpsTThFWm8zZzBCd2hhQURpUE40QWxzd2xHbEJXbzc1Ly9aUjk2cCsvTjgzaXgwZGgrZ3pEQ0lGbHQ5QkhhQWcraDRZdnRMbE16TkVvd0JJYVJWTjB3ZGpmN1JxMHB6NjlxVXRsRmM1V1QxUjVhT093V0Q4UmxyeHFNTi9LUlVjZlJsZWtMeDdSa3RHd0daaFBabXBMOWt4aEx6N1hVYW5tblg4SnFvemZSRmdRZ3NiY2ZtWjZOTXJ2T29iVE9tZ21mdng0Nm0xazRObUxVd3c2YitSdjdVQ01kS3ZqQ29hVnZXcGh5cDRUOHFtUHQ1TlQ2c3F3Y1ZJT2FzM293NFhkcDNnaEs3QnZzQzQ1R1ZnQVJuNkozOGMzdW5sbFc2K0QzZXRqT3N2TTVJY2F3Vk9TRnhaRUJPclVzVi9JOWxlWTRUYzhHWjVVcGZIT3pMR1RyWTVHNCtUYVNQWU45QzJuRi9BRWdrSzAyL0FmZkJEZVpJcDhqemlHYjdNci9USjE1WnZFaVFpNktZVkV2NzZpNi9QaUo3UmRaTytWR3VFVFRoRVZIRjc2SHRvaEhpSzRkV2I2dU9PWStkWHVGbnF5eXRQaXdXQnkxWlE4bnlqcE5WeGJMTkQzam5aV25pTzVwZm5aNEN0MmRpNDhhU1Ztcmo3bkNucjNhOTB6UjFZRGVSVnN3dUZmRGcyaEl4OVN5Y2grWlRvZi9BN1BycVR0b0Mvb2h0SGZIWG84VFM5MzR4Z2dzL3ZhQlZYbCtWVDF3WEY1WVRXZVdORjBsSDhlWm8xTmZXRkYydnJXSjljbUptY2I2NU1UMHg4elFzMmdMQnZibzliSGl4enIzMGFGbXh1L2RQeENJTnlObGRMY2xsKzJUUGRXU2VRdVE5VityalM2aUxaQWV6T1NEa1NTSjNBbmtxNk10LzRpdkpxYkxxVEdsSU0vSnlueFE0YlNvT0tvUFZYSWp5NDVjVW93a0ZTRWdSUUtWMUhBOUVROG5QWUZNSkN5NlkrTnlaakpCTkk5YmJYUVluNE5nbDRadWNFSVZhNnpHQ2hUQjBEWE5UMnM1R2hWbTlqWGo5ZjNQT0M0V3FHRE1HZGpuR3NnNnFwbitRQjl5RjJ5WEwxZk1lMjUzT054ck05aCtVbnZNYXFNUDBWM3dmMUw3RXlkeTNReS90dXVTMmRDTVBOVWt3VTArNHBnd1hCRU82ZVp0emsvV2h3NmJnWGxCNjNqVCtyV1ZSZStqdXhBQVlEdjNpOVF6S0kzamVaK21rOUxJaVpuZUlhZmY3VTdVL2U2SG02S3RoNkpkQ2ZmWG11WmYvS1haMzdOc3dWNVdCZlNCK1dGMFVSQ2FNZVRhL2xkMlVTYjFNYXhhYmZRSy9oSDR5UjB3S2pTNTZUR0dsYnIrYzFJc1M0NVJOd3N2VXVsaVFWU1NRWU5QaFpZeTA4dFNxU3pUMDd4ZkN2S0RpYmUwK1dLK2tFZ3BRWjhTbHVicW96UEZZa1A1WFpBUHlDSGVMM2YvQzk1RHZjZ1BGSUJoYUt6Z3VOUDNYcWxFdENDb1d3ZlJvL2dPOUFQNGRxeGcrQmh5N1hqZjA0TlI0OHg4WnUyYzNlTjh2ZmJxOHZtM2Z0N3lYemIvL0xKeStvUklPTjIyRHNLOTdtOGwzVTF1RmpuMnhEc29zL2FFM2QydmtoS3ZCeTZqNkxlenA0K0xYTzJWNWZOdi80ejA5VmoveEJWc0F6dUFUVEtpK2Foa0lDOGFrMjZZTmZTckd4SmlCdExYcTlmVDVrYzJBUGdmQUFBQS8vOERBREtDc2hVQUFBRUFBQUFCR0ZFdUI1bWxYdzg4OVFBQkErZ0FBQUFBMkYyZ3pBQUFBQURkWmk4My9yMyszUWdkQThrQUFnQURBQUlBQUFBQUFBQUFBUUFBQTlqKzd3QUFDRUQrdmYyOENCMEQ2QURDLzlFQUFBQUFBQUFBQUFBQUFCb0NkQUFrQU1nQUFBSCsvOHNDSmdBNUFsQUFJd0hPQUNNQ3dRQWpBZm9BREFIK0FGMENHUUFuQWVFQUpRSUxBQjhBK0FBc0F4OEFId0lOQUI4Q0F3QW5BVllBSHdHUy8vd0JSUUE4QWhBQU9BSEEvOElCbVFCZUFTc0FJd0VqQUVFQkpmL1VBbEVBRkFBQUFDNEFMZ0JTQUlRQXBnQzJBT1FCSkFFNEFYQUJxZ0hVQWZZQ09BSmlBcEFDcmdMcUF4Z0RSQU4wQTZ3RHVnUFlBL1lFRGdBQUFBRUFBQUFhQUl3QURBQm1BQWNBQVFBQUFBQUFBQUFBQUFBQUFBQUVBQU40bkp5VTNXNGFWeFNGUDJLZ1RmOHVLaXR5YnF4em1Vck80RVp4bE1SWDR6cFdSa1dRTXFRL1VsVnBnREVnWUdiRUREak9FL1M2YjlHM3lGVWZvMDlSOWJyYW13MWhJcXRXVUJSckRXZi9yTFAyMmdmWTUxLzJxRlR2QW4vVmw0WXJITlovTm55SEwrcE53M3VjMVQ4elhPV285cmZoR29QYVc4TjFIdFE2aGovaFhmVVB3NS95dVBxYjRic2NWQzhNZjg2ajZyN2hML2NjL3hqK2lzZThXK0VLUE9WM3d4VU95QXpmWVo5ZkRlOXhENnRacVhLUFk4TTF2dWJRY0oxRG9NdVlnaWxqRW9ZNExoa3paTUdjbUp5UW1EbGpMb2taNEFqd21WTG9yd21SSXNmd3hsOGpRZ3JtUkZweFJJRmpTc2lVaUp5UlZYeXJXU212dEtQMG1TdVNiajRGSXlKNm1qRWhJc0dSTWlRbElXYWlkUW9LTXA3VG9FRk9YL2xtRk9SNDVJeVo0cEV5WjBpRE5oYzA2VEppVEk3alFpc0pzNUNVU3dxdWlMUy9zd2hScGs5TVFtNnNGaVFNbEtkVGZyRm1CelJ4dE1rMGRydHlzMVRoQ01lUG1pM2NKTWJ4TFo3K2Qxdk15bjNYYkNLV3FxZG8yR09xUEs5MGdpTlZYUHI2L0tDNDREbHVKMzNLVEc3WGFLRHNaTlpqZWl4MC9qSS95Uk1tQ2M0ZDRCT3FnMEozSDhlWmZnZUVxc2hQQkhSNVNadlhkUFhicDBNSG54WmRBbDVvYnBzT2p1OW8wK0pjTXdMRnE3TUxkVXlMWDNCOFQ2QXhVanMyZlVSeitYcERadTRXN3VJTXVjZU1UTGRBWml6M0YrZkhPMDFZZGlndHVTTlhWL1IxanlSUzlrQlVrVDJMR0pvck1uWEZUTFZjZXlNMy9RYm1DRGt0ZExidnoyVWJsclo3NnkyK0p0VWRkaXlNazB4dXhlaTJxWG9mZU9aSy8zbEVERWpwYVVTZmxCa05DcTcxYnErSVdEREZjYTQrZnFsYlV1QnZjcVRQdGJva1pxWU1BaEt0TXlmVHY1SDVKalR1L1pMdm5iMGxzbmt6M2RISjVsYTdkSkhLeWRhTVhxdDY2N1BRVkk2M0p0Q3dxYWFXSXhPV3lxdWJpdmNsMml2eEQ5WDl1YjV1S1E4SnRLNU1zbi9qSzNETU0wNDRaYVJkcEhyQ2NuTW1yNFJFbktvQ0UyS05ramZ6aldyMUNJOFRQSjV3d2duUGVQS0JsbXMyenZpNEVwL3Qvajdubk5IbTlOYmJyR0xiblBHaVZPMy9PLytwYkkvMVBvNkhtNituTzAvendVZTQ5aHVPU3U5bVIxOEQyYUNsVlh1L0hTMGlac0xGSFd4cjRlN2ovUWNBQVAvL0F3QnlvVkZBQUFBREFBRC85UUFBLzg0QU1nQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUEpfS5jb25uZWN0aW9uLC5zaGFwZXtzdHJva2UtbGluZWpvaW46cm91bmR9LnNoYXBle3NoYXBlLXJlbmRlcmluZzpnZW9tZXRyaWNQcmVjaXNpb259LmNvbm5lY3Rpb257c3Ryb2tlLWxpbmVjYXA6cm91bmR9LmQyLTI0ODAyNzY2MDQgLmZpbGwtTjF7ZmlsbDojMGEwZjI1fS5kMi0yNDgwMjc2NjA0IC5maWxsLU4ye2ZpbGw6IzY3NmM3ZX0uZDItMjQ4MDI3NjYwNCAuc3Ryb2tlLUIxe3N0cm9rZTojMGQzMmIyfTwvc3R5bGU+PGcgY2xhc3M9ImNHaHAgc3RlcCI+PHBhdGggZmlsbD0iI2VlZjRmZiIgc3Ryb2tlPSIjNGE2ZmE1IiBkPSJNMCAxMDhoMTMydjY2SDB6IiBjbGFzcz0ic2hhcGUiIHN0eWxlPSJzdHJva2Utd2lkdGg6MiIvPjx0ZXh0IHg9IjY2IiB5PSIxNDYuNSIgZmlsbD0iIzBhMGYyNSIgY2xhc3M9InRleHQtYm9sZCBmaWxsLU4xIiBzdHlsZT0idGV4dC1hbmNob3I6bWlkZGxlO2ZvbnQtc2l6ZToxNnB4Ij5TTVQg5YWs5byPIM+GPC90ZXh0PjwvZz48ZyBjbGFzcz0iY0hKbCBzdGVwIj48cGF0aCBmaWxsPSIjZWVmNGZmIiBzdHJva2U9IiM0YTZmYTUiIGQ9Ik0yNjkgMTAwaDE2NXY4MkgyNjl6IiBjbGFzcz0ic2hhcGUiIHN0eWxlPSJzdHJva2Utd2lkdGg6MiIvPjx0ZXh0IHg9IjM1MS41IiB5PSIxMzguNSIgZmlsbD0iIzBhMGYyNSIgY2xhc3M9InRleHQtYm9sZCBmaWxsLU4xIiBzdHlsZT0idGV4dC1hbmNob3I6bWlkZGxlO2ZvbnQtc2l6ZToxNnB4Ij48dHNwYW4geD0iMzUxLjUiIGR5PSIwIj7pooTlpITnkIY8L3RzcGFuPjx0c3BhbiB4PSIzNTEuNSIgZHk9IjE4LjUiPuWMlueugOS4juinhOiMg+WMljwvdHNwYW4+PC90ZXh0PjwvZz48ZyBjbGFzcz0iWVdKeiBzdGVwIj48cGF0aCBmaWxsPSIjZWVmNGZmIiBzdHJva2U9IiM0YTZmYTUiIGQ9Ik01NzEgMTAwaDIyM3Y4Mkg1NzF6IiBjbGFzcz0ic2hhcGUiIHN0eWxlPSJzdHJva2Utd2lkdGg6MiIvPjx0ZXh0IHg9IjY4Mi41IiB5PSIxMzguNSIgZmlsbD0iIzBhMGYyNSIgY2xhc3M9InRleHQtYm9sZCBmaWxsLU4xIiBzdHlsZT0idGV4dC1hbmNob3I6bWlkZGxlO2ZvbnQtc2l6ZToxNnB4Ij48dHNwYW4geD0iNjgyLjUiIGR5PSIwIj7luIPlsJTmir3osaE8L3RzcGFuPjx0c3BhbiB4PSI2ODIuNSIgZHk9IjE4LjUiPueQhuiuuuWOn+WtkCDihpIg5ZG96aKY5Y+Y6YePPC90c3Bhbj48L3RleHQ+PC9nPjxnIGNsYXNzPSJZMlJqYkE9PSBzdGVwIj48cGF0aCBmaWxsPSIjZWVmNGZmIiBzdHJva2U9IiM0YTZmYTUiIGQ9Ik05MzEgMTAwaDE3NnY4Mkg5MzF6IiBjbGFzcz0ic2hhcGUiIHN0eWxlPSJzdHJva2Utd2lkdGg6MiIvPjx0ZXh0IHg9IjEwMTkiIHk9IjEzOC41IiBmaWxsPSIjMGEwZjI1IiBjbGFzcz0idGV4dC1ib2xkIGZpbGwtTjEiIHN0eWxlPSJ0ZXh0LWFuY2hvcjptaWRkbGU7Zm9udC1zaXplOjE2cHgiPjx0c3BhbiB4PSIxMDE5IiBkeT0iMCI+Q0RDTCBTQVQg5rGC6Kej5ZmoPC90c3Bhbj48dHNwYW4geD0iMTAxOSIgZHk9IjE4LjUiPuW4g+WwlOaQnOe0ojwvdHNwYW4+PC90ZXh0PjwvZz48ZyBjbGFzcz0iWTJGdVpBPT0gYnJhbmNoIj48cGF0aCBmaWxsPSIjZmZmNGU1IiBzdHJva2U9IiNkOThjMmIiIGQ9Ik0xMzg3IDIzMWgtM2wtMTM5LTQ1Yy0xIDAtMS0xIDAtMmwxMzktNDVoNWwxMzkgNDVjMSAwIDEgMSAwIDJsLTEzOCA0NXoiIGNsYXNzPSJzaGFwZSIgc3R5bGU9InN0cm9rZS13aWR0aDoyIi8+PHRleHQgeD0iMTM4NyIgeT0iMTkwLjUiIGZpbGw9IiMwYTBmMjUiIGNsYXNzPSJ0ZXh0LWJvbGQgZmlsbC1OMSIgc3R5bGU9InRleHQtYW5jaG9yOm1pZGRsZTtmb250LXNpemU6MTZweCI+5om+5Yiw5biD5bCU5qih5Z6LPzwvdGV4dD48L2c+PGcgY2xhc3M9ImRHZz0gc3RlcCI+PHBhdGggZmlsbD0iI2VlZjRmZiIgc3Ryb2tlPSIjNGE2ZmE1IiBkPSJNMTcyMyAyMTRoMTYwdjgyaC0xNjB6IiBjbGFzcz0ic2hhcGUiIHN0eWxlPSJzdHJva2Utd2lkdGg6MiIvPjx0ZXh0IHg9IjE4MDMiIHk9IjI1Mi41IiBmaWxsPSIjMGEwZjI1IiBjbGFzcz0idGV4dC1ib2xkIGZpbGwtTjEiIHN0eWxlPSJ0ZXh0LWFuY2hvcjptaWRkbGU7Zm9udC1zaXplOjE2cHgiPjx0c3BhbiB4PSIxODAzIiBkeT0iMCI+55CG6K665rGC6Kej5ZmoPC90c3Bhbj48dHNwYW4geD0iMTgwMyIgZHk9IjE4LjUiPlQt5LiA6Ie05oCn5qOA5p+lPC90c3Bhbj48L3RleHQ+PC9nPjxnIGNsYXNzPSJZMmhyIGJyYW5jaCI+PHBhdGggZmlsbD0iI2ZmZjRlNSIgc3Ryb2tlPSIjZDk4YzJiIiBkPSJNMjE1MiAzMDFoLTJsLTk0LTQ1Yy0xIDAtMS0xIDAtMmw5NC00NWg0bDk0IDQ1YzEgMCAxIDEgMCAybC05NCA0NXoiIGNsYXNzPSJzaGFwZSIgc3R5bGU9InN0cm9rZS13aWR0aDoyIi8+PHRleHQgeD0iMjE1MiIgeT0iMjYwLjUiIGZpbGw9IiMwYTBmMjUiIGNsYXNzPSJ0ZXh0LWJvbGQgZmlsbC1OMSIgc3R5bGU9InRleHQtYW5jaG9yOm1pZGRsZTtmb250LXNpemU6MTZweCI+VC3lj6\u002Fmu6HotrM\u002FPC90ZXh0PjwvZz48ZyBjbGFzcz0iYkdWdCBzdGVwIj48cGF0aCBmaWxsPSIjZWVmNGZmIiBzdHJva2U9IiM0YTZmYTUiIGQ9Ik0yNDE0IDBoMTU0djgyaC0xNTR6IiBjbGFzcz0ic2hhcGUiIHN0eWxlPSJzdHJva2Utd2lkdGg6MiIvPjx0ZXh0IHg9IjI0OTEiIHk9IjM4LjUiIGZpbGw9IiMwYTBmMjUiIGNsYXNzPSJ0ZXh0LWJvbGQgZmlsbC1OMSIgc3R5bGU9InRleHQtYW5jaG9yOm1pZGRsZTtmb250LXNpemU6MTZweCI+PHRzcGFuIHg9IjI0OTEiIGR5PSIwIj7lhrLnqoHlrZDlj6U8L3RzcGFuPjx0c3BhbiB4PSIyNDkxIiBkeT0iMTguNSI+KHRoZW9yeSBsZW1tYSk8L3RzcGFuPjwvdGV4dD48L2c+PGcgY2xhc3M9ImIycz0gZ29vZCI+PGcgY2xhc3M9InNoYXBlIj48ZWxsaXBzZSBjeD0iMjQ5MSIgY3k9IjI3NS41IiBmaWxsPSIjZWFmN2VlIiBzdHJva2U9IiM0YTlkNmIiIGNsYXNzPSJzaGFwZSIgcng9Ijg1IiByeT0iNDIuNSIgc3R5bGU9InN0cm9rZS13aWR0aDoyIi8+PC9nPjx0ZXh0IHg9IjI0OTEiIHk9IjI3MyIgZmlsbD0iIzBhMGYyNSIgY2xhc3M9InRleHQtYm9sZCBmaWxsLU4xIiBzdHlsZT0idGV4dC1hbmNob3I6bWlkZGxlO2ZvbnQtc2l6ZToxNnB4Ij48dHNwYW4geD0iMjQ5MSIgZHk9IjAiPnNhdDwvdHNwYW4+PHRzcGFuIHg9IjI0OTEiIGR5PSIxOC41Ij7lvpfliLDmqKHlnos8L3RzcGFuPjwvdGV4dD48L2c+PGcgY2xhc3M9ImJtOD0gYmFkIj48ZyBjbGFzcz0ic2hhcGUiPjxlbGxpcHNlIGN4PSIxODAyLjUiIGN5PSIxMTUiIGZpbGw9IiNmZGVjZWMiIHN0cm9rZT0iI2MwNTA0ZCIgY2xhc3M9InNoYXBlIiByeD0iMTE1LjUiIHJ5PSIzOSIgc3R5bGU9InN0cm9rZS13aWR0aDoyIi8+PC9nPjx0ZXh0IHg9IjE4MDIuNSIgeT0iMTEyLjUiIGZpbGw9IiMwYTBmMjUiIGNsYXNzPSJ0ZXh0LWJvbGQgZmlsbC1OMSIgc3R5bGU9InRleHQtYW5jaG9yOm1pZGRsZTtmb250LXNpemU6MTZweCI+PHRzcGFuIHg9IjE4MDIuNSIgZHk9IjAiPnVuc2F0PC90c3Bhbj48dHNwYW4geD0iMTgwMi41IiBkeT0iMTguNSI+5biD5bCU56m66Ze056m35bC9PC90c3Bhbj48L3RleHQ+PC9nPjxnIGNsYXNzPSJLSEJvYVNBdEptZDBPeUJ3Y21VcFd6QmQiPjxtYXJrZXIgaWQ9Im1rLWQyLTI0ODAyNzY2MDQtMzQ4ODM3ODEzNCIgbWFya2VySGVpZ2h0PSIxMiIgbWFya2VyVW5pdHM9InVzZXJTcGFjZU9uVXNlIiBtYXJrZXJXaWR0aD0iMTAiIG9yaWVudD0iYXV0byIgcmVmWD0iNyIgcmVmWT0iNiIgdmlld0JveD0iMCAwIDEwIDEyIj48cGF0aCBzdHJva2Utd2lkdGg9IjIiIGQ9Im0wIDAgMTAgNi0xMCA2eiIgY2xhc3M9ImNvbm5lY3Rpb24iIHN0eWxlPSJmaWxsOiMwZDMyYjIiLz48L21hcmtlcj48cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwZDMyYjIiIG1hcmtlci1lbmQ9InVybCgjbWstZDItMjQ4MDI3NjYwNC0zNDg4Mzc4MTM0KSIgZD0iTTEzMy41IDE0MC41aDEzMiIgY2xhc3M9ImNvbm5lY3Rpb24gc3Ryb2tlLUIxIiBtYXNrPSJ1cmwoI2QyLTI0ODAyNzY2MDQpIiBzdHlsZT0ic3Ryb2tlLXdpZHRoOjIiLz48L2c+PGcgY2xhc3M9IktIQnlaU0F0Sm1kME95QmhZbk1wV3pCZCI+PHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMGQzMmIyIiBtYXJrZXItZW5kPSJ1cmwoI21rLWQyLTI0ODAyNzY2MDQtMzQ4ODM3ODEzNCkiIGQ9Ik00MzUuNSAxNDAuNWgxMzIiIGNsYXNzPSJjb25uZWN0aW9uIHN0cm9rZS1CMSIgbWFzaz0idXJsKCNkMi0yNDgwMjc2NjA0KSIgc3R5bGU9InN0cm9rZS13aWR0aDoyIi8+PC9nPjxnIGNsYXNzPSJLR0ZpY3lBdEptZDBPeUJqWkdOc0tWc3dYUT09Ij48cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwZDMyYjIiIG1hcmtlci1lbmQ9InVybCgjbWstZDItMjQ4MDI3NjYwNC0zNDg4Mzc4MTM0KSIgZD0iTTc5NS41IDE0MC41aDEzMiIgY2xhc3M9ImNvbm5lY3Rpb24gc3Ryb2tlLUIxIiBtYXNrPSJ1cmwoI2QyLTI0ODAyNzY2MDQpIiBzdHlsZT0ic3Ryb2tlLXdpZHRoOjIiLz48L2c+PGcgY2xhc3M9IktHTmtZMndnTFNabmREc2dZMkZ1WkNsYk1GMD0iPjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzBkMzJiMiIgbWFya2VyLWVuZD0idXJsKCNtay1kMi0yNDgwMjc2NjA0LTM0ODgzNzgxMzQpIiBkPSJNMTEwOC40MiAxNjUuODA3YzUzLjI4IDE1LjQ0MyA4MC43OCAxOS4zOTMgMTMxLjU4IDE5LjIwOCIgY2xhc3M9ImNvbm5lY3Rpb24gc3Ryb2tlLUIxIiBtYXNrPSJ1cmwoI2QyLTI0ODAyNzY2MDQpIiBzdHlsZT0ic3Ryb2tlLXdpZHRoOjIiLz48L2c+PGcgY2xhc3M9IktHTmhibVFnTFNabmREc2dkR2dwV3pCZCI+PHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMGQzMmIyIiBtYXJrZXItZW5kPSJ1cmwoI21rLWQyLTI0ODAyNzY2MDQtMzQ4ODM3ODEzNCkiIGQ9Ik0xNDYxLjkwNiAyMDguNjA2QzE1NzguOCAyNDUuOCAxNjMxLjMgMjU1LjI1IDE3MTguNSAyNTUuMjUiIGNsYXNzPSJjb25uZWN0aW9uIHN0cm9rZS1CMSIgbWFzaz0idXJsKCNkMi0yNDgwMjc2NjA0KSIgc3R5bGU9InN0cm9rZS13aWR0aDoyIi8+PHRleHQgeD0iMTU4OSIgeT0iMjUzIiBmaWxsPSIjNjc2YzdlIiBjbGFzcz0idGV4dC1pdGFsaWMgZmlsbC1OMiIgc3R5bGU9InRleHQtYW5jaG9yOm1pZGRsZTtmb250LXNpemU6MTZweCI+5pivPC90ZXh0PjwvZz48ZyBjbGFzcz0iS0dOaGJtUWdMU1puZERzZ2JtOHBXekJkIj48cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwZDMyYjIiIG1hcmtlci1lbmQ9InVybCgjbWstZDItMjQ4MDI3NjYwNC0zNDg4Mzc4MTM0KSIgZD0iTTE0NjEuOTA4IDE2MS40QzE1NzguOCAxMjQuNiAxNjI0LjIgMTE1LjIgMTY4MyAxMTUuMDEyIiBjbGFzcz0iY29ubmVjdGlvbiBzdHJva2UtQjEiIG1hc2s9InVybCgjZDItMjQ4MDI3NjYwNCkiIHN0eWxlPSJzdHJva2Utd2lkdGg6MiIvPjx0ZXh0IHg9IjE1NzEiIHk9IjEzMiIgZmlsbD0iIzY3NmM3ZSIgY2xhc3M9InRleHQtaXRhbGljIGZpbGwtTjIiIHN0eWxlPSJ0ZXh0LWFuY2hvcjptaWRkbGU7Zm9udC1zaXplOjE2cHgiPuWQpjwvdGV4dD48L2c+PGcgY2xhc3M9IktIUm9JQzBtWjNRN0lHTm9heWxiTUYwPSI+PHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMGQzMmIyIiBtYXJrZXItZW5kPSJ1cmwoI21rLWQyLTI0ODAyNzY2MDQtMzQ4ODM3ODEzNCkiIGQ9Ik0xODg1LjUgMjU1LjI1YzgwLjQgMCAxMTQuNy0uMDUgMTY1LjUtLjIzNSIgY2xhc3M9ImNvbm5lY3Rpb24gc3Ryb2tlLUIxIiBtYXNrPSJ1cmwoI2QyLTI0ODAyNzY2MDQpIiBzdHlsZT0ic3Ryb2tlLXdpZHRoOjIiLz48L2c+PGcgY2xhc3M9IktHTm9heUF0Sm1kME95QnZheWxiTUYwPSI+PHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMGQzMmIyIiBtYXJrZXItZW5kPSJ1cmwoI21rLWQyLTI0ODAyNzY2MDQtMzQ4ODM3ODEzNCkiIGQ9Ik0yMjMxLjk4OCAyNjUuMjJDMjMwOCAyNzMuNiAyMzQzLjIgMjc1LjggMjQwMiAyNzUuOTg2IiBjbGFzcz0iY29ubmVjdGlvbiBzdHJva2UtQjEiIG1hc2s9InVybCgjZDItMjQ4MDI3NjYwNCkiIHN0eWxlPSJzdHJva2Utd2lkdGg6MiIvPjx0ZXh0IHg9IjIzMTgiIHk9IjI4MCIgZmlsbD0iIzY3NmM3ZSIgY2xhc3M9InRleHQtaXRhbGljIGZpbGwtTjIiIHN0eWxlPSJ0ZXh0LWFuY2hvcjptaWRkbGU7Zm9udC1zaXplOjE2cHgiPuaYrzwvdGV4dD48L2c+PGcgY2xhc3M9IktHTm9heUF0Sm1kME95QnNaVzBwV3pCZCI+PHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMGQzMmIyIiBtYXJrZXItZW5kPSJ1cmwoI21rLWQyLTI0ODAyNzY2MDQtMzQ4ODM3ODEzNCkiIGQ9Ik0yMTk4Ljc0NCAyMjguMDIxQzIzMDEuNCAxNzAuNCAyMzQ4LjUgMTQwLjk1IDI0MjkuMjMgODQuMDU0IiBjbGFzcz0iY29ubmVjdGlvbiBzdHJva2UtQjEiIG1hc2s9InVybCgjZDItMjQ4MDI3NjYwNCkiIHN0eWxlPSJzdHJva2Utd2lkdGg6MiIvPjx0ZXh0IHg9IjIzMTgiIHk9IjE2NiIgZmlsbD0iIzY3NmM3ZSIgY2xhc3M9InRleHQtaXRhbGljIGZpbGwtTjIiIHN0eWxlPSJ0ZXh0LWFuY2hvcjptaWRkbGU7Zm9udC1zaXplOjE2cHgiPuWQpjwvdGV4dD48L2c+PGcgY2xhc3M9IktHeGxiU0F0Sm1kME95QmpaR05zS1Zzd1hRPT0iPjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzBkMzJiMiIgbWFya2VyLWVuZD0idXJsKCNtay1kMi0yNDgwMjc2NjA0LTM0ODgzNzgxMzQpIiBkPSJNMjQxMi41MDggMzMuNTY3QzIzNDQuOSAyNy4zNSAyMjkyLjQgMjUuNzUgMjIzOS43NSAyNS43NWgtNzQyYy02Ni40NSAwLTM0Mi4zNjcgMTQuNzUtNDE5LjYwNyA3MS4zODUiIGNsYXNzPSJjb25uZWN0aW9uIHN0cm9rZS1CMSIgbWFzaz0idXJsKCNkMi0yNDgwMjc2NjA0KSIgc3R5bGU9InN0cm9rZS13aWR0aDoyIi8+PHRleHQgeD0iMTczNS41IiB5PSIzMSIgZmlsbD0iIzY3NmM3ZSIgY2xhc3M9InRleHQtaXRhbGljIGZpbGwtTjIiIHN0eWxlPSJ0ZXh0LWFuY2hvcjptaWRkbGU7Zm9udC1zaXplOjE2cHgiPuWtpuS5oOW5tuWbnui3szwvdGV4dD48L2c+PG1hc2sgaWQ9ImQyLTI0ODAyNzY2MDQiIHdpZHRoPSIyNTc4IiBoZWlnaHQ9IjMyMCIgeD0iLTEiIHk9Ii0xIiBtYXNrVW5pdHM9InVzZXJTcGFjZU9uVXNlIj48cGF0aCBmaWxsPSIjZmZmIiBkPSJNLTEtMWgyNTc4djMyMEgtMXoiLz48cGF0aCBkPSJNMTU3NyAyMzdoMjR2MjFoLTI0ek0xNTU5IDExNmgyNHYyMWgtMjR6TTIzMDYgMjY0aDI0djIxaC0yNHpNMjMwNiAxNTBoMjR2MjFoLTI0ek0xNjg1IDE1aDEwMXYyMWgtMTAxeiIvPjwvbWFzaz48L3N2Zz48L3N2Zz4=",[11,9800,9801],{},"用一句话概括这个循环：",[9803,9804,9805,9808,9811,9814,9817,9820],"ol",{},[2483,9806,9807],{},"把公式里的每个理论原子替换成一个命题变量，得到一个纯布尔公式；",[2483,9809,9810],{},"让 SAT 求解器找一个布尔模型；",[2483,9812,9813],{},"把布尔模型翻译回理论原子的真假，交给理论求解器检查；",[2483,9815,9816],{},"如果理论层说「一致」，就得到 sat 和模型；",[2483,9818,9819],{},"如果理论层说「冲突」，就把冲突总结成一条新的布尔子句，塞回 SAT 层，让它换个方向再搜；",[2483,9821,9822],{},"如果 SAT 层把所有可能性都穷尽了，就得到 unsat。",[11,9824,9825],{},"可以把它想象成一个总承包商和几个专业工种的协作：总承包商（SAT）负责排期和组合，电工、水管工（理论求解器）负责检查自己那部分是否可行。电工说「这个排期下电线会短路」，总承包商就把这条经验记下来，换一个排期重新试。",[419,9827,9829],{"id":9828},"_42-布尔抽象","4.2 布尔抽象",[11,9831,9832],{},"布尔抽象（也叫 propositional abstraction）是两层之间的接口。",[11,9834,9835],{},"以这个公式为例：",[28,9837,9839],{"className":9838,"translate":193},[192],[28,9840,9842,9896],{"className":9841,"translate":193},[197],[28,9843,9845],{"className":9844},[201],[203,9846,9847],{"xmlns":205,"display":206},[208,9848,9849,9893],{},[211,9850,9851,9853,9855,9857,9859,9861,9863,9865,9867,9869,9871,9873,9875,9877,9879,9881,9883,9885,9887,9889,9891],{},[214,9852,510],{},[217,9854,83],{},[217,9856,43],{"stretchy":241},[214,9858,176],{},[217,9860,130],{},[224,9862,89],{},[217,9864,937],{},[214,9866,180],{},[217,9868,130],{},[224,9870,89],{},[217,9872,1522],{"stretchy":241},[228,9874,230],{},[217,9876,233],{},[228,9878,230],{},[217,9880,43],{"stretchy":241},[214,9882,176],{},[217,9884,124],{},[214,9886,180],{},[217,9888,1383],{},[224,9890,89],{},[217,9892,1522],{"stretchy":241},[253,9894,9895],{"encoding":255},"\\varphi = (x > 0 \\vee y > 0) \\;\\wedge\\; (x + y \u003C 0)",[28,9897,9899,9917,9938,9956,9974,10001,10022,10040],{"className":9898,"ariaHidden":261},[260],[28,9900,9902,9905,9908,9911,9914],{"className":9901},[265],[28,9903],{"className":9904,"style":612},[269],[28,9906,510],{"className":9907},[274,275],[28,9909],{"className":9910,"style":302},[279],[28,9912,83],{"className":9913},[306],[28,9915],{"className":9916,"style":302},[279],[28,9918,9920,9923,9926,9929,9932,9935],{"className":9919},[265],[28,9921],{"className":9922,"style":341},[269],[28,9924,43],{"className":9925},[348],[28,9927,176],{"className":9928},[274,275],[28,9930],{"className":9931,"style":302},[279],[28,9933,130],{"className":9934},[306],[28,9936],{"className":9937,"style":302},[279],[28,9939,9941,9944,9947,9950,9953],{"className":9940},[265],[28,9942],{"className":9943,"style":316},[269],[28,9945,89],{"className":9946},[274],[28,9948],{"className":9949,"style":280},[279],[28,9951,937],{"className":9952},[284],[28,9954],{"className":9955,"style":280},[279],[28,9957,9959,9962,9965,9968,9971],{"className":9958},[265],[28,9960],{"className":9961,"style":294},[269],[28,9963,180],{"className":9964,"style":298},[274,275],[28,9966],{"className":9967,"style":302},[279],[28,9969,130],{"className":9970},[306],[28,9972],{"className":9973,"style":302},[279],[28,9975,9977,9980,9983,9986,9989,9992,9995,9998],{"className":9976},[265],[28,9978],{"className":9979,"style":341},[269],[28,9981,89],{"className":9982},[274],[28,9984,1522],{"className":9985},[355],[28,9987],{"className":9988,"style":302},[279],[28,9990],{"className":9991,"style":280},[279],[28,9993,233],{"className":9994},[284],[28,9996],{"className":9997,"style":302},[279],[28,9999],{"className":10000,"style":280},[279],[28,10002,10004,10007,10010,10013,10016,10019],{"className":10003},[265],[28,10005],{"className":10006,"style":341},[269],[28,10008,43],{"className":10009},[348],[28,10011,176],{"className":10012},[274,275],[28,10014],{"className":10015,"style":280},[279],[28,10017,124],{"className":10018},[284],[28,10020],{"className":10021,"style":280},[279],[28,10023,10025,10028,10031,10034,10037],{"className":10024},[265],[28,10026],{"className":10027,"style":294},[269],[28,10029,180],{"className":10030,"style":298},[274,275],[28,10032],{"className":10033,"style":302},[279],[28,10035,1383],{"className":10036},[306],[28,10038],{"className":10039,"style":302},[279],[28,10041,10043,10046,10049],{"className":10042},[265],[28,10044],{"className":10045,"style":341},[269],[28,10047,89],{"className":10048},[274],[28,10050,1522],{"className":10051},[355],[11,10053,10054],{},"引入三个命题变量：",[28,10056,10058],{"className":10057,"translate":193},[192],[28,10059,10061,10128],{"className":10060,"translate":193},[197],[28,10062,10064],{"className":10063},[201],[203,10065,10066],{"xmlns":205,"display":206},[208,10067,10068,10125],{},[211,10069,10070,10072,10075,10077,10079,10081,10083,10085,10087,10089,10091,10093,10095,10097,10099,10101,10103,10105,10107,10109,10111,10113,10115,10117,10119,10121,10123],{},[214,10071,11],{},[217,10073,10074],{},"≡",[217,10076,43],{"stretchy":241},[214,10078,176],{},[217,10080,130],{},[224,10082,89],{},[217,10084,1522],{"stretchy":241},[217,10086,1683],{"separator":261},[279,10088],{"width":4053},[214,10090,1829],{},[217,10092,10074],{},[217,10094,43],{"stretchy":241},[214,10096,180],{},[217,10098,130],{},[224,10100,89],{},[217,10102,1522],{"stretchy":241},[217,10104,1683],{"separator":261},[279,10106],{"width":4053},[214,10108,1867],{},[217,10110,10074],{},[217,10112,43],{"stretchy":241},[214,10114,176],{},[217,10116,124],{},[214,10118,180],{},[217,10120,1383],{},[224,10122,89],{},[217,10124,1522],{"stretchy":241},[253,10126,10127],{"encoding":255},"p \\equiv (x > 0), \\qquad q \\equiv (y > 0), \\qquad r \\equiv (x + y \u003C 0)",[28,10129,10131,10150,10171,10204,10225,10258,10279,10297],{"className":10130,"ariaHidden":261},[260],[28,10132,10134,10138,10141,10144,10147],{"className":10133},[265],[28,10135],{"className":10136,"style":10137},[269],"height:0.6582em;vertical-align:-0.1944em;",[28,10139,11],{"className":10140},[274,275],[28,10142],{"className":10143,"style":302},[279],[28,10145,10074],{"className":10146},[306],[28,10148],{"className":10149,"style":302},[279],[28,10151,10153,10156,10159,10162,10165,10168],{"className":10152},[265],[28,10154],{"className":10155,"style":341},[269],[28,10157,43],{"className":10158},[348],[28,10160,176],{"className":10161},[274,275],[28,10163],{"className":10164,"style":302},[279],[28,10166,130],{"className":10167},[306],[28,10169],{"className":10170,"style":302},[279],[28,10172,10174,10177,10180,10183,10186,10189,10192,10195,10198,10201],{"className":10173},[265],[28,10175],{"className":10176,"style":341},[269],[28,10178,89],{"className":10179},[274],[28,10181,1522],{"className":10182},[355],[28,10184,1683],{"className":10185},[1723],[28,10187],{"className":10188,"style":4222},[279],[28,10190],{"className":10191,"style":530},[279],[28,10193,1829],{"className":10194,"style":298},[274,275],[28,10196],{"className":10197,"style":302},[279],[28,10199,10074],{"className":10200},[306],[28,10202],{"className":10203,"style":302},[279],[28,10205,10207,10210,10213,10216,10219,10222],{"className":10206},[265],[28,10208],{"className":10209,"style":341},[269],[28,10211,43],{"className":10212},[348],[28,10214,180],{"className":10215,"style":298},[274,275],[28,10217],{"className":10218,"style":302},[279],[28,10220,130],{"className":10221},[306],[28,10223],{"className":10224,"style":302},[279],[28,10226,10228,10231,10234,10237,10240,10243,10246,10249,10252,10255],{"className":10227},[265],[28,10229],{"className":10230,"style":341},[269],[28,10232,89],{"className":10233},[274],[28,10235,1522],{"className":10236},[355],[28,10238,1683],{"className":10239},[1723],[28,10241],{"className":10242,"style":4222},[279],[28,10244],{"className":10245,"style":530},[279],[28,10247,1867],{"className":10248,"style":2279},[274,275],[28,10250],{"className":10251,"style":302},[279],[28,10253,10074],{"className":10254},[306],[28,10256],{"className":10257,"style":302},[279],[28,10259,10261,10264,10267,10270,10273,10276],{"className":10260},[265],[28,10262],{"className":10263,"style":341},[269],[28,10265,43],{"className":10266},[348],[28,10268,176],{"className":10269},[274,275],[28,10271],{"className":10272,"style":280},[279],[28,10274,124],{"className":10275},[284],[28,10277],{"className":10278,"style":280},[279],[28,10280,10282,10285,10288,10291,10294],{"className":10281},[265],[28,10283],{"className":10284,"style":294},[269],[28,10286,180],{"className":10287,"style":298},[274,275],[28,10289],{"className":10290,"style":302},[279],[28,10292,1383],{"className":10293},[306],[28,10295],{"className":10296,"style":302},[279],[28,10298,10300,10303,10306],{"className":10299},[265],[28,10301],{"className":10302,"style":341},[269],[28,10304,89],{"className":10305},[274],[28,10307,1522],{"className":10308},[355],[11,10310,10311],{},"布尔骨架变成：",[28,10313,10315],{"className":10314,"translate":193},[192],[28,10316,10318,10348],{"className":10317,"translate":193},[197],[28,10319,10321],{"className":10320},[201],[203,10322,10323],{"xmlns":205,"display":206},[208,10324,10325,10345],{},[211,10326,10327,10329,10331,10333,10335,10337,10339,10341,10343],{},[217,10328,43],{"stretchy":241},[214,10330,11],{},[217,10332,937],{},[214,10334,1829],{},[217,10336,1522],{"stretchy":241},[228,10338,230],{},[217,10340,233],{},[228,10342,230],{},[214,10344,1867],{},[253,10346,10347],{"encoding":255},"(p \\vee q) \\;\\wedge\\; r",[28,10349,10351,10372,10399],{"className":10350,"ariaHidden":261},[260],[28,10352,10354,10357,10360,10363,10366,10369],{"className":10353},[265],[28,10355],{"className":10356,"style":341},[269],[28,10358,43],{"className":10359},[348],[28,10361,11],{"className":10362},[274,275],[28,10364],{"className":10365,"style":280},[279],[28,10367,937],{"className":10368},[284],[28,10370],{"className":10371,"style":280},[279],[28,10373,10375,10378,10381,10384,10387,10390,10393,10396],{"className":10374},[265],[28,10376],{"className":10377,"style":341},[269],[28,10379,1829],{"className":10380,"style":298},[274,275],[28,10382,1522],{"className":10383},[355],[28,10385],{"className":10386,"style":302},[279],[28,10388],{"className":10389,"style":280},[279],[28,10391,233],{"className":10392},[284],[28,10394],{"className":10395,"style":302},[279],[28,10397],{"className":10398,"style":280},[279],[28,10400,10402,10405],{"className":10401},[265],[28,10403],{"className":10404,"style":645},[269],[28,10406,1867],{"className":10407,"style":2279},[274,275],[11,10409,10410,10411,10492,10493,10614],{},"SAT 求解器在这个骨架上的搜索空间只有 ",[28,10412,10414,10436],{"className":10413,"translate":193},[197],[28,10415,10417],{"className":10416},[201],[203,10418,10419],{"xmlns":205},[208,10420,10421,10433],{},[211,10422,10423,10429,10431],{},[3054,10424,10425,10427],{},[224,10426,1253],{},[224,10428,3400],{},[217,10430,83],{},[224,10432,5236],{},[253,10434,10435],{"encoding":255},"2^3 = 8",[28,10437,10439,10483],{"className":10438,"ariaHidden":261},[260],[28,10440,10442,10445,10474,10477,10480],{"className":10441},[265],[28,10443],{"className":10444,"style":5477},[269],[28,10446,10448,10451],{"className":10447},[274],[28,10449,1253],{"className":10450},[274],[28,10452,10454],{"className":10453},[556],[28,10455,10457],{"className":10456},[560],[28,10458,10460],{"className":10459},[565],[28,10461,10463],{"className":10462,"style":5477},[569],[28,10464,10465,10468],{"style":3094},[28,10466],{"className":10467,"style":578},[577],[28,10469,10471],{"className":10470},[582,583,584,585],[28,10472,3400],{"className":10473},[274,585],[28,10475],{"className":10476,"style":302},[279],[28,10478,83],{"className":10479},[306],[28,10481],{"className":10482,"style":302},[279],[28,10484,10486,10489],{"className":10485},[265],[28,10487],{"className":10488,"style":316},[269],[28,10490,5236],{"className":10491},[274]," 种赋值。它先试 ",[28,10494,10496,10530],{"className":10495,"translate":193},[197],[28,10497,10499],{"className":10498},[201],[203,10500,10501],{"xmlns":205},[208,10502,10503,10527],{},[211,10504,10505,10507,10509,10511,10513,10515,10517,10519,10521,10523,10525],{},[214,10506,11],{},[217,10508,83],{},[214,10510,884],{"mathvariant":484},[217,10512,1683],{"separator":261},[214,10514,1829],{},[217,10516,83],{},[214,10518,884],{"mathvariant":484},[217,10520,1683],{"separator":261},[214,10522,1867],{},[217,10524,83],{},[214,10526,884],{"mathvariant":484},[253,10528,10529],{"encoding":255},"p = \\top, q = \\top, r = \\top",[28,10531,10533,10551,10578,10605],{"className":10532,"ariaHidden":261},[260],[28,10534,10536,10539,10542,10545,10548],{"className":10535},[265],[28,10537],{"className":10538,"style":612},[269],[28,10540,11],{"className":10541},[274,275],[28,10543],{"className":10544,"style":302},[279],[28,10546,83],{"className":10547},[306],[28,10549],{"className":10550,"style":302},[279],[28,10552,10554,10557,10560,10563,10566,10569,10572,10575],{"className":10553},[265],[28,10555],{"className":10556,"style":2371},[269],[28,10558,884],{"className":10559},[274],[28,10561,1683],{"className":10562},[1723],[28,10564],{"className":10565,"style":530},[279],[28,10567,1829],{"className":10568,"style":298},[274,275],[28,10570],{"className":10571,"style":302},[279],[28,10573,83],{"className":10574},[306],[28,10576],{"className":10577,"style":302},[279],[28,10579,10581,10584,10587,10590,10593,10596,10599,10602],{"className":10580},[265],[28,10582],{"className":10583,"style":2371},[269],[28,10585,884],{"className":10586},[274],[28,10588,1683],{"className":10589},[1723],[28,10591],{"className":10592,"style":530},[279],[28,10594,1867],{"className":10595,"style":2279},[274,275],[28,10597],{"className":10598,"style":302},[279],[28,10600,83],{"className":10601},[306],[28,10603],{"className":10604,"style":302},[279],[28,10606,10608,10611],{"className":10607},[265],[28,10609],{"className":10610,"style":7448},[269],[28,10612,884],{"className":10613},[274],"，把这三个真值交回理论层。",[11,10616,10617,10618,10621],{},"理论层看到的是三个",[183,10619,10620],{},"文字","（literal）：",[28,10623,10625],{"className":10624,"translate":193},[192],[28,10626,10628,10670],{"className":10627,"translate":193},[197],[28,10629,10631],{"className":10630},[201],[203,10632,10633],{"xmlns":205,"display":206},[208,10634,10635,10667],{},[211,10636,10637,10639,10641,10643,10645,10647,10649,10651,10653,10655,10657,10659,10661,10663,10665],{},[214,10638,176],{},[217,10640,130],{},[224,10642,89],{},[217,10644,1683],{"separator":261},[279,10646],{"width":4053},[214,10648,180],{},[217,10650,130],{},[224,10652,89],{},[217,10654,1683],{"separator":261},[279,10656],{"width":4053},[214,10658,176],{},[217,10660,124],{},[214,10662,180],{},[217,10664,1383],{},[224,10666,89],{},[253,10668,10669],{"encoding":255},"x > 0, \\qquad y > 0, \\qquad x + y \u003C 0",[28,10671,10673,10691,10721,10751,10769],{"className":10672,"ariaHidden":261},[260],[28,10674,10676,10679,10682,10685,10688],{"className":10675},[265],[28,10677],{"className":10678,"style":2616},[269],[28,10680,176],{"className":10681},[274,275],[28,10683],{"className":10684,"style":302},[279],[28,10686,130],{"className":10687},[306],[28,10689],{"className":10690,"style":302},[279],[28,10692,10694,10697,10700,10703,10706,10709,10712,10715,10718],{"className":10693},[265],[28,10695],{"className":10696,"style":8494},[269],[28,10698,89],{"className":10699},[274],[28,10701,1683],{"className":10702},[1723],[28,10704],{"className":10705,"style":4222},[279],[28,10707],{"className":10708,"style":530},[279],[28,10710,180],{"className":10711,"style":298},[274,275],[28,10713],{"className":10714,"style":302},[279],[28,10716,130],{"className":10717},[306],[28,10719],{"className":10720,"style":302},[279],[28,10722,10724,10727,10730,10733,10736,10739,10742,10745,10748],{"className":10723},[265],[28,10725],{"className":10726,"style":8494},[269],[28,10728,89],{"className":10729},[274],[28,10731,1683],{"className":10732},[1723],[28,10734],{"className":10735,"style":4222},[279],[28,10737],{"className":10738,"style":530},[279],[28,10740,176],{"className":10741},[274,275],[28,10743],{"className":10744,"style":280},[279],[28,10746,124],{"className":10747},[284],[28,10749],{"className":10750,"style":280},[279],[28,10752,10754,10757,10760,10763,10766],{"className":10753},[265],[28,10755],{"className":10756,"style":294},[269],[28,10758,180],{"className":10759,"style":298},[274,275],[28,10761],{"className":10762,"style":302},[279],[28,10764,1383],{"className":10765},[306],[28,10767],{"className":10768,"style":302},[279],[28,10770,10772,10775],{"className":10771},[265],[28,10773],{"className":10774,"style":316},[269],[28,10776,89],{"className":10777},[274],[11,10779,10780,10781,10854,10855,2923],{},"线性算术求解器立刻发现：前两个推出 ",[28,10782,10784,10806],{"className":10783,"translate":193},[197],[28,10785,10787],{"className":10786},[201],[203,10788,10789],{"xmlns":205},[208,10790,10791,10803],{},[211,10792,10793,10795,10797,10799,10801],{},[214,10794,176],{},[217,10796,124],{},[214,10798,180],{},[217,10800,130],{},[224,10802,89],{},[253,10804,10805],{"encoding":255},"x + y > 0",[28,10807,10809,10827,10845],{"className":10808,"ariaHidden":261},[260],[28,10810,10812,10815,10818,10821,10824],{"className":10811},[265],[28,10813],{"className":10814,"style":270},[269],[28,10816,176],{"className":10817},[274,275],[28,10819],{"className":10820,"style":280},[279],[28,10822,124],{"className":10823},[284],[28,10825],{"className":10826,"style":280},[279],[28,10828,10830,10833,10836,10839,10842],{"className":10829},[265],[28,10831],{"className":10832,"style":294},[269],[28,10834,180],{"className":10835,"style":298},[274,275],[28,10837],{"className":10838,"style":302},[279],[28,10840,130],{"className":10841},[306],[28,10843],{"className":10844,"style":302},[279],[28,10846,10848,10851],{"className":10847},[265],[28,10849],{"className":10850,"style":316},[269],[28,10852,89],{"className":10853},[274],"，与第三个矛盾。这是一次",[183,10856,10857],{},"理论冲突",[11,10859,10860,10861,10912,10913,10979,10980,11031,11032,11166],{},"注意，理论层收到的不是「原子为真」，而是「带正负号的文字」。",[28,10862,10864,10882],{"className":10863,"translate":193},[197],[28,10865,10867],{"className":10866},[201],[203,10868,10869],{"xmlns":205},[208,10870,10871,10879],{},[211,10872,10873,10875,10877],{},[214,10874,1829],{},[217,10876,83],{},[214,10878,894],{"mathvariant":484},[253,10880,10881],{"encoding":255},"q = \\bot",[28,10883,10885,10903],{"className":10884,"ariaHidden":261},[260],[28,10886,10888,10891,10894,10897,10900],{"className":10887},[265],[28,10889],{"className":10890,"style":612},[269],[28,10892,1829],{"className":10893,"style":298},[274,275],[28,10895],{"className":10896,"style":302},[279],[28,10898,83],{"className":10899},[306],[28,10901],{"className":10902,"style":302},[279],[28,10904,10906,10909],{"className":10905},[265],[28,10907],{"className":10908,"style":7448},[269],[28,10910,894],{"className":10911},[274]," 对应的是 ",[28,10914,10916,10940],{"className":10915,"translate":193},[197],[28,10917,10919],{"className":10918},[201],[203,10920,10921],{"xmlns":205},[208,10922,10923,10937],{},[211,10924,10925,10927,10929,10931,10933,10935],{},[214,10926,912],{"mathvariant":484},[217,10928,43],{"stretchy":241},[214,10930,180],{},[217,10932,130],{},[224,10934,89],{},[217,10936,1522],{"stretchy":241},[253,10938,10939],{"encoding":255},"\\neg(y > 0)",[28,10941,10943,10967],{"className":10942,"ariaHidden":261},[260],[28,10944,10946,10949,10952,10955,10958,10961,10964],{"className":10945},[265],[28,10947],{"className":10948,"style":341},[269],[28,10950,912],{"className":10951},[274],[28,10953,43],{"className":10954},[348],[28,10956,180],{"className":10957,"style":298},[274,275],[28,10959],{"className":10960,"style":302},[279],[28,10962,130],{"className":10963},[306],[28,10965],{"className":10966,"style":302},[279],[28,10968,10970,10973,10976],{"className":10969},[265],[28,10971],{"className":10972,"style":341},[269],[28,10974,89],{"className":10975},[274],[28,10977,1522],{"className":10978},[355],"，也就是 ",[28,10981,10983,11001],{"className":10982,"translate":193},[197],[28,10984,10986],{"className":10985},[201],[203,10987,10988],{"xmlns":205},[208,10989,10990,10998],{},[211,10991,10992,10994,10996],{},[214,10993,180],{},[217,10995,1876],{},[224,10997,89],{},[253,10999,11000],{"encoding":255},"y \\le 0",[28,11002,11004,11022],{"className":11003,"ariaHidden":261},[260],[28,11005,11007,11010,11013,11016,11019],{"className":11006},[265],[28,11008],{"className":11009,"style":2450},[269],[28,11011,180],{"className":11012,"style":298},[274,275],[28,11014],{"className":11015,"style":302},[279],[28,11017,1876],{"className":11018},[306],[28,11020],{"className":11021,"style":302},[279],[28,11023,11025,11028],{"className":11024},[265],[28,11026],{"className":11027,"style":316},[269],[28,11029,89],{"className":11030},[274],"。理论求解器必须能处理这种否定形式，这也是为什么它通常直接操作形如 ",[28,11033,11035,11061],{"className":11034,"translate":193},[197],[28,11036,11038],{"className":11037},[201],[203,11039,11040],{"xmlns":205},[208,11041,11042,11058],{},[211,11043,11044,11050,11052],{},[501,11045,11046,11048],{},[214,11047,1241],{},[224,11049,1244],{},[217,11051,1876],{},[501,11053,11054,11056],{},[214,11055,1241],{},[224,11057,1253],{},[253,11059,11060],{"encoding":255},"t_1 \\le t_2",[28,11062,11064,11120],{"className":11063,"ariaHidden":261},[260],[28,11065,11067,11071,11111,11114,11117],{"className":11066},[265],[28,11068],{"className":11069,"style":11070},[269],"height:0.786em;vertical-align:-0.15em;",[28,11072,11074,11077],{"className":11073},[274],[28,11075,1241],{"className":11076},[274,275],[28,11078,11080],{"className":11079},[556],[28,11081,11083,11103],{"className":11082},[560,561],[28,11084,11086,11100],{"className":11085},[565],[28,11087,11089],{"className":11088,"style":1285},[569],[28,11090,11091,11094],{"style":573},[28,11092],{"className":11093,"style":578},[577],[28,11095,11097],{"className":11096},[582,583,584,585],[28,11098,1244],{"className":11099},[274,585],[28,11101,593],{"className":11102},[592],[28,11104,11106],{"className":11105},[565],[28,11107,11109],{"className":11108,"style":600},[569],[28,11110],{},[28,11112],{"className":11113,"style":302},[279],[28,11115,1876],{"className":11116},[306],[28,11118],{"className":11119,"style":302},[279],[28,11121,11123,11126],{"className":11122},[265],[28,11124],{"className":11125,"style":1266},[269],[28,11127,11129,11132],{"className":11128},[274],[28,11130,1241],{"className":11131},[274,275],[28,11133,11135],{"className":11134},[556],[28,11136,11138,11158],{"className":11137},[560,561],[28,11139,11141,11155],{"className":11140},[565],[28,11142,11144],{"className":11143,"style":1285},[569],[28,11145,11146,11149],{"style":573},[28,11147],{"className":11148,"style":578},[577],[28,11150,11152],{"className":11151},[582,583,584,585],[28,11153,1253],{"className":11154},[274,585],[28,11156,593],{"className":11157},[592],[28,11159,11161],{"className":11160},[565],[28,11162,11164],{"className":11163,"style":600},[569],[28,11165],{}," 的不等式，而不是只处理等式。",[419,11168,11170],{"id":11169},"_43-cdcl","4.3 CDCL",[11,11172,11173],{},"SAT 层用的是 CDCL（冲突驱动子句学习）。它的核心循环大致如下：",[18,11175,11180],{"className":11176,"code":11178,"language":11179},[11177],"language-text","loop:\n    conflict = unit_propagate()      # 单元传播\n    if conflict:\n        if decision_level == 0: return UNSAT\n        lemma = analyze(conflict)    # 冲突分析\n        backtrack()                  # 非时序回跳\n        add_clause(lemma)            # 学习子句\n    else:\n        if all_variables_assigned(): return SAT\n        decide()                     # 选一个未赋值的变量\n","text",[25,11181,11178],{"__ignoreMap":23},[11,11183,11184],{},"三个关键机制：",[2480,11186,11187,11193,11199],{},[2483,11188,11189,11192],{},[183,11190,11191],{},"单元传播","：一条子句里只剩一个未赋值的文字时，强制它取能让子句为真的值。",[2483,11194,11195,11198],{},[183,11196,11197],{},"冲突分析","：从冲突出发，反向找出是哪几个决策导致的，生成一条新的子句。这条子句是原公式的逻辑推论，加进去不会改变解集。",[2483,11200,11201,11204],{},[183,11202,11203],{},"非时序回跳","：不退回上一层，而是直接跳回冲突的真正源头，跳过大量无用的搜索。",[11,11206,11207],{},"CDCL 是过去二十年 SAT 求解器性能提升的主要来源。SMT 做的事情，基本上是把这套成熟的工程能力「复用」到理论层。",[419,11209,11211],{"id":11210},"_44-理论求解器","4.4 理论求解器",[11,11213,11214,11215,11218,11219,11247],{},"理论层要做的事情叫 ",[183,11216,11217],{},"T-一致性检查","：给定一组带正负号的原子，判断它们在理论 ",[28,11220,11222,11235],{"className":11221,"translate":193},[197],[28,11223,11225],{"className":11224},[201],[203,11226,11227],{"xmlns":205},[208,11228,11229,11233],{},[211,11230,11231],{},[214,11232,443],{},[253,11234,443],{"encoding":255},[28,11236,11238],{"className":11237,"ariaHidden":261},[260],[28,11239,11241,11244],{"className":11240},[265],[28,11242],{"className":11243,"style":455},[269],[28,11245,443],{"className":11246,"style":459},[274,275]," 下是否可能同时为真。",[11,11249,11250],{},"不同理论有不同的算法。",[11252,11253,11255],"h4",{"id":11254},"euf","EUF",[11,11257,11258],{},"EUF（Equality with Uninterpreted Functions）只关心相等关系和函数的一致性。核心是两件事：",[9803,11260,11261,11264],{},[2483,11262,11263],{},"用并查集维护变量的等价类；",[2483,11265,11266,11267,11318,11319,2923],{},"用同余闭包（congruence closure）保证：如果 ",[28,11268,11270,11288],{"className":11269,"translate":193},[197],[28,11271,11273],{"className":11272},[201],[203,11274,11275],{"xmlns":205},[208,11276,11277,11285],{},[211,11278,11279,11281,11283],{},[214,11280,238],{},[217,11282,83],{},[214,11284,3820],{},[253,11286,11287],{"encoding":255},"a = b",[28,11289,11291,11309],{"className":11290,"ariaHidden":261},[260],[28,11292,11294,11297,11300,11303,11306],{"className":11293},[265],[28,11295],{"className":11296,"style":645},[269],[28,11298,238],{"className":11299},[274,275],[28,11301],{"className":11302,"style":302},[279],[28,11304,83],{"className":11305},[306],[28,11307],{"className":11308,"style":302},[279],[28,11310,11312,11315],{"className":11311},[265],[28,11313],{"className":11314,"style":7448},[269],[28,11316,3820],{"className":11317},[274,275],"，那么 ",[28,11320,11322,11352],{"className":11321,"translate":193},[197],[28,11323,11325],{"className":11324},[201],[203,11326,11327],{"xmlns":205},[208,11328,11329,11349],{},[211,11330,11331,11333,11335,11337,11339,11341,11343,11345,11347],{},[214,11332,1511],{},[217,11334,43],{"stretchy":241},[214,11336,238],{},[217,11338,1522],{"stretchy":241},[217,11340,83],{},[214,11342,1511],{},[217,11344,43],{"stretchy":241},[214,11346,3820],{},[217,11348,1522],{"stretchy":241},[253,11350,11351],{"encoding":255},"f(a) = f(b)",[28,11353,11355,11382],{"className":11354,"ariaHidden":261},[260],[28,11356,11358,11361,11364,11367,11370,11373,11376,11379],{"className":11357},[265],[28,11359],{"className":11360,"style":341},[269],[28,11362,1511],{"className":11363,"style":1546},[274,275],[28,11365,43],{"className":11366},[348],[28,11368,238],{"className":11369},[274,275],[28,11371,1522],{"className":11372},[355],[28,11374],{"className":11375,"style":302},[279],[28,11377,83],{"className":11378},[306],[28,11380],{"className":11381,"style":302},[279],[28,11383,11385,11388,11391,11394,11397],{"className":11384},[265],[28,11386],{"className":11387,"style":341},[269],[28,11389,1511],{"className":11390,"style":1546},[274,275],[28,11392,43],{"className":11393},[348],[28,11395,3820],{"className":11396},[274,275],[28,11398,1522],{"className":11399},[355],[11,11401,11402],{},"例子：",[28,11404,11406],{"className":11405,"translate":193},[192],[28,11407,11409,11463],{"className":11408,"translate":193},[197],[28,11410,11412],{"className":11411},[201],[203,11413,11414],{"xmlns":205,"display":206},[208,11415,11416,11460],{},[211,11417,11418,11420,11422,11424,11426,11428,11430,11432,11434,11436,11438,11440,11442,11444,11446,11448,11450,11452,11454,11456,11458],{},[214,11419,238],{},[217,11421,83],{},[214,11423,3820],{},[228,11425,230],{},[217,11427,233],{},[228,11429,230],{},[214,11431,3820],{},[217,11433,83],{},[214,11435,22],{},[228,11437,230],{},[217,11439,233],{},[228,11441,230],{},[214,11443,1511],{},[217,11445,43],{"stretchy":241},[214,11447,238],{},[217,11449,1522],{"stretchy":241},[217,11451,1854],{"mathvariant":484},[214,11453,1511],{},[217,11455,43],{"stretchy":241},[214,11457,22],{},[217,11459,1522],{"stretchy":241},[253,11461,11462],{"encoding":255},"a = b \\;\\wedge\\; b = c \\;\\wedge\\; f(a) \\ne f(c)",[28,11464,11466,11484,11508,11526,11551,11611],{"className":11465,"ariaHidden":261},[260],[28,11467,11469,11472,11475,11478,11481],{"className":11468},[265],[28,11470],{"className":11471,"style":645},[269],[28,11473,238],{"className":11474},[274,275],[28,11476],{"className":11477,"style":302},[279],[28,11479,83],{"className":11480},[306],[28,11482],{"className":11483,"style":302},[279],[28,11485,11487,11490,11493,11496,11499,11502,11505],{"className":11486},[265],[28,11488],{"className":11489,"style":7448},[269],[28,11491,3820],{"className":11492},[274,275],[28,11494],{"className":11495,"style":302},[279],[28,11497],{"className":11498,"style":280},[279],[28,11500,233],{"className":11501},[284],[28,11503],{"className":11504,"style":302},[279],[28,11506],{"className":11507,"style":280},[279],[28,11509,11511,11514,11517,11520,11523],{"className":11510},[265],[28,11512],{"className":11513,"style":7448},[269],[28,11515,3820],{"className":11516},[274,275],[28,11518],{"className":11519,"style":302},[279],[28,11521,83],{"className":11522},[306],[28,11524],{"className":11525,"style":302},[279],[28,11527,11529,11533,11536,11539,11542,11545,11548],{"className":11528},[265],[28,11530],{"className":11531,"style":11532},[269],"height:0.5556em;",[28,11534,22],{"className":11535},[274,275],[28,11537],{"className":11538,"style":302},[279],[28,11540],{"className":11541,"style":280},[279],[28,11543,233],{"className":11544},[284],[28,11546],{"className":11547,"style":302},[279],[28,11549],{"className":11550,"style":280},[279],[28,11552,11554,11557,11560,11563,11566,11569,11572,11608],{"className":11553},[265],[28,11555],{"className":11556,"style":341},[269],[28,11558,1511],{"className":11559,"style":1546},[274,275],[28,11561,43],{"className":11562},[348],[28,11564,238],{"className":11565},[274,275],[28,11567,1522],{"className":11568},[355],[28,11570],{"className":11571,"style":302},[279],[28,11573,11575,11602,11605],{"className":11574},[306],[28,11576,11578],{"className":11577},[306],[28,11579,11581],{"className":11580},[274,2359],[28,11582,11584],{"className":11583},[2363],[28,11585,11587,11590,11599],{"className":11586},[2367],[28,11588],{"className":11589,"style":2371},[269],[28,11591,11593],{"className":11592},[2375],[28,11594,11596],{"className":11595},[274],[28,11597,2382],{"className":11598},[306],[28,11600],{"className":11601},[2386],[28,11603],{"className":11604},[279,2390],[28,11606,83],{"className":11607},[306],[28,11609],{"className":11610,"style":302},[279],[28,11612,11614,11617,11620,11623,11626],{"className":11613},[265],[28,11615],{"className":11616,"style":341},[269],[28,11618,1511],{"className":11619,"style":1546},[274,275],[28,11621,43],{"className":11622},[348],[28,11624,22],{"className":11625},[274,275],[28,11627,1522],{"className":11628},[355],[11,11630,11631,11632,11687,11688,2693,11732,11776,11777,11849],{},"并查集把 ",[28,11633,11635,11657],{"className":11634,"translate":193},[197],[28,11636,11638],{"className":11637},[201],[203,11639,11640],{"xmlns":205},[208,11641,11642,11654],{},[211,11643,11644,11646,11648,11650,11652],{},[214,11645,238],{},[217,11647,1683],{"separator":261},[214,11649,3820],{},[217,11651,1683],{"separator":261},[214,11653,22],{},[253,11655,11656],{"encoding":255},"a, b, c",[28,11658,11660],{"className":11659,"ariaHidden":261},[260],[28,11661,11663,11666,11669,11672,11675,11678,11681,11684],{"className":11662},[265],[28,11664],{"className":11665,"style":2371},[269],[28,11667,238],{"className":11668},[274,275],[28,11670,1683],{"className":11671},[1723],[28,11673],{"className":11674,"style":530},[279],[28,11676,3820],{"className":11677},[274,275],[28,11679,1683],{"className":11680},[1723],[28,11682],{"className":11683,"style":530},[279],[28,11685,22],{"className":11686},[274,275]," 合并成一个类；同余闭包发现 ",[28,11689,11691,11711],{"className":11690,"translate":193},[197],[28,11692,11694],{"className":11693},[201],[203,11695,11696],{"xmlns":205},[208,11697,11698,11708],{},[211,11699,11700,11702,11704,11706],{},[214,11701,1511],{},[217,11703,43],{"stretchy":241},[214,11705,238],{},[217,11707,1522],{"stretchy":241},[253,11709,11710],{"encoding":255},"f(a)",[28,11712,11714],{"className":11713,"ariaHidden":261},[260],[28,11715,11717,11720,11723,11726,11729],{"className":11716},[265],[28,11718],{"className":11719,"style":341},[269],[28,11721,1511],{"className":11722,"style":1546},[274,275],[28,11724,43],{"className":11725},[348],[28,11727,238],{"className":11728},[274,275],[28,11730,1522],{"className":11731},[355],[28,11733,11735,11755],{"className":11734,"translate":193},[197],[28,11736,11738],{"className":11737},[201],[203,11739,11740],{"xmlns":205},[208,11741,11742,11752],{},[211,11743,11744,11746,11748,11750],{},[214,11745,1511],{},[217,11747,43],{"stretchy":241},[214,11749,22],{},[217,11751,1522],{"stretchy":241},[253,11753,11754],{"encoding":255},"f(c)",[28,11756,11758],{"className":11757,"ariaHidden":261},[260],[28,11759,11761,11764,11767,11770,11773],{"className":11760},[265],[28,11762],{"className":11763,"style":341},[269],[28,11765,1511],{"className":11766,"style":1546},[274,275],[28,11768,43],{"className":11769},[348],[28,11771,22],{"className":11772},[274,275],[28,11774,1522],{"className":11775},[355]," 的参数相等，于是把 ",[28,11778,11780,11810],{"className":11779,"translate":193},[197],[28,11781,11783],{"className":11782},[201],[203,11784,11785],{"xmlns":205},[208,11786,11787,11807],{},[211,11788,11789,11791,11793,11795,11797,11799,11801,11803,11805],{},[214,11790,1511],{},[217,11792,43],{"stretchy":241},[214,11794,238],{},[217,11796,1522],{"stretchy":241},[217,11798,1683],{"separator":261},[214,11800,1511],{},[217,11802,43],{"stretchy":241},[214,11804,22],{},[217,11806,1522],{"stretchy":241},[253,11808,11809],{"encoding":255},"f(a), f(c)",[28,11811,11813],{"className":11812,"ariaHidden":261},[260],[28,11814,11816,11819,11822,11825,11828,11831,11834,11837,11840,11843,11846],{"className":11815},[265],[28,11817],{"className":11818,"style":341},[269],[28,11820,1511],{"className":11821,"style":1546},[274,275],[28,11823,43],{"className":11824},[348],[28,11826,238],{"className":11827},[274,275],[28,11829,1522],{"className":11830},[355],[28,11832,1683],{"className":11833},[1723],[28,11835],{"className":11836,"style":530},[279],[28,11838,1511],{"className":11839,"style":1546},[274,275],[28,11841,43],{"className":11842},[348],[28,11844,22],{"className":11845},[274,275],[28,11847,1522],{"className":11848},[355]," 也合并；但公式又要求它们不等，冲突，判 unsat。",[11,11851,11852],{},"EUF 在程序分析里非常有用，因为指针别名、对象身份、类型相等，本质上都是「未解释函数的相等性」。",[11252,11854,11855],{"id":11855},"线性算术",[11,11857,11858,11860],{},[25,11859,2950],{}," 用单纯形法（更准确地说，是 SMT 里常用的 general simplex）。它先维护一组满足所有等式的赋值，再通过枢轴变换（pivot）调整变量的取值，直到所有上下界约束也被满足；如果怎么调都满足不了，就报告冲突。",[11,11862,11863,11865,11866,11869,11870,2693,11933,11996],{},[25,11864,2954],{}," 在此基础上加",[183,11867,11868],{},"分支定界","：先按实数求解，如果解里某个整数变量取了小数，就分裂成两支，比如 ",[28,11871,11873,11897],{"className":11872,"translate":193},[197],[28,11874,11876],{"className":11875},[201],[203,11877,11878],{"xmlns":205},[208,11879,11880,11894],{},[211,11881,11882,11884,11886,11889,11891],{},[214,11883,176],{},[217,11885,1876],{},[217,11887,11888],{"stretchy":241},"⌊",[214,11890,1693],{},[217,11892,11893],{"stretchy":241},"⌋",[253,11895,11896],{"encoding":255},"x \\le \\lfloor v \\rfloor",[28,11898,11900,11918],{"className":11899,"ariaHidden":261},[260],[28,11901,11903,11906,11909,11912,11915],{"className":11902},[265],[28,11904],{"className":11905,"style":3010},[269],[28,11907,176],{"className":11908},[274,275],[28,11910],{"className":11911,"style":302},[279],[28,11913,1876],{"className":11914},[306],[28,11916],{"className":11917,"style":302},[279],[28,11919,11921,11924,11927,11930],{"className":11920},[265],[28,11922],{"className":11923,"style":341},[269],[28,11925,11888],{"className":11926},[348],[28,11928,1693],{"className":11929,"style":298},[274,275],[28,11931,11893],{"className":11932},[355],[28,11934,11936,11960],{"className":11935,"translate":193},[197],[28,11937,11939],{"className":11938},[201],[203,11940,11941],{"xmlns":205},[208,11942,11943,11957],{},[211,11944,11945,11947,11949,11952,11954],{},[214,11946,176],{},[217,11948,9572],{},[217,11950,11951],{"stretchy":241},"⌈",[214,11953,1693],{},[217,11955,11956],{"stretchy":241},"⌉",[253,11958,11959],{"encoding":255},"x \\ge \\lceil v \\rceil",[28,11961,11963,11981],{"className":11962,"ariaHidden":261},[260],[28,11964,11966,11969,11972,11975,11978],{"className":11965},[265],[28,11967],{"className":11968,"style":3010},[269],[28,11970,176],{"className":11971},[274,275],[28,11973],{"className":11974,"style":302},[279],[28,11976,9572],{"className":11977},[306],[28,11979],{"className":11980,"style":302},[279],[28,11982,11984,11987,11990,11993],{"className":11983},[265],[28,11985],{"className":11986,"style":341},[269],[28,11988,11951],{"className":11989},[348],[28,11991,1693],{"className":11992,"style":298},[274,275],[28,11994,11956],{"className":11995},[355],"，分别再解。",[11,11998,11402],{},[28,12000,12002],{"className":12001,"translate":193},[192],[28,12003,12005,12062],{"className":12004,"translate":193},[197],[28,12006,12008],{"className":12007},[201],[203,12009,12010],{"xmlns":205,"display":206},[208,12011,12012,12059],{},[211,12013,12014,12016,12018,12020,12022,12024,12026,12028,12030,12032,12034,12036,12038,12040,12042,12044,12046,12048,12050,12052,12055],{},[224,12015,3400],{},[214,12017,176],{},[217,12019,124],{},[224,12021,1253],{},[214,12023,180],{},[217,12025,83],{},[224,12027,251],{},[217,12029,1683],{"separator":261},[279,12031],{"width":4053},[214,12033,176],{},[217,12035,1683],{"separator":261},[214,12037,180],{},[217,12039,9572],{},[224,12041,89],{},[217,12043,1683],{"separator":261},[279,12045],{"width":4053},[214,12047,176],{},[217,12049,1683],{"separator":261},[214,12051,180],{},[217,12053,12054],{},"∈",[214,12056,12058],{"mathvariant":12057},"double-struck","Z",[253,12060,12061],{"encoding":255},"3x + 2y = 5, \\qquad x, y \\ge 0, \\qquad x, y \\in \\mathbb{Z}",[28,12063,12065,12086,12107,12146,12185],{"className":12064,"ariaHidden":261},[260],[28,12066,12068,12071,12074,12077,12080,12083],{"className":12067},[265],[28,12069],{"className":12070,"style":6853},[269],[28,12072,3400],{"className":12073},[274],[28,12075,176],{"className":12076},[274,275],[28,12078],{"className":12079,"style":280},[279],[28,12081,124],{"className":12082},[284],[28,12084],{"className":12085,"style":280},[279],[28,12087,12089,12092,12095,12098,12101,12104],{"className":12088},[265],[28,12090],{"className":12091,"style":8494},[269],[28,12093,1253],{"className":12094},[274],[28,12096,180],{"className":12097,"style":298},[274,275],[28,12099],{"className":12100,"style":302},[279],[28,12102,83],{"className":12103},[306],[28,12105],{"className":12106,"style":302},[279],[28,12108,12110,12113,12116,12119,12122,12125,12128,12131,12134,12137,12140,12143],{"className":12109},[265],[28,12111],{"className":12112,"style":8494},[269],[28,12114,251],{"className":12115},[274],[28,12117,1683],{"className":12118},[1723],[28,12120],{"className":12121,"style":4222},[279],[28,12123],{"className":12124,"style":530},[279],[28,12126,176],{"className":12127},[274,275],[28,12129,1683],{"className":12130},[1723],[28,12132],{"className":12133,"style":530},[279],[28,12135,180],{"className":12136,"style":298},[274,275],[28,12138],{"className":12139,"style":302},[279],[28,12141,9572],{"className":12142},[306],[28,12144],{"className":12145,"style":302},[279],[28,12147,12149,12152,12155,12158,12161,12164,12167,12170,12173,12176,12179,12182],{"className":12148},[265],[28,12150],{"className":12151,"style":8494},[269],[28,12153,89],{"className":12154},[274],[28,12156,1683],{"className":12157},[1723],[28,12159],{"className":12160,"style":4222},[279],[28,12162],{"className":12163,"style":530},[279],[28,12165,176],{"className":12166},[274,275],[28,12168,1683],{"className":12169},[1723],[28,12171],{"className":12172,"style":530},[279],[28,12174,180],{"className":12175,"style":298},[274,275],[28,12177],{"className":12178,"style":302},[279],[28,12180,12054],{"className":12181},[306],[28,12183],{"className":12184,"style":302},[279],[28,12186,12188,12192],{"className":12187},[265],[28,12189],{"className":12190,"style":12191},[269],"height:0.6889em;",[28,12193,12058],{"className":12194},[274,12195],"mathbb",[11,12197,12198,12199,12291,12292,12320],{},"实数松弛下，",[28,12200,12202,12233],{"className":12201,"translate":193},[197],[28,12203,12205],{"className":12204},[201],[203,12206,12207],{"xmlns":205},[208,12208,12209,12230],{},[211,12210,12211,12213,12215,12217,12220,12222,12224,12226,12228],{},[214,12212,176],{},[217,12214,83],{},[224,12216,251],{},[214,12218,12219],{"mathvariant":484},"\u002F",[224,12221,3400],{},[217,12223,1683],{"separator":261},[214,12225,180],{},[217,12227,83],{},[224,12229,89],{},[253,12231,12232],{"encoding":255},"x = 5\u002F3, y = 0",[28,12234,12236,12254,12282],{"className":12235,"ariaHidden":261},[260],[28,12237,12239,12242,12245,12248,12251],{"className":12238},[265],[28,12240],{"className":12241,"style":645},[269],[28,12243,176],{"className":12244},[274,275],[28,12246],{"className":12247,"style":302},[279],[28,12249,83],{"className":12250},[306],[28,12252],{"className":12253,"style":302},[279],[28,12255,12257,12260,12264,12267,12270,12273,12276,12279],{"className":12256},[265],[28,12258],{"className":12259,"style":341},[269],[28,12261,12263],{"className":12262},[274],"5\u002F3",[28,12265,1683],{"className":12266},[1723],[28,12268],{"className":12269,"style":530},[279],[28,12271,180],{"className":12272,"style":298},[274,275],[28,12274],{"className":12275,"style":302},[279],[28,12277,83],{"className":12278},[306],[28,12280],{"className":12281,"style":302},[279],[28,12283,12285,12288],{"className":12284},[265],[28,12286],{"className":12287,"style":316},[269],[28,12289,89],{"className":12290},[274]," 是一个解，但 ",[28,12293,12295,12308],{"className":12294,"translate":193},[197],[28,12296,12298],{"className":12297},[201],[203,12299,12300],{"xmlns":205},[208,12301,12302,12306],{},[211,12303,12304],{},[214,12305,176],{},[253,12307,176],{"encoding":255},[28,12309,12311],{"className":12310,"ariaHidden":261},[260],[28,12312,12314,12317],{"className":12313},[265],[28,12315],{"className":12316,"style":645},[269],[28,12318,176],{"className":12319},[274,275]," 不是整数。分支：",[2480,12322,12323,12671],{},[2483,12324,173,12325,12376,12377,12405,12406,12434,12435,5901,12463,12514,12515,12567,12568,12514,12619,12670],{},[28,12326,12328,12346],{"className":12327,"translate":193},[197],[28,12329,12331],{"className":12330},[201],[203,12332,12333],{"xmlns":205},[208,12334,12335,12343],{},[211,12336,12337,12339,12341],{},[214,12338,176],{},[217,12340,1876],{},[224,12342,1244],{},[253,12344,12345],{"encoding":255},"x \\le 1",[28,12347,12349,12367],{"className":12348,"ariaHidden":261},[260],[28,12350,12352,12355,12358,12361,12364],{"className":12351},[265],[28,12353],{"className":12354,"style":3010},[269],[28,12356,176],{"className":12357},[274,275],[28,12359],{"className":12360,"style":302},[279],[28,12362,1876],{"className":12363},[306],[28,12365],{"className":12366,"style":302},[279],[28,12368,12370,12373],{"className":12369},[265],[28,12371],{"className":12372,"style":316},[269],[28,12374,1244],{"className":12375},[274],"：",[28,12378,12380,12393],{"className":12379,"translate":193},[197],[28,12381,12383],{"className":12382},[201],[203,12384,12385],{"xmlns":205},[208,12386,12387,12391],{},[211,12388,12389],{},[214,12390,176],{},[253,12392,176],{"encoding":255},[28,12394,12396],{"className":12395,"ariaHidden":261},[260],[28,12397,12399,12402],{"className":12398},[265],[28,12400],{"className":12401,"style":645},[269],[28,12403,176],{"className":12404},[274,275]," 只能取 ",[28,12407,12409,12422],{"className":12408,"translate":193},[197],[28,12410,12412],{"className":12411},[201],[203,12413,12414],{"xmlns":205},[208,12415,12416,12420],{},[211,12417,12418],{},[224,12419,89],{},[253,12421,89],{"encoding":255},[28,12423,12425],{"className":12424,"ariaHidden":261},[260],[28,12426,12428,12431],{"className":12427},[265],[28,12429],{"className":12430,"style":316},[269],[28,12432,89],{"className":12433},[274]," 或 ",[28,12436,12438,12451],{"className":12437,"translate":193},[197],[28,12439,12441],{"className":12440},[201],[203,12442,12443],{"xmlns":205},[208,12444,12445,12449],{},[211,12446,12447],{},[224,12448,1244],{},[253,12450,1244],{"encoding":255},[28,12452,12454],{"className":12453,"ariaHidden":261},[260],[28,12455,12457,12460],{"className":12456},[265],[28,12458],{"className":12459,"style":316},[269],[28,12461,1244],{"className":12462},[274],[28,12464,12466,12484],{"className":12465,"translate":193},[197],[28,12467,12469],{"className":12468},[201],[203,12470,12471],{"xmlns":205},[208,12472,12473,12481],{},[211,12474,12475,12477,12479],{},[214,12476,176],{},[217,12478,83],{},[224,12480,89],{},[253,12482,12483],{"encoding":255},"x = 0",[28,12485,12487,12505],{"className":12486,"ariaHidden":261},[260],[28,12488,12490,12493,12496,12499,12502],{"className":12489},[265],[28,12491],{"className":12492,"style":645},[269],[28,12494,176],{"className":12495},[274,275],[28,12497],{"className":12498,"style":302},[279],[28,12500,83],{"className":12501},[306],[28,12503],{"className":12504,"style":302},[279],[28,12506,12508,12511],{"className":12507},[265],[28,12509],{"className":12510,"style":316},[269],[28,12512,89],{"className":12513},[274]," 时 ",[28,12516,12518,12537],{"className":12517,"translate":193},[197],[28,12519,12521],{"className":12520},[201],[203,12522,12523],{"xmlns":205},[208,12524,12525,12534],{},[211,12526,12527,12529,12531],{},[214,12528,180],{},[217,12530,83],{},[224,12532,12533],{},"2.5",[253,12535,12536],{"encoding":255},"y = 2.5",[28,12538,12540,12558],{"className":12539,"ariaHidden":261},[260],[28,12541,12543,12546,12549,12552,12555],{"className":12542},[265],[28,12544],{"className":12545,"style":612},[269],[28,12547,180],{"className":12548,"style":298},[274,275],[28,12550],{"className":12551,"style":302},[279],[28,12553,83],{"className":12554},[306],[28,12556],{"className":12557,"style":302},[279],[28,12559,12561,12564],{"className":12560},[265],[28,12562],{"className":12563,"style":316},[269],[28,12565,12533],{"className":12566},[274]," 仍不是整数，",[28,12569,12571,12589],{"className":12570,"translate":193},[197],[28,12572,12574],{"className":12573},[201],[203,12575,12576],{"xmlns":205},[208,12577,12578,12586],{},[211,12579,12580,12582,12584],{},[214,12581,176],{},[217,12583,83],{},[224,12585,1244],{},[253,12587,12588],{"encoding":255},"x = 1",[28,12590,12592,12610],{"className":12591,"ariaHidden":261},[260],[28,12593,12595,12598,12601,12604,12607],{"className":12594},[265],[28,12596],{"className":12597,"style":645},[269],[28,12599,176],{"className":12600},[274,275],[28,12602],{"className":12603,"style":302},[279],[28,12605,83],{"className":12606},[306],[28,12608],{"className":12609,"style":302},[279],[28,12611,12613,12616],{"className":12612},[265],[28,12614],{"className":12615,"style":316},[269],[28,12617,1244],{"className":12618},[274],[28,12620,12622,12640],{"className":12621,"translate":193},[197],[28,12623,12625],{"className":12624},[201],[203,12626,12627],{"xmlns":205},[208,12628,12629,12637],{},[211,12630,12631,12633,12635],{},[214,12632,180],{},[217,12634,83],{},[224,12636,1244],{},[253,12638,12639],{"encoding":255},"y = 1",[28,12641,12643,12661],{"className":12642,"ariaHidden":261},[260],[28,12644,12646,12649,12652,12655,12658],{"className":12645},[265],[28,12647],{"className":12648,"style":612},[269],[28,12650,180],{"className":12651,"style":298},[274,275],[28,12653],{"className":12654,"style":302},[279],[28,12656,83],{"className":12657},[306],[28,12659],{"className":12660,"style":302},[279],[28,12662,12664,12667],{"className":12663},[265],[28,12665],{"className":12666,"style":316},[269],[28,12668,1244],{"className":12669},[274],"，得到整数解，sat；",[2483,12672,12673,12674,12725],{},"另一支 ",[28,12675,12677,12695],{"className":12676,"translate":193},[197],[28,12678,12680],{"className":12679},[201],[203,12681,12682],{"xmlns":205},[208,12683,12684,12692],{},[211,12685,12686,12688,12690],{},[214,12687,176],{},[217,12689,9572],{},[224,12691,1253],{},[253,12693,12694],{"encoding":255},"x \\ge 2",[28,12696,12698,12716],{"className":12697,"ariaHidden":261},[260],[28,12699,12701,12704,12707,12710,12713],{"className":12700},[265],[28,12702],{"className":12703,"style":3010},[269],[28,12705,176],{"className":12706},[274,275],[28,12708],{"className":12709,"style":302},[279],[28,12711,9572],{"className":12712},[306],[28,12714],{"className":12715,"style":302},[279],[28,12717,12719,12722],{"className":12718},[265],[28,12720],{"className":12721,"style":316},[269],[28,12723,1253],{"className":12724},[274]," 就无须再看了。",[11,12727,12728],{},"如果两支都不可行，就判 unsat。实际求解器还会加上割平面（cut）和更强的预处理，避免分支树爆炸。",[11252,12730,7691],{"id":7691},[11,12732,12733,12735],{},[25,12734,3039],{}," 最常用的方法还是位爆破：把位向量运算展开成门电路，再交给 SAT 层。但因为位向量有固定宽度，这种展开是有限且可预测的。",[11,12737,12738],{},"现代求解器会先做字级重写，把明显恒真的部分消掉，比如：",[28,12740,12742],{"className":12741,"translate":193},[192],[28,12743,12745,12800],{"className":12744,"translate":193},[197],[28,12746,12748],{"className":12747},[201],[203,12749,12750],{"xmlns":205,"display":206},[208,12751,12752,12797],{},[211,12753,12754,12756,12758,12760,12762,12764,12766,12768,12770,12772,12774,12776,12778,12780,12782,12784,12786,12788,12791,12793,12795],{},[214,12755,176],{},[228,12757,488],{},[214,12759,7715],{"mathvariant":484},[228,12761,488],{},[224,12763,89],{},[217,12765,83],{},[224,12767,89],{},[217,12769,1683],{"separator":261},[279,12771],{"width":4053},[214,12773,176],{},[217,12775,5074],{},[214,12777,176],{},[217,12779,83],{},[224,12781,89],{},[217,12783,1683],{"separator":261},[279,12785],{"width":4053},[214,12787,176],{},[217,12789,12790],{},"≪",[224,12792,89],{},[217,12794,83],{},[214,12796,176],{},[253,12798,12799],{"encoding":255},"x \\,\\&\\, 0 = 0, \\qquad x - x = 0, \\qquad x \\ll 0 = x",[28,12801,12803,12833,12863,12881,12911,12929],{"className":12802,"ariaHidden":261},[260],[28,12804,12806,12809,12812,12815,12818,12821,12824,12827,12830],{"className":12805},[265],[28,12807],{"className":12808,"style":7448},[269],[28,12810,176],{"className":12811},[274,275],[28,12813],{"className":12814,"style":530},[279],[28,12816,7715],{"className":12817},[274],[28,12819],{"className":12820,"style":530},[279],[28,12822,89],{"className":12823},[274],[28,12825],{"className":12826,"style":302},[279],[28,12828,83],{"className":12829},[306],[28,12831],{"className":12832,"style":302},[279],[28,12834,12836,12839,12842,12845,12848,12851,12854,12857,12860],{"className":12835},[265],[28,12837],{"className":12838,"style":8494},[269],[28,12840,89],{"className":12841},[274],[28,12843,1683],{"className":12844},[1723],[28,12846],{"className":12847,"style":4222},[279],[28,12849],{"className":12850,"style":530},[279],[28,12852,176],{"className":12853},[274,275],[28,12855],{"className":12856,"style":280},[279],[28,12858,5074],{"className":12859},[284],[28,12861],{"className":12862,"style":280},[279],[28,12864,12866,12869,12872,12875,12878],{"className":12865},[265],[28,12867],{"className":12868,"style":645},[269],[28,12870,176],{"className":12871},[274,275],[28,12873],{"className":12874,"style":302},[279],[28,12876,83],{"className":12877},[306],[28,12879],{"className":12880,"style":302},[279],[28,12882,12884,12887,12890,12893,12896,12899,12902,12905,12908],{"className":12883},[265],[28,12885],{"className":12886,"style":8494},[269],[28,12888,89],{"className":12889},[274],[28,12891,1683],{"className":12892},[1723],[28,12894],{"className":12895,"style":4222},[279],[28,12897],{"className":12898,"style":530},[279],[28,12900,176],{"className":12901},[274,275],[28,12903],{"className":12904,"style":302},[279],[28,12906,12790],{"className":12907},[306],[28,12909],{"className":12910,"style":302},[279],[28,12912,12914,12917,12920,12923,12926],{"className":12913},[265],[28,12915],{"className":12916,"style":316},[269],[28,12918,89],{"className":12919},[274],[28,12921],{"className":12922,"style":302},[279],[28,12924,83],{"className":12925},[306],[28,12927],{"className":12928,"style":302},[279],[28,12930,12932,12935],{"className":12931},[265],[28,12933],{"className":12934,"style":645},[269],[28,12936,176],{"className":12937},[274,275],[11,12939,12940],{},"然后再决定哪些子表达式值得展开。乘法是位向量的难点，因为乘法器电路规模大，求解器通常会配合专门的乘法推理和等价类传播。",[11,12942,12943,12944,12947],{},"位向量的语义是",[183,12945,12946],{},"模运算","，这一点非常重要：",[28,12949,12951],{"className":12950,"translate":193},[192],[28,12952,12954,13018],{"className":12953,"translate":193},[197],[28,12955,12957],{"className":12956},[201],[203,12958,12959],{"xmlns":205,"display":206},[208,12960,12961,13015],{},[211,12962,12963,12965,12967,12969,12971,12973,12975,12977,12979,12989,12992,12999,13001,13003,13005,13007,13009,13011],{},[214,12964,176],{},[217,12966,124],{},[224,12968,1244],{},[217,12970,10074],{},[224,12972,89],{},[279,12974],{},[279,12976],{"width":497},[217,12978,43],{"stretchy":241},[211,12980,12981,12984,12986],{},[214,12982,12983],{"mathvariant":484},"m",[214,12985,3933],{"mathvariant":484},[214,12987,12988],{"mathvariant":484},"d",[279,12990],{"width":12991},"0.3333em",[3054,12993,12994,12996],{},[224,12995,1253],{},[224,12997,12998],{},"32",[217,13000,1522],{"stretchy":241},[228,13002,230],{},[217,13004,233],{},[228,13006,230],{},[214,13008,176],{},[217,13010,1854],{"mathvariant":484},[228,13012,13014],{"mathvariant":13013},"monospace","0xFFFFFFFF",[253,13016,13017],{"encoding":255},"x + 1 \\equiv 0 \\pmod{2^{32}} \\;\\wedge\\; x \\ne \\texttt{0xFFFFFFFF}",[28,13019,13021,13039,13057,13073,13147,13198],{"className":13020,"ariaHidden":261},[260],[28,13022,13024,13027,13030,13033,13036],{"className":13023},[265],[28,13025],{"className":13026,"style":270},[269],[28,13028,176],{"className":13029},[274,275],[28,13031],{"className":13032,"style":280},[279],[28,13034,124],{"className":13035},[284],[28,13037],{"className":13038,"style":280},[279],[28,13040,13042,13045,13048,13051,13054],{"className":13041},[265],[28,13043],{"className":13044,"style":316},[269],[28,13046,1244],{"className":13047},[274],[28,13049],{"className":13050,"style":302},[279],[28,13052,10074],{"className":13053},[306],[28,13055],{"className":13056,"style":302},[279],[28,13058,13060,13063,13066,13070],{"className":13059},[265],[28,13061],{"className":13062,"style":316},[269],[28,13064,89],{"className":13065},[274],[28,13067],{"className":13068},[279,13069],"allowbreak",[28,13071],{"className":13072,"style":540},[279],[28,13074,13076,13080,13083,13093,13097,13129,13132,13135,13138,13141,13144],{"className":13075},[265],[28,13077],{"className":13078,"style":13079},[269],"height:1.1141em;vertical-align:-0.25em;",[28,13081,43],{"className":13082},[348],[28,13084,13086],{"className":13085},[274],[28,13087,13089],{"className":13088},[274],[28,13090,13092],{"className":13091},[274,1712],"mod",[28,13094],{"className":13095,"style":13096},[279],"margin-right:0.3333em;",[28,13098,13100,13103],{"className":13099},[274],[28,13101,1253],{"className":13102},[274],[28,13104,13106],{"className":13105},[556],[28,13107,13109],{"className":13108},[560],[28,13110,13112],{"className":13111},[565],[28,13113,13115],{"className":13114,"style":4877},[569],[28,13116,13117,13120],{"style":4880},[28,13118],{"className":13119,"style":578},[577],[28,13121,13123],{"className":13122},[582,583,584,585],[28,13124,13126],{"className":13125},[274,585],[28,13127,12998],{"className":13128},[274,585],[28,13130,1522],{"className":13131},[355],[28,13133],{"className":13134,"style":302},[279],[28,13136],{"className":13137,"style":280},[279],[28,13139,233],{"className":13140},[284],[28,13142],{"className":13143,"style":302},[279],[28,13145],{"className":13146,"style":280},[279],[28,13148,13150,13153,13156,13159,13195],{"className":13149},[265],[28,13151],{"className":13152,"style":2371},[269],[28,13154,176],{"className":13155},[274,275],[28,13157],{"className":13158,"style":302},[279],[28,13160,13162,13189,13192],{"className":13161},[306],[28,13163,13165],{"className":13164},[306],[28,13166,13168],{"className":13167},[274,2359],[28,13169,13171],{"className":13170},[2363],[28,13172,13174,13177,13186],{"className":13173},[2367],[28,13175],{"className":13176,"style":2371},[269],[28,13178,13180],{"className":13179},[2375],[28,13181,13183],{"className":13182},[274],[28,13184,2382],{"className":13185},[306],[28,13187],{"className":13188},[2386],[28,13190],{"className":13191},[279,2390],[28,13193,83],{"className":13194},[306],[28,13196],{"className":13197,"style":302},[279],[28,13199,13201,13205],{"className":13200},[265],[28,13202],{"className":13203,"style":13204},[269],"height:0.6111em;",[28,13206,13208],{"className":13207},[274,11179],[28,13209,13014],{"className":13210},[274,13211],"texttt",[11,13213,13214,13215,13288,13289,13291,13292,13348,13349,13351,13352],{},"在 32 位无符号整数里，唯一满足 ",[28,13216,13218,13240],{"className":13217,"translate":193},[197],[28,13219,13221],{"className":13220},[201],[203,13222,13223],{"xmlns":205},[208,13224,13225,13237],{},[211,13226,13227,13229,13231,13233,13235],{},[214,13228,176],{},[217,13230,124],{},[224,13232,1244],{},[217,13234,10074],{},[224,13236,89],{},[253,13238,13239],{"encoding":255},"x + 1 \\equiv 0",[28,13241,13243,13261,13279],{"className":13242,"ariaHidden":261},[260],[28,13244,13246,13249,13252,13255,13258],{"className":13245},[265],[28,13247],{"className":13248,"style":270},[269],[28,13250,176],{"className":13251},[274,275],[28,13253],{"className":13254,"style":280},[279],[28,13256,124],{"className":13257},[284],[28,13259],{"className":13260,"style":280},[279],[28,13262,13264,13267,13270,13273,13276],{"className":13263},[265],[28,13265],{"className":13266,"style":316},[269],[28,13268,1244],{"className":13269},[274],[28,13271],{"className":13272,"style":302},[279],[28,13274,10074],{"className":13275},[306],[28,13277],{"className":13278,"style":302},[279],[28,13280,13282,13285],{"className":13281},[265],[28,13283],{"className":13284,"style":316},[269],[28,13286,89],{"className":13287},[274]," 的值就是 ",[25,13290,13014],{},"，所以这个公式是 unsat。如果把它当成数学整数，",[28,13293,13295,13315],{"className":13294,"translate":193},[197],[28,13296,13298],{"className":13297},[201],[203,13299,13300],{"xmlns":205},[208,13301,13302,13312],{},[211,13303,13304,13306,13308,13310],{},[214,13305,176],{},[217,13307,83],{},[217,13309,5074],{},[224,13311,1244],{},[253,13313,13314],{"encoding":255},"x = -1",[28,13316,13318,13336],{"className":13317,"ariaHidden":261},[260],[28,13319,13321,13324,13327,13330,13333],{"className":13320},[265],[28,13322],{"className":13323,"style":645},[269],[28,13325,176],{"className":13326},[274,275],[28,13328],{"className":13329,"style":302},[279],[28,13331,83],{"className":13332},[306],[28,13334],{"className":13335,"style":302},[279],[28,13337,13339,13342,13345],{"className":13338},[265],[28,13340],{"className":13341,"style":6853},[269],[28,13343,5074],{"className":13344},[274],[28,13346,1244],{"className":13347},[274]," 又不等于 ",[25,13350,13014],{},"，结论就完全不同。",[183,13353,13354],{},"选错理论，漏洞检测就会漏报或误报。",[11252,13356,7685],{"id":7685},[11,13358,13359,13360,2693,13362,13364],{},"数组理论的核心是 ",[25,13361,1713],{},[25,13363,2696],{}," 两条操作，以及前面提到的 read-over-write 公理。",[11,13366,13367,13368,13371,13372,13375],{},"求解器不会一次性展开所有下标，而是采用",[183,13369,13370],{},"惰性公理实例化","（lazy axiom instantiation）：先假设数组是一致的，当检查中发现某个 ",[25,13373,13374],{},"select(store(...))"," 需要用到公理时，才生成对应的引理加入公式。这叫「按需生成」，也叫 lemma-on-demand。",[11,13377,11402],{},[28,13379,13381],{"className":13380,"translate":193},[192],[28,13382,13384,13473],{"className":13383,"translate":193},[197],[28,13385,13387],{"className":13386},[201],[203,13388,13389],{"xmlns":205,"display":206},[208,13390,13391,13470],{},[211,13392,13393,13407,13409,13421,13423,13425,13427,13429,13431,13433,13435,13437,13439,13441,13443,13446,13448,13450,13452,13454,13456,13458,13460,13462,13464,13466,13468],{},[211,13394,13395,13397,13399,13401,13403,13405],{},[214,13396,1664],{"mathvariant":484},[214,13398,1667],{"mathvariant":484},[214,13400,1670],{"mathvariant":484},[214,13402,1667],{"mathvariant":484},[214,13404,22],{"mathvariant":484},[214,13406,1241],{"mathvariant":484},[217,13408,43],{"fence":261,"stretchy":261,"minsize":1810,"maxsize":1810},[211,13410,13411,13413,13415,13417,13419],{},[214,13412,1664],{"mathvariant":484},[214,13414,1241],{"mathvariant":484},[214,13416,3933],{"mathvariant":484},[214,13418,1867],{"mathvariant":484},[214,13420,1667],{"mathvariant":484},[217,13422,43],{"stretchy":241},[214,13424,238],{},[217,13426,1683],{"separator":261},[214,13428,1686],{},[217,13430,1683],{"separator":261},[214,13432,1693],{},[217,13434,1522],{"stretchy":241},[217,13436,1683],{"separator":261},[214,13438,7907],{},[217,13440,1522],{"fence":261,"stretchy":261,"minsize":1810,"maxsize":1810},[217,13442,83],{},[214,13444,13445],{},"w",[228,13447,230],{},[217,13449,233],{},[228,13451,230],{},[214,13453,1686],{},[217,13455,83],{},[214,13457,7907],{},[228,13459,230],{},[217,13461,233],{},[228,13463,230],{},[214,13465,13445],{},[217,13467,1854],{"mathvariant":484},[214,13469,1693],{},[253,13471,13472],{"encoding":255},"\\mathrm{select}\\bigl(\\mathrm{store}(a, i, v), j\\bigr) = w \\;\\wedge\\; i = j \\;\\wedge\\; w \\ne v",[28,13474,13476,13551,13576,13594,13619,13670],{"className":13475,"ariaHidden":261},[260],[28,13477,13479,13482,13488,13494,13500,13503,13506,13509,13512,13515,13518,13521,13524,13527,13530,13533,13536,13542,13545,13548],{"className":13478},[265],[28,13480],{"className":13481,"style":2469},[269],[28,13483,13485],{"className":13484},[274],[28,13486,1713],{"className":13487},[274,1712],[28,13489,13491],{"className":13490},[348],[28,13492,43],{"className":13493},[2169,2170],[28,13495,13497],{"className":13496},[274],[28,13498,2696],{"className":13499},[274,1712],[28,13501,43],{"className":13502},[348],[28,13504,238],{"className":13505},[274,275],[28,13507,1683],{"className":13508},[1723],[28,13510],{"className":13511,"style":530},[279],[28,13513,1686],{"className":13514},[274,275],[28,13516,1683],{"className":13517},[1723],[28,13519],{"className":13520,"style":530},[279],[28,13522,1693],{"className":13523,"style":298},[274,275],[28,13525,1522],{"className":13526},[355],[28,13528,1683],{"className":13529},[1723],[28,13531],{"className":13532,"style":530},[279],[28,13534,7907],{"className":13535,"style":8057},[274,275],[28,13537,13539],{"className":13538},[355],[28,13540,1522],{"className":13541},[2169,2170],[28,13543],{"className":13544,"style":302},[279],[28,13546,83],{"className":13547},[306],[28,13549],{"className":13550,"style":302},[279],[28,13552,13554,13557,13561,13564,13567,13570,13573],{"className":13553},[265],[28,13555],{"className":13556,"style":11532},[269],[28,13558,13445],{"className":13559,"style":13560},[274,275],"margin-right:0.0269em;",[28,13562],{"className":13563,"style":302},[279],[28,13565],{"className":13566,"style":280},[279],[28,13568,233],{"className":13569},[284],[28,13571],{"className":13572,"style":302},[279],[28,13574],{"className":13575,"style":280},[279],[28,13577,13579,13582,13585,13588,13591],{"className":13578},[265],[28,13580],{"className":13581,"style":7348},[269],[28,13583,1686],{"className":13584},[274,275],[28,13586],{"className":13587,"style":302},[279],[28,13589,83],{"className":13590},[306],[28,13592],{"className":13593,"style":302},[279],[28,13595,13597,13601,13604,13607,13610,13613,13616],{"className":13596},[265],[28,13598],{"className":13599,"style":13600},[269],"height:0.854em;vertical-align:-0.1944em;",[28,13602,7907],{"className":13603,"style":8057},[274,275],[28,13605],{"className":13606,"style":302},[279],[28,13608],{"className":13609,"style":280},[279],[28,13611,233],{"className":13612},[284],[28,13614],{"className":13615,"style":302},[279],[28,13617],{"className":13618,"style":280},[279],[28,13620,13622,13625,13628,13631,13667],{"className":13621},[265],[28,13623],{"className":13624,"style":2371},[269],[28,13626,13445],{"className":13627,"style":13560},[274,275],[28,13629],{"className":13630,"style":302},[279],[28,13632,13634,13661,13664],{"className":13633},[306],[28,13635,13637],{"className":13636},[306],[28,13638,13640],{"className":13639},[274,2359],[28,13641,13643],{"className":13642},[2363],[28,13644,13646,13649,13658],{"className":13645},[2367],[28,13647],{"className":13648,"style":2371},[269],[28,13650,13652],{"className":13651},[2375],[28,13653,13655],{"className":13654},[274],[28,13656,2382],{"className":13657},[306],[28,13659],{"className":13660},[2386],[28,13662],{"className":13663},[279,2390],[28,13665,83],{"className":13666},[306],[28,13668],{"className":13669,"style":302},[279],[28,13671,13673,13676],{"className":13672},[265],[28,13674],{"className":13675,"style":645},[269],[28,13677,1693],{"className":13678,"style":298},[274,275],[11,13680,13681,13682,13733,13734,13762,13763,6339,13814,13898],{},"由 ",[28,13683,13685,13703],{"className":13684,"translate":193},[197],[28,13686,13688],{"className":13687},[201],[203,13689,13690],{"xmlns":205},[208,13691,13692,13700],{},[211,13693,13694,13696,13698],{},[214,13695,1686],{},[217,13697,83],{},[214,13699,7907],{},[253,13701,13702],{"encoding":255},"i = j",[28,13704,13706,13724],{"className":13705,"ariaHidden":261},[260],[28,13707,13709,13712,13715,13718,13721],{"className":13708},[265],[28,13710],{"className":13711,"style":7348},[269],[28,13713,1686],{"className":13714},[274,275],[28,13716],{"className":13717,"style":302},[279],[28,13719,83],{"className":13720},[306],[28,13722],{"className":13723,"style":302},[279],[28,13725,13727,13730],{"className":13726},[265],[28,13728],{"className":13729,"style":13600},[269],[28,13731,7907],{"className":13732,"style":8057},[274,275]," 和 read-over-write 公理，左边等于 ",[28,13735,13737,13750],{"className":13736,"translate":193},[197],[28,13738,13740],{"className":13739},[201],[203,13741,13742],{"xmlns":205},[208,13743,13744,13748],{},[211,13745,13746],{},[214,13747,1693],{},[253,13749,1693],{"encoding":255},[28,13751,13753],{"className":13752,"ariaHidden":261},[260],[28,13754,13756,13759],{"className":13755},[265],[28,13757],{"className":13758,"style":645},[269],[28,13760,1693],{"className":13761,"style":298},[274,275],"；于是 ",[28,13764,13766,13784],{"className":13765,"translate":193},[197],[28,13767,13769],{"className":13768},[201],[203,13770,13771],{"xmlns":205},[208,13772,13773,13781],{},[211,13774,13775,13777,13779],{},[214,13776,1693],{},[217,13778,83],{},[214,13780,13445],{},[253,13782,13783],{"encoding":255},"v = w",[28,13785,13787,13805],{"className":13786,"ariaHidden":261},[260],[28,13788,13790,13793,13796,13799,13802],{"className":13789},[265],[28,13791],{"className":13792,"style":645},[269],[28,13794,1693],{"className":13795,"style":298},[274,275],[28,13797],{"className":13798,"style":302},[279],[28,13800,83],{"className":13801},[306],[28,13803],{"className":13804,"style":302},[279],[28,13806,13808,13811],{"className":13807},[265],[28,13809],{"className":13810,"style":645},[269],[28,13812,13445],{"className":13813,"style":13560},[274,275],[28,13815,13817,13835],{"className":13816,"translate":193},[197],[28,13818,13820],{"className":13819},[201],[203,13821,13822],{"xmlns":205},[208,13823,13824,13832],{},[211,13825,13826,13828,13830],{},[214,13827,13445],{},[217,13829,1854],{"mathvariant":484},[214,13831,1693],{},[253,13833,13834],{"encoding":255},"w \\ne v",[28,13836,13838,13889],{"className":13837,"ariaHidden":261},[260],[28,13839,13841,13844,13847,13850,13886],{"className":13840},[265],[28,13842],{"className":13843,"style":2371},[269],[28,13845,13445],{"className":13846,"style":13560},[274,275],[28,13848],{"className":13849,"style":302},[279],[28,13851,13853,13880,13883],{"className":13852},[306],[28,13854,13856],{"className":13855},[306],[28,13857,13859],{"className":13858},[274,2359],[28,13860,13862],{"className":13861},[2363],[28,13863,13865,13868,13877],{"className":13864},[2367],[28,13866],{"className":13867,"style":2371},[269],[28,13869,13871],{"className":13870},[2375],[28,13872,13874],{"className":13873},[274],[28,13875,2382],{"className":13876},[306],[28,13878],{"className":13879},[2386],[28,13881],{"className":13882},[279,2390],[28,13884,83],{"className":13885},[306],[28,13887],{"className":13888,"style":302},[279],[28,13890,13892,13895],{"className":13891},[265],[28,13893],{"className":13894,"style":645},[269],[28,13896,1693],{"className":13897,"style":298},[274,275]," 冲突，unsat。整个过程中，数组的长度、其他下标的值，全都不需要知道。",[11252,13900,13901],{"id":13901},"其他理论",[11,13903,13904,13905,13907],{},"字符串理论通常用自动机或序列理论处理，word equation 本身可判定，但加上长度约束、正则约束后很多片段会变得不可判定，工业求解器往往采用不完整但实用的策略。浮点理论通常把 IEEE 754 的位级语义编码成位向量，再交给 ",[25,13906,3039],{}," 后端。",[419,13909,13911],{"id":13910},"_45-冲突学习","4.5 冲突学习",[11,13913,13914,13915,13918],{},"理论冲突不会只让当前搜索失败一次，它会变成一条",[183,13916,13917],{},"理论引理","（theory lemma），永久加入布尔公式。",[11,13920,13921],{},"前面 4.2 节的例子：",[28,13923,13925],{"className":13924,"translate":193},[192],[28,13926,13928,13969],{"className":13927,"translate":193},[197],[28,13929,13931],{"className":13930},[201],[203,13932,13933],{"xmlns":205,"display":206},[208,13934,13935,13967],{},[211,13936,13937,13939,13941,13943,13945,13947,13949,13951,13953,13955,13957,13959,13961,13963,13965],{},[214,13938,176],{},[217,13940,130],{},[224,13942,89],{},[217,13944,1683],{"separator":261},[279,13946],{"width":4053},[214,13948,180],{},[217,13950,130],{},[224,13952,89],{},[217,13954,1683],{"separator":261},[279,13956],{"width":4053},[214,13958,176],{},[217,13960,124],{},[214,13962,180],{},[217,13964,1383],{},[224,13966,89],{},[253,13968,10669],{"encoding":255},[28,13970,13972,13990,14020,14050,14068],{"className":13971,"ariaHidden":261},[260],[28,13973,13975,13978,13981,13984,13987],{"className":13974},[265],[28,13976],{"className":13977,"style":2616},[269],[28,13979,176],{"className":13980},[274,275],[28,13982],{"className":13983,"style":302},[279],[28,13985,130],{"className":13986},[306],[28,13988],{"className":13989,"style":302},[279],[28,13991,13993,13996,13999,14002,14005,14008,14011,14014,14017],{"className":13992},[265],[28,13994],{"className":13995,"style":8494},[269],[28,13997,89],{"className":13998},[274],[28,14000,1683],{"className":14001},[1723],[28,14003],{"className":14004,"style":4222},[279],[28,14006],{"className":14007,"style":530},[279],[28,14009,180],{"className":14010,"style":298},[274,275],[28,14012],{"className":14013,"style":302},[279],[28,14015,130],{"className":14016},[306],[28,14018],{"className":14019,"style":302},[279],[28,14021,14023,14026,14029,14032,14035,14038,14041,14044,14047],{"className":14022},[265],[28,14024],{"className":14025,"style":8494},[269],[28,14027,89],{"className":14028},[274],[28,14030,1683],{"className":14031},[1723],[28,14033],{"className":14034,"style":4222},[279],[28,14036],{"className":14037,"style":530},[279],[28,14039,176],{"className":14040},[274,275],[28,14042],{"className":14043,"style":280},[279],[28,14045,124],{"className":14046},[284],[28,14048],{"className":14049,"style":280},[279],[28,14051,14053,14056,14059,14062,14065],{"className":14052},[265],[28,14054],{"className":14055,"style":294},[269],[28,14057,180],{"className":14058,"style":298},[274,275],[28,14060],{"className":14061,"style":302},[279],[28,14063,1383],{"className":14064},[306],[28,14066],{"className":14067,"style":302},[279],[28,14069,14071,14074],{"className":14070},[265],[28,14072],{"className":14073,"style":316},[269],[28,14075,89],{"className":14076},[274],[11,14078,14079],{},"这三条文字不可同时为真，所以下面这条子句是理论有效的：",[28,14081,14083],{"className":14082,"translate":193},[192],[28,14084,14086,14150],{"className":14085,"translate":193},[197],[28,14087,14089],{"className":14088},[201],[203,14090,14091],{"xmlns":205,"display":206},[208,14092,14093,14147],{},[211,14094,14095,14097,14099,14101,14103,14105,14107,14109,14111,14113,14115,14117,14119,14121,14123,14125,14127,14129,14131,14133,14135,14137,14139,14141,14143,14145],{},[214,14096,912],{"mathvariant":484},[217,14098,43],{"stretchy":241},[214,14100,176],{},[217,14102,130],{},[224,14104,89],{},[217,14106,1522],{"stretchy":241},[228,14108,230],{},[217,14110,937],{},[228,14112,230],{},[214,14114,912],{"mathvariant":484},[217,14116,43],{"stretchy":241},[214,14118,180],{},[217,14120,130],{},[224,14122,89],{},[217,14124,1522],{"stretchy":241},[228,14126,230],{},[217,14128,937],{},[228,14130,230],{},[214,14132,912],{"mathvariant":484},[217,14134,43],{"stretchy":241},[214,14136,176],{},[217,14138,124],{},[214,14140,180],{},[217,14142,1383],{},[224,14144,89],{},[217,14146,1522],{"stretchy":241},[253,14148,14149],{"encoding":255},"\\neg(x > 0) \\;\\vee\\; \\neg(y > 0) \\;\\vee\\; \\neg(x + y \u003C 0)",[28,14151,14153,14177,14204,14228,14255,14279,14297],{"className":14152,"ariaHidden":261},[260],[28,14154,14156,14159,14162,14165,14168,14171,14174],{"className":14155},[265],[28,14157],{"className":14158,"style":341},[269],[28,14160,912],{"className":14161},[274],[28,14163,43],{"className":14164},[348],[28,14166,176],{"className":14167},[274,275],[28,14169],{"className":14170,"style":302},[279],[28,14172,130],{"className":14173},[306],[28,14175],{"className":14176,"style":302},[279],[28,14178,14180,14183,14186,14189,14192,14195,14198,14201],{"className":14179},[265],[28,14181],{"className":14182,"style":341},[269],[28,14184,89],{"className":14185},[274],[28,14187,1522],{"className":14188},[355],[28,14190],{"className":14191,"style":302},[279],[28,14193],{"className":14194,"style":280},[279],[28,14196,937],{"className":14197},[284],[28,14199],{"className":14200,"style":302},[279],[28,14202],{"className":14203,"style":280},[279],[28,14205,14207,14210,14213,14216,14219,14222,14225],{"className":14206},[265],[28,14208],{"className":14209,"style":341},[269],[28,14211,912],{"className":14212},[274],[28,14214,43],{"className":14215},[348],[28,14217,180],{"className":14218,"style":298},[274,275],[28,14220],{"className":14221,"style":302},[279],[28,14223,130],{"className":14224},[306],[28,14226],{"className":14227,"style":302},[279],[28,14229,14231,14234,14237,14240,14243,14246,14249,14252],{"className":14230},[265],[28,14232],{"className":14233,"style":341},[269],[28,14235,89],{"className":14236},[274],[28,14238,1522],{"className":14239},[355],[28,14241],{"className":14242,"style":302},[279],[28,14244],{"className":14245,"style":280},[279],[28,14247,937],{"className":14248},[284],[28,14250],{"className":14251,"style":302},[279],[28,14253],{"className":14254,"style":280},[279],[28,14256,14258,14261,14264,14267,14270,14273,14276],{"className":14257},[265],[28,14259],{"className":14260,"style":341},[269],[28,14262,912],{"className":14263},[274],[28,14265,43],{"className":14266},[348],[28,14268,176],{"className":14269},[274,275],[28,14271],{"className":14272,"style":280},[279],[28,14274,124],{"className":14275},[284],[28,14277],{"className":14278,"style":280},[279],[28,14280,14282,14285,14288,14291,14294],{"className":14281},[265],[28,14283],{"className":14284,"style":294},[269],[28,14286,180],{"className":14287,"style":298},[274,275],[28,14289],{"className":14290,"style":302},[279],[28,14292,1383],{"className":14293},[306],[28,14295],{"className":14296,"style":302},[279],[28,14298,14300,14303,14306],{"className":14299},[265],[28,14301],{"className":14302,"style":341},[269],[28,14304,89],{"className":14305},[274],[28,14307,1522],{"className":14308},[355],[11,14310,14311],{},"把它翻译回命题变量，就是：",[28,14313,14315],{"className":14314,"translate":193},[192],[28,14316,14318,14354],{"className":14317,"translate":193},[197],[28,14319,14321],{"className":14320},[201],[203,14322,14323],{"xmlns":205,"display":206},[208,14324,14325,14351],{},[211,14326,14327,14329,14331,14333,14335,14337,14339,14341,14343,14345,14347,14349],{},[214,14328,912],{"mathvariant":484},[214,14330,11],{},[228,14332,230],{},[217,14334,937],{},[228,14336,230],{},[214,14338,912],{"mathvariant":484},[214,14340,1829],{},[228,14342,230],{},[217,14344,937],{},[228,14346,230],{},[214,14348,912],{"mathvariant":484},[214,14350,1867],{},[253,14352,14353],{"encoding":255},"\\neg p \\;\\vee\\; \\neg q \\;\\vee\\; \\neg r",[28,14355,14357,14384,14411],{"className":14356,"ariaHidden":261},[260],[28,14358,14360,14363,14366,14369,14372,14375,14378,14381],{"className":14359},[265],[28,14361],{"className":14362,"style":1083},[269],[28,14364,912],{"className":14365},[274],[28,14367,11],{"className":14368},[274,275],[28,14370],{"className":14371,"style":302},[279],[28,14373],{"className":14374,"style":280},[279],[28,14376,937],{"className":14377},[284],[28,14379],{"className":14380,"style":302},[279],[28,14382],{"className":14383,"style":280},[279],[28,14385,14387,14390,14393,14396,14399,14402,14405,14408],{"className":14386},[265],[28,14388],{"className":14389,"style":1083},[269],[28,14391,912],{"className":14392},[274],[28,14394,1829],{"className":14395,"style":298},[274,275],[28,14397],{"className":14398,"style":302},[279],[28,14400],{"className":14401,"style":280},[279],[28,14403,937],{"className":14404},[284],[28,14406],{"className":14407,"style":302},[279],[28,14409],{"className":14410,"style":280},[279],[28,14412,14414,14417,14420],{"className":14413},[265],[28,14415],{"className":14416,"style":645},[269],[28,14418,912],{"className":14419},[274],[28,14421,1867],{"className":14422,"style":2279},[274,275],[11,14424,14425,14426,14480,14481,2923],{},"SAT 层学到这条子句之后，就再也不会同时选 ",[28,14427,14429,14450],{"className":14428,"translate":193},[197],[28,14430,14432],{"className":14431},[201],[203,14433,14434],{"xmlns":205},[208,14435,14436,14448],{},[211,14437,14438,14440,14442,14444,14446],{},[214,14439,11],{},[217,14441,1683],{"separator":261},[214,14443,1829],{},[217,14445,1683],{"separator":261},[214,14447,1867],{},[253,14449,2874],{"encoding":255},[28,14451,14453],{"className":14452,"ariaHidden":261},[260],[28,14454,14456,14459,14462,14465,14468,14471,14474,14477],{"className":14455},[265],[28,14457],{"className":14458,"style":612},[269],[28,14460,11],{"className":14461},[274,275],[28,14463,1683],{"className":14464},[1723],[28,14466],{"className":14467,"style":530},[279],[28,14469,1829],{"className":14470,"style":298},[274,275],[28,14472,1683],{"className":14473},[1723],[28,14475],{"className":14476,"style":530},[279],[28,14478,1867],{"className":14479,"style":2279},[274,275]," 都为真了。这一步是 DPLL(T) 效率的关键：",[183,14482,14483],{},"理论层的「一次性检查」变成了布尔层的「永久知识」",[11,14485,14486],{},"如果没有冲突学习，SAT 层会在同一个理论冲突上反复撞墙；有了它，搜索空间被真正地剪掉了。",[419,14488,14490],{"id":14489},"_46-完整例子","4.6 完整例子",[11,14492,14493],{},"还是用这个公式：",[28,14495,14497],{"className":14496,"translate":193},[192],[28,14498,14500,14553],{"className":14499,"translate":193},[197],[28,14501,14503],{"className":14502},[201],[203,14504,14505],{"xmlns":205,"display":206},[208,14506,14507,14551],{},[211,14508,14509,14511,14513,14515,14517,14519,14521,14523,14525,14527,14529,14531,14533,14535,14537,14539,14541,14543,14545,14547,14549],{},[214,14510,510],{},[217,14512,83],{},[217,14514,43],{"stretchy":241},[214,14516,176],{},[217,14518,130],{},[224,14520,89],{},[217,14522,937],{},[214,14524,180],{},[217,14526,130],{},[224,14528,89],{},[217,14530,1522],{"stretchy":241},[228,14532,230],{},[217,14534,233],{},[228,14536,230],{},[217,14538,43],{"stretchy":241},[214,14540,176],{},[217,14542,124],{},[214,14544,180],{},[217,14546,1383],{},[224,14548,89],{},[217,14550,1522],{"stretchy":241},[253,14552,9895],{"encoding":255},[28,14554,14556,14574,14595,14613,14631,14658,14679,14697],{"className":14555,"ariaHidden":261},[260],[28,14557,14559,14562,14565,14568,14571],{"className":14558},[265],[28,14560],{"className":14561,"style":612},[269],[28,14563,510],{"className":14564},[274,275],[28,14566],{"className":14567,"style":302},[279],[28,14569,83],{"className":14570},[306],[28,14572],{"className":14573,"style":302},[279],[28,14575,14577,14580,14583,14586,14589,14592],{"className":14576},[265],[28,14578],{"className":14579,"style":341},[269],[28,14581,43],{"className":14582},[348],[28,14584,176],{"className":14585},[274,275],[28,14587],{"className":14588,"style":302},[279],[28,14590,130],{"className":14591},[306],[28,14593],{"className":14594,"style":302},[279],[28,14596,14598,14601,14604,14607,14610],{"className":14597},[265],[28,14599],{"className":14600,"style":316},[269],[28,14602,89],{"className":14603},[274],[28,14605],{"className":14606,"style":280},[279],[28,14608,937],{"className":14609},[284],[28,14611],{"className":14612,"style":280},[279],[28,14614,14616,14619,14622,14625,14628],{"className":14615},[265],[28,14617],{"className":14618,"style":294},[269],[28,14620,180],{"className":14621,"style":298},[274,275],[28,14623],{"className":14624,"style":302},[279],[28,14626,130],{"className":14627},[306],[28,14629],{"className":14630,"style":302},[279],[28,14632,14634,14637,14640,14643,14646,14649,14652,14655],{"className":14633},[265],[28,14635],{"className":14636,"style":341},[269],[28,14638,89],{"className":14639},[274],[28,14641,1522],{"className":14642},[355],[28,14644],{"className":14645,"style":302},[279],[28,14647],{"className":14648,"style":280},[279],[28,14650,233],{"className":14651},[284],[28,14653],{"className":14654,"style":302},[279],[28,14656],{"className":14657,"style":280},[279],[28,14659,14661,14664,14667,14670,14673,14676],{"className":14660},[265],[28,14662],{"className":14663,"style":341},[269],[28,14665,43],{"className":14666},[348],[28,14668,176],{"className":14669},[274,275],[28,14671],{"className":14672,"style":280},[279],[28,14674,124],{"className":14675},[284],[28,14677],{"className":14678,"style":280},[279],[28,14680,14682,14685,14688,14691,14694],{"className":14681},[265],[28,14683],{"className":14684,"style":294},[269],[28,14686,180],{"className":14687,"style":298},[274,275],[28,14689],{"className":14690,"style":302},[279],[28,14692,1383],{"className":14693},[306],[28,14695],{"className":14696,"style":302},[279],[28,14698,14700,14703,14706],{"className":14699},[265],[28,14701],{"className":14702,"style":341},[269],[28,14704,89],{"className":14705},[274],[28,14707,1522],{"className":14708},[355],[11,14710,14711,14714,14715,14835,14836,15001,15002,15074,15075,15163],{},[183,14712,14713],{},"第 1 轮","：SAT 层选择 ",[28,14716,14718,14751],{"className":14717,"translate":193},[197],[28,14719,14721],{"className":14720},[201],[203,14722,14723],{"xmlns":205},[208,14724,14725,14749],{},[211,14726,14727,14729,14731,14733,14735,14737,14739,14741,14743,14745,14747],{},[214,14728,11],{},[217,14730,83],{},[214,14732,884],{"mathvariant":484},[217,14734,1683],{"separator":261},[214,14736,1829],{},[217,14738,83],{},[214,14740,884],{"mathvariant":484},[217,14742,1683],{"separator":261},[214,14744,1867],{},[217,14746,83],{},[214,14748,884],{"mathvariant":484},[253,14750,10529],{"encoding":255},[28,14752,14754,14772,14799,14826],{"className":14753,"ariaHidden":261},[260],[28,14755,14757,14760,14763,14766,14769],{"className":14756},[265],[28,14758],{"className":14759,"style":612},[269],[28,14761,11],{"className":14762},[274,275],[28,14764],{"className":14765,"style":302},[279],[28,14767,83],{"className":14768},[306],[28,14770],{"className":14771,"style":302},[279],[28,14773,14775,14778,14781,14784,14787,14790,14793,14796],{"className":14774},[265],[28,14776],{"className":14777,"style":2371},[269],[28,14779,884],{"className":14780},[274],[28,14782,1683],{"className":14783},[1723],[28,14785],{"className":14786,"style":530},[279],[28,14788,1829],{"className":14789,"style":298},[274,275],[28,14791],{"className":14792,"style":302},[279],[28,14794,83],{"className":14795},[306],[28,14797],{"className":14798,"style":302},[279],[28,14800,14802,14805,14808,14811,14814,14817,14820,14823],{"className":14801},[265],[28,14803],{"className":14804,"style":2371},[269],[28,14806,884],{"className":14807},[274],[28,14809,1683],{"className":14810},[1723],[28,14812],{"className":14813,"style":530},[279],[28,14815,1867],{"className":14816,"style":2279},[274,275],[28,14818],{"className":14819,"style":302},[279],[28,14821,83],{"className":14822},[306],[28,14824],{"className":14825,"style":302},[279],[28,14827,14829,14832],{"className":14828},[265],[28,14830],{"className":14831,"style":7448},[269],[28,14833,884],{"className":14834},[274],"。理论层检查 ",[28,14837,14839,14887],{"className":14838,"translate":193},[197],[28,14840,14842],{"className":14841},[201],[203,14843,14844],{"xmlns":205},[208,14845,14846,14884],{},[211,14847,14848,14850,14852,14854,14856,14858,14861,14863,14865,14867,14869,14871,14873,14875,14877,14879,14881],{},[217,14849,7916],{"stretchy":241},[214,14851,176],{},[217,14853,130],{},[224,14855,89],{},[217,14857,1683],{"separator":261},[228,14859,14860],{}," ",[214,14862,180],{},[217,14864,130],{},[224,14866,89],{},[217,14868,1683],{"separator":261},[228,14870,14860],{},[214,14872,176],{},[217,14874,124],{},[214,14876,180],{},[217,14878,1383],{},[224,14880,89],{},[217,14882,14883],{"stretchy":241},"}",[253,14885,14886],{"encoding":255},"\\{x > 0,\\ y > 0,\\ x + y \u003C 0\\}",[28,14888,14890,14911,14941,14971,14989],{"className":14889,"ariaHidden":261},[260],[28,14891,14893,14896,14899,14902,14905,14908],{"className":14892},[265],[28,14894],{"className":14895,"style":341},[269],[28,14897,7916],{"className":14898},[348],[28,14900,176],{"className":14901},[274,275],[28,14903],{"className":14904,"style":302},[279],[28,14906,130],{"className":14907},[306],[28,14909],{"className":14910,"style":302},[279],[28,14912,14914,14917,14920,14923,14926,14929,14932,14935,14938],{"className":14913},[265],[28,14915],{"className":14916,"style":8494},[269],[28,14918,89],{"className":14919},[274],[28,14921,1683],{"className":14922},[1723],[28,14924,14860],{"className":14925},[279],[28,14927],{"className":14928,"style":530},[279],[28,14930,180],{"className":14931,"style":298},[274,275],[28,14933],{"className":14934,"style":302},[279],[28,14936,130],{"className":14937},[306],[28,14939],{"className":14940,"style":302},[279],[28,14942,14944,14947,14950,14953,14956,14959,14962,14965,14968],{"className":14943},[265],[28,14945],{"className":14946,"style":8494},[269],[28,14948,89],{"className":14949},[274],[28,14951,1683],{"className":14952},[1723],[28,14954,14860],{"className":14955},[279],[28,14957],{"className":14958,"style":530},[279],[28,14960,176],{"className":14961},[274,275],[28,14963],{"className":14964,"style":280},[279],[28,14966,124],{"className":14967},[284],[28,14969],{"className":14970,"style":280},[279],[28,14972,14974,14977,14980,14983,14986],{"className":14973},[265],[28,14975],{"className":14976,"style":294},[269],[28,14978,180],{"className":14979,"style":298},[274,275],[28,14981],{"className":14982,"style":302},[279],[28,14984,1383],{"className":14985},[306],[28,14987],{"className":14988,"style":302},[279],[28,14990,14992,14995,14998],{"className":14991},[265],[28,14993],{"className":14994,"style":341},[269],[28,14996,89],{"className":14997},[274],[28,14999,14883],{"className":15000},[355],"，发现 ",[28,15003,15005,15026],{"className":15004,"translate":193},[197],[28,15006,15008],{"className":15007},[201],[203,15009,15010],{"xmlns":205},[208,15011,15012,15024],{},[211,15013,15014,15016,15018,15020,15022],{},[214,15015,176],{},[217,15017,124],{},[214,15019,180],{},[217,15021,130],{},[224,15023,89],{},[253,15025,10805],{"encoding":255},[28,15027,15029,15047,15065],{"className":15028,"ariaHidden":261},[260],[28,15030,15032,15035,15038,15041,15044],{"className":15031},[265],[28,15033],{"className":15034,"style":270},[269],[28,15036,176],{"className":15037},[274,275],[28,15039],{"className":15040,"style":280},[279],[28,15042,124],{"className":15043},[284],[28,15045],{"className":15046,"style":280},[279],[28,15048,15050,15053,15056,15059,15062],{"className":15049},[265],[28,15051],{"className":15052,"style":294},[269],[28,15054,180],{"className":15055,"style":298},[274,275],[28,15057],{"className":15058,"style":302},[279],[28,15060,130],{"className":15061},[306],[28,15063],{"className":15064,"style":302},[279],[28,15066,15068,15071],{"className":15067},[265],[28,15069],{"className":15070,"style":316},[269],[28,15072,89],{"className":15073},[274],"，冲突。生成引理 ",[28,15076,15078,15106],{"className":15077,"translate":193},[197],[28,15079,15081],{"className":15080},[201],[203,15082,15083],{"xmlns":205},[208,15084,15085,15103],{},[211,15086,15087,15089,15091,15093,15095,15097,15099,15101],{},[214,15088,912],{"mathvariant":484},[214,15090,11],{},[217,15092,937],{},[214,15094,912],{"mathvariant":484},[214,15096,1829],{},[217,15098,937],{},[214,15100,912],{"mathvariant":484},[214,15102,1867],{},[253,15104,15105],{"encoding":255},"\\neg p \\vee \\neg q \\vee \\neg r",[28,15107,15109,15130,15151],{"className":15108,"ariaHidden":261},[260],[28,15110,15112,15115,15118,15121,15124,15127],{"className":15111},[265],[28,15113],{"className":15114,"style":1083},[269],[28,15116,912],{"className":15117},[274],[28,15119,11],{"className":15120},[274,275],[28,15122],{"className":15123,"style":280},[279],[28,15125,937],{"className":15126},[284],[28,15128],{"className":15129,"style":280},[279],[28,15131,15133,15136,15139,15142,15145,15148],{"className":15132},[265],[28,15134],{"className":15135,"style":1083},[269],[28,15137,912],{"className":15138},[274],[28,15140,1829],{"className":15141,"style":298},[274,275],[28,15143],{"className":15144,"style":280},[279],[28,15146,937],{"className":15147},[284],[28,15149],{"className":15150,"style":280},[279],[28,15152,15154,15157,15160],{"className":15153},[265],[28,15155],{"className":15156,"style":645},[269],[28,15158,912],{"className":15159},[274],[28,15161,1867],{"className":15162,"style":2279},[274,275]," 并回跳。",[11,15165,15166,15169,15170,15291],{},[183,15167,15168],{},"第 2 轮","：SAT 层在引理约束下重新搜索，可能选择 ",[28,15171,15173,15207],{"className":15172,"translate":193},[197],[28,15174,15176],{"className":15175},[201],[203,15177,15178],{"xmlns":205},[208,15179,15180,15204],{},[211,15181,15182,15184,15186,15188,15190,15192,15194,15196,15198,15200,15202],{},[214,15183,11],{},[217,15185,83],{},[214,15187,884],{"mathvariant":484},[217,15189,1683],{"separator":261},[214,15191,1829],{},[217,15193,83],{},[214,15195,894],{"mathvariant":484},[217,15197,1683],{"separator":261},[214,15199,1867],{},[217,15201,83],{},[214,15203,884],{"mathvariant":484},[253,15205,15206],{"encoding":255},"p = \\top, q = \\bot, r = \\top",[28,15208,15210,15228,15255,15282],{"className":15209,"ariaHidden":261},[260],[28,15211,15213,15216,15219,15222,15225],{"className":15212},[265],[28,15214],{"className":15215,"style":612},[269],[28,15217,11],{"className":15218},[274,275],[28,15220],{"className":15221,"style":302},[279],[28,15223,83],{"className":15224},[306],[28,15226],{"className":15227,"style":302},[279],[28,15229,15231,15234,15237,15240,15243,15246,15249,15252],{"className":15230},[265],[28,15232],{"className":15233,"style":2371},[269],[28,15235,884],{"className":15236},[274],[28,15238,1683],{"className":15239},[1723],[28,15241],{"className":15242,"style":530},[279],[28,15244,1829],{"className":15245,"style":298},[274,275],[28,15247],{"className":15248,"style":302},[279],[28,15250,83],{"className":15251},[306],[28,15253],{"className":15254,"style":302},[279],[28,15256,15258,15261,15264,15267,15270,15273,15276,15279],{"className":15257},[265],[28,15259],{"className":15260,"style":2371},[269],[28,15262,894],{"className":15263},[274],[28,15265,1683],{"className":15266},[1723],[28,15268],{"className":15269,"style":530},[279],[28,15271,1867],{"className":15272,"style":2279},[274,275],[28,15274],{"className":15275,"style":302},[279],[28,15277,83],{"className":15278},[306],[28,15280],{"className":15281,"style":302},[279],[28,15283,15285,15288],{"className":15284},[265],[28,15286],{"className":15287,"style":7448},[269],[28,15289,884],{"className":15290},[274],"。理论层检查：",[28,15293,15295],{"className":15294,"translate":193},[192],[28,15296,15298,15340],{"className":15297,"translate":193},[197],[28,15299,15301],{"className":15300},[201],[203,15302,15303],{"xmlns":205,"display":206},[208,15304,15305,15337],{},[211,15306,15307,15309,15311,15313,15315,15317,15319,15321,15323,15325,15327,15329,15331,15333,15335],{},[214,15308,176],{},[217,15310,130],{},[224,15312,89],{},[217,15314,1683],{"separator":261},[279,15316],{"width":4053},[214,15318,180],{},[217,15320,1876],{},[224,15322,89],{},[217,15324,1683],{"separator":261},[279,15326],{"width":4053},[214,15328,176],{},[217,15330,124],{},[214,15332,180],{},[217,15334,1383],{},[224,15336,89],{},[253,15338,15339],{"encoding":255},"x > 0, \\qquad y \\le 0, \\qquad x + y \u003C 0",[28,15341,15343,15361,15391,15421,15439],{"className":15342,"ariaHidden":261},[260],[28,15344,15346,15349,15352,15355,15358],{"className":15345},[265],[28,15347],{"className":15348,"style":2616},[269],[28,15350,176],{"className":15351},[274,275],[28,15353],{"className":15354,"style":302},[279],[28,15356,130],{"className":15357},[306],[28,15359],{"className":15360,"style":302},[279],[28,15362,15364,15367,15370,15373,15376,15379,15382,15385,15388],{"className":15363},[265],[28,15365],{"className":15366,"style":8494},[269],[28,15368,89],{"className":15369},[274],[28,15371,1683],{"className":15372},[1723],[28,15374],{"className":15375,"style":4222},[279],[28,15377],{"className":15378,"style":530},[279],[28,15380,180],{"className":15381,"style":298},[274,275],[28,15383],{"className":15384,"style":302},[279],[28,15386,1876],{"className":15387},[306],[28,15389],{"className":15390,"style":302},[279],[28,15392,15394,15397,15400,15403,15406,15409,15412,15415,15418],{"className":15393},[265],[28,15395],{"className":15396,"style":8494},[269],[28,15398,89],{"className":15399},[274],[28,15401,1683],{"className":15402},[1723],[28,15404],{"className":15405,"style":4222},[279],[28,15407],{"className":15408,"style":530},[279],[28,15410,176],{"className":15411},[274,275],[28,15413],{"className":15414,"style":280},[279],[28,15416,124],{"className":15417},[284],[28,15419],{"className":15420,"style":280},[279],[28,15422,15424,15427,15430,15433,15436],{"className":15423},[265],[28,15425],{"className":15426,"style":294},[269],[28,15428,180],{"className":15429,"style":298},[274,275],[28,15431],{"className":15432,"style":302},[279],[28,15434,1383],{"className":15435},[306],[28,15437],{"className":15438,"style":302},[279],[28,15440,15442,15445],{"className":15441},[265],[28,15443],{"className":15444,"style":316},[269],[28,15446,89],{"className":15447},[274],[11,15449,15450,15451,15542],{},"取 ",[28,15452,15454,15482],{"className":15453,"translate":193},[197],[28,15455,15457],{"className":15456},[201],[203,15458,15459],{"xmlns":205},[208,15460,15461,15479],{},[211,15462,15463,15465,15467,15469,15471,15473,15475,15477],{},[214,15464,176],{},[217,15466,83],{},[224,15468,1244],{},[217,15470,1683],{"separator":261},[214,15472,180],{},[217,15474,83],{},[217,15476,5074],{},[224,15478,1253],{},[253,15480,15481],{"encoding":255},"x = 1, y = -2",[28,15483,15485,15503,15530],{"className":15484,"ariaHidden":261},[260],[28,15486,15488,15491,15494,15497,15500],{"className":15487},[265],[28,15489],{"className":15490,"style":645},[269],[28,15492,176],{"className":15493},[274,275],[28,15495],{"className":15496,"style":302},[279],[28,15498,83],{"className":15499},[306],[28,15501],{"className":15502,"style":302},[279],[28,15504,15506,15509,15512,15515,15518,15521,15524,15527],{"className":15505},[265],[28,15507],{"className":15508,"style":8494},[269],[28,15510,1244],{"className":15511},[274],[28,15513,1683],{"className":15514},[1723],[28,15516],{"className":15517,"style":530},[279],[28,15519,180],{"className":15520,"style":298},[274,275],[28,15522],{"className":15523,"style":302},[279],[28,15525,83],{"className":15526},[306],[28,15528],{"className":15529,"style":302},[279],[28,15531,15533,15536,15539],{"className":15532},[265],[28,15534],{"className":15535,"style":6853},[269],[28,15537,5074],{"className":15538},[274],[28,15540,1253],{"className":15541},[274],"，三条同时成立。理论层返回一致，求解器输出：",[28,15544,15546],{"className":15545,"translate":193},[192],[28,15547,15549,15586],{"className":15548,"translate":193},[197],[28,15550,15552],{"className":15551},[201],[203,15553,15554],{"xmlns":205,"display":206},[208,15555,15556,15583],{},[211,15557,15558,15561,15563,15565,15567,15569,15571,15573,15575,15577,15579,15581],{},[228,15559,405],{"mathvariant":15560},"bold",[217,15562,1683],{"separator":261},[279,15564],{"width":4053},[214,15566,176],{},[217,15568,83],{},[224,15570,1244],{},[217,15572,1683],{"separator":261},[228,15574,14860],{},[214,15576,180],{},[217,15578,83],{},[217,15580,5074],{},[224,15582,1253],{},[253,15584,15585],{"encoding":255},"\\textbf{sat}, \\qquad x = 1,\\ y = -2",[28,15587,15589,15624,15654],{"className":15588,"ariaHidden":261},[260],[28,15590,15592,15596,15603,15606,15609,15612,15615,15618,15621],{"className":15591},[265],[28,15593],{"className":15594,"style":15595},[269],"height:0.8294em;vertical-align:-0.1944em;",[28,15597,15599],{"className":15598},[274,11179],[28,15600,405],{"className":15601},[274,15602],"textbf",[28,15604,1683],{"className":15605},[1723],[28,15607],{"className":15608,"style":4222},[279],[28,15610],{"className":15611,"style":530},[279],[28,15613,176],{"className":15614},[274,275],[28,15616],{"className":15617,"style":302},[279],[28,15619,83],{"className":15620},[306],[28,15622],{"className":15623,"style":302},[279],[28,15625,15627,15630,15633,15636,15639,15642,15645,15648,15651],{"className":15626},[265],[28,15628],{"className":15629,"style":8494},[269],[28,15631,1244],{"className":15632},[274],[28,15634,1683],{"className":15635},[1723],[28,15637,14860],{"className":15638},[279],[28,15640],{"className":15641,"style":530},[279],[28,15643,180],{"className":15644,"style":298},[274,275],[28,15646],{"className":15647,"style":302},[279],[28,15649,83],{"className":15650},[306],[28,15652],{"className":15653,"style":302},[279],[28,15655,15657,15660,15663],{"className":15656},[265],[28,15658],{"className":15659,"style":6853},[269],[28,15661,5074],{"className":15662},[274],[28,15664,1253],{"className":15665},[274],[11,15667,15668],{},"这就是一个完整的 DPLL(T) 循环：一次冲突、一次学习、一次成功。",[11,15670,15671,15672,15675],{},"在真实求解器里，理论层还会做",[183,15673,15674],{},"理论传播","：不等 SAT 层给出完整赋值，就提前推出某些文字必须为真或为假，从而更早剪枝。这让循环通常只需要很少几轮。",[11,15677,15678],{},"理论正确不代表跑得快。工业级求解器还依赖大量工程优化：",[2480,15680,15681,15687,15692,15698,15704,15710],{},[2483,15682,15683,15686],{},[183,15684,15685],{},"预处理","：化简公式、消除冗余变量、把公式规范化成求解器偏好的形式。",[2483,15688,15689,15691],{},[183,15690,15674],{},"：理论层主动推导文字，而不是被动等待完整赋值。",[2483,15693,15694,15697],{},[183,15695,15696],{},"重启策略","：按 Luby 序列或指数策略重启，避免陷入坏的搜索区域。",[2483,15699,15700,15703],{},[183,15701,15702],{},"子句删除","：学习子句太多会拖慢传播，需要定期清理。",[2483,15705,15706,15709],{},[183,15707,15708],{},"多引擎组合","：同一个问题用不同策略并行求解（portfolio），谁先出结果用谁。",[2483,15711,15712,15715],{},[183,15713,15714],{},"专用推理","：针对乘法、数组、字符串等难点，加入专门的推理规则。",[419,15717,15719],{"id":15718},"_47-复杂度边界","4.7 复杂度边界",[11,15721,15722,15723,2923],{},"必须强调：",[183,15724,15725],{},"可判定不等于可解",[2480,15727,15728,15731,15740,15745,15749],{},[2483,15729,15730],{},"SAT 是 NP-complete；",[2483,15732,15733,177,15735,177,15737,15739],{},[25,15734,3039],{},[25,15736,2954],{},[25,15738,2940],{}," 也都是 NP-complete；",[2483,15741,15742,15744],{},[25,15743,2950],{}," 虽然是多项式时间，但实际常数很大；",[2483,15746,15747,7469],{},[25,15748,3027],{},[2483,15750,15751,15753],{},[25,15752,3030],{}," 直接不可判定。",[11,15755,15756],{},"这意味着，工业问题的最坏情况仍然是指数级的。求解器的成功，很大程度上依赖问题结构、编码方式和启发式。遇到超时，工具通常只能返回「未知」，而不是「安全」。",[11,15758,15759],{},"这也是为什么实际系统里，SMT 很少单独使用，而是和抽象解释、fuzzing、测试生成等方法组合。",[414,15761,15763],{"id":15762},"五漏洞检测","五、漏洞检测",[419,15765,15767],{"id":15766},"_51-问题转化","5.1 问题转化",[11,15769,15770],{},"软件漏洞检测的核心问题可以写成一句话：",[15772,15773,15774],"blockquote",{},[11,15775,15776],{},"是否存在一个输入，让程序走到某个危险位置，并且违反某条安全性质？",[11,15778,15779],{},"形式化之后，它就是一个存在性查询：",[28,15781,15783],{"className":15782,"translate":193},[192],[28,15784,15786,15903],{"className":15785,"translate":193},[197],[28,15787,15789],{"className":15788},[201],[203,15790,15791],{"xmlns":205,"display":206},[208,15792,15793,15900],{},[211,15794,15795,15797,15799,15811,15813,15815,15850,15852,15854,15856],{},[214,15796,485],{"mathvariant":484},[228,15798,488],{},[211,15800,15801,15803,15805,15807,15809],{},[214,15802,1686],{},[214,15804,3060],{},[214,15806,11],{},[214,15808,3936],{},[214,15810,1241],{},[214,15812,494],{"mathvariant":484},[279,15814],{"width":497},[1771,15816,15817,15847],{},[1771,15818,15819,15845],{},[211,15820,15821,15829,15831,15843],{},[211,15822,15823,15826],{},[214,15824,15825],{"mathvariant":484},"P",[214,15827,15828],{"mathvariant":484},"C",[217,15830,43],{"stretchy":241},[211,15832,15833,15835,15837,15839,15841],{},[214,15834,1686],{},[214,15836,3060],{},[214,15838,11],{},[214,15840,3936],{},[214,15842,1241],{},[217,15844,1522],{"stretchy":241},[217,15846,1793],{"stretchy":261},[228,15848,15849],{},"路径条件",[228,15851,230],{},[217,15853,233],{},[228,15855,230],{},[1771,15857,15858,15897],{},[1771,15859,15860,15895],{},[211,15861,15862,15879,15881,15893],{},[211,15863,15864,15867,15869,15871,15873,15875,15877],{},[214,15865,15866],{"mathvariant":484},"V",[214,15868,1686],{"mathvariant":484},[214,15870,3933],{"mathvariant":484},[214,15872,1670],{"mathvariant":484},[214,15874,238],{"mathvariant":484},[214,15876,1241],{"mathvariant":484},[214,15878,1667],{"mathvariant":484},[217,15880,43],{"stretchy":241},[211,15882,15883,15885,15887,15889,15891],{},[214,15884,1686],{},[214,15886,3060],{},[214,15888,11],{},[214,15890,3936],{},[214,15892,1241],{},[217,15894,1522],{"stretchy":241},[217,15896,1793],{"stretchy":261},[228,15898,15899],{},"安全性质取反",[253,15901,15902],{"encoding":255},"\\exists\\, \\mathit{input}.\\quad \\underbrace{\\mathrm{PC}(\\mathit{input})}_{\\text{路径条件}} \\;\\wedge\\; \\underbrace{\\mathrm{Violate}(\\mathit{input})}_{\\text{安全性质取反}}",[28,15904,15906,16079],{"className":15905,"ariaHidden":261},[260],[28,15907,15909,15913,15916,15919,15927,15930,15933,15936,16064,16067,16070,16073,16076],{"className":15908},[265],[28,15910],{"className":15911,"style":15912},[269],"height:2.3263em;vertical-align:-1.5763em;",[28,15914,485],{"className":15915},[274],[28,15917],{"className":15918,"style":530},[279],[28,15920,15922],{"className":15921},[274],[28,15923,15926],{"className":15924},[274,15925],"mathit","input",[28,15928,494],{"className":15929},[274],[28,15931],{"className":15932,"style":540},[279],[28,15934],{"className":15935,"style":530},[279],[28,15937,15939],{"className":15938},[1897,1771],[28,15940,15942,16055],{"className":15941},[560,561],[28,15943,15945,16052],{"className":15944},[565],[28,15946,15948,15967],{"className":15947,"style":1907},[569],[28,15949,15951,15954],{"style":15950},"top:-1.4237em;",[28,15952],{"className":15953,"style":1914},[577],[28,15955,15957],{"className":15956},[582,583,584,585],[28,15958,15960],{"className":15959},[274,585],[28,15961,15963],{"className":15962},[274,11179,585],[28,15964,15849],{"className":15965},[274,15966,585],"cjk_fallback",[28,15968,15969,15972],{"style":1926},[28,15970],{"className":15971,"style":1914},[577],[28,15973,15975],{"className":15974},[1897,1771],[28,15976,15978,16044],{"className":15977},[560,561],[28,15979,15981,16041],{"className":15980},[565],[28,15982,15984,16014],{"className":15983,"style":1907},[569],[28,15985,15987,15990],{"className":15986,"style":1946},[1945],[28,15988],{"className":15989,"style":1914},[577],[28,15991,15993,16000,16007],{"className":15992,"style":1954},[1953],[28,15994,15996],{"className":15995,"style":1959},[1958],[1961,15997,15998],{"xmlns":1963,"width":1964,"height":1965,"viewBox":1966,"preserveAspectRatio":1967},[1969,15999],{"d":1971},[28,16001,16003],{"className":16002,"style":1959},[1975],[1961,16004,16005],{"xmlns":1963,"width":1964,"height":1965,"viewBox":1966,"preserveAspectRatio":1978},[1969,16006],{"d":1981},[28,16008,16010],{"className":16009,"style":1959},[1985],[1961,16011,16012],{"xmlns":1963,"width":1964,"height":1965,"viewBox":1966,"preserveAspectRatio":1988},[1969,16013],{"d":1991},[28,16015,16016,16019],{"style":1926},[28,16017],{"className":16018,"style":1914},[577],[28,16020,16022,16029,16032,16038],{"className":16021},[274],[28,16023,16025],{"className":16024},[274],[28,16026,16028],{"className":16027},[274,1712],"PC",[28,16030,43],{"className":16031},[348],[28,16033,16035],{"className":16034},[274],[28,16036,15926],{"className":16037},[274,15925],[28,16039,1522],{"className":16040},[355],[28,16042,593],{"className":16043},[592],[28,16045,16047],{"className":16046},[565],[28,16048,16050],{"className":16049,"style":2042},[569],[28,16051],{},[28,16053,593],{"className":16054},[592],[28,16056,16058],{"className":16057},[565],[28,16059,16062],{"className":16060,"style":16061},[569],"height:1.5763em;",[28,16063],{},[28,16065],{"className":16066,"style":302},[279],[28,16068],{"className":16069,"style":280},[279],[28,16071,233],{"className":16072},[284],[28,16074],{"className":16075,"style":302},[279],[28,16077],{"className":16078,"style":280},[279],[28,16080,16082,16085],{"className":16081},[265],[28,16083],{"className":16084,"style":15912},[269],[28,16086,16088],{"className":16087},[1897,1771],[28,16089,16091,16202],{"className":16090},[560,561],[28,16092,16094,16199],{"className":16093},[565],[28,16095,16097,16114],{"className":16096,"style":1907},[569],[28,16098,16099,16102],{"style":15950},[28,16100],{"className":16101,"style":1914},[577],[28,16103,16105],{"className":16104},[582,583,584,585],[28,16106,16108],{"className":16107},[274,585],[28,16109,16111],{"className":16110},[274,11179,585],[28,16112,15899],{"className":16113},[274,15966,585],[28,16115,16116,16119],{"style":1926},[28,16117],{"className":16118,"style":1914},[577],[28,16120,16122],{"className":16121},[1897,1771],[28,16123,16125,16191],{"className":16124},[560,561],[28,16126,16128,16188],{"className":16127},[565],[28,16129,16131,16161],{"className":16130,"style":1907},[569],[28,16132,16134,16137],{"className":16133,"style":1946},[1945],[28,16135],{"className":16136,"style":1914},[577],[28,16138,16140,16147,16154],{"className":16139,"style":1954},[1953],[28,16141,16143],{"className":16142,"style":1959},[1958],[1961,16144,16145],{"xmlns":1963,"width":1964,"height":1965,"viewBox":1966,"preserveAspectRatio":1967},[1969,16146],{"d":1971},[28,16148,16150],{"className":16149,"style":1959},[1975],[1961,16151,16152],{"xmlns":1963,"width":1964,"height":1965,"viewBox":1966,"preserveAspectRatio":1978},[1969,16153],{"d":1981},[28,16155,16157],{"className":16156,"style":1959},[1985],[1961,16158,16159],{"xmlns":1963,"width":1964,"height":1965,"viewBox":1966,"preserveAspectRatio":1988},[1969,16160],{"d":1991},[28,16162,16163,16166],{"style":1926},[28,16164],{"className":16165,"style":1914},[577],[28,16167,16169,16176,16179,16185],{"className":16168},[274],[28,16170,16172],{"className":16171},[274],[28,16173,16175],{"className":16174},[274,1712],"Violate",[28,16177,43],{"className":16178},[348],[28,16180,16182],{"className":16181},[274],[28,16183,15926],{"className":16184},[274,15925],[28,16186,1522],{"className":16187},[355],[28,16189,593],{"className":16190},[592],[28,16192,16194],{"className":16193},[565],[28,16195,16197],{"className":16196,"style":2042},[569],[28,16198],{},[28,16200,593],{"className":16201},[592],[28,16203,16205],{"className":16204},[565],[28,16206,16208],{"className":16207,"style":16061},[569],[28,16209],{},[2480,16211,16212,16249],{},[2483,16213,16214,16248],{},[28,16215,16217,16233],{"className":16216,"translate":193},[197],[28,16218,16220],{"className":16219},[201],[203,16221,16222],{"xmlns":205},[208,16223,16224,16230],{},[211,16225,16226,16228],{},[214,16227,15825],{"mathvariant":484},[214,16229,15828],{"mathvariant":484},[253,16231,16232],{"encoding":255},"\\mathrm{PC}",[28,16234,16236],{"className":16235,"ariaHidden":261},[260],[28,16237,16239,16242],{"className":16238},[265],[28,16240],{"className":16241,"style":455},[269],[28,16243,16245],{"className":16244},[274],[28,16246,16028],{"className":16247},[274,1712]," 是路径条件，描述「走到这里需要满足哪些约束」；",[2483,16250,16251,16295],{},[28,16252,16254,16280],{"className":16253,"translate":193},[197],[28,16255,16257],{"className":16256},[201],[203,16258,16259],{"xmlns":205},[208,16260,16261,16277],{},[211,16262,16263,16265,16267,16269,16271,16273,16275],{},[214,16264,15866],{"mathvariant":484},[214,16266,1686],{"mathvariant":484},[214,16268,3933],{"mathvariant":484},[214,16270,1670],{"mathvariant":484},[214,16272,238],{"mathvariant":484},[214,16274,1241],{"mathvariant":484},[214,16276,1667],{"mathvariant":484},[253,16278,16279],{"encoding":255},"\\mathrm{Violate}",[28,16281,16283],{"className":16282,"ariaHidden":261},[260],[28,16284,16286,16289],{"className":16285},[265],[28,16287],{"className":16288,"style":7448},[269],[28,16290,16292],{"className":16291},[274],[28,16293,16175],{"className":16294},[274,1712]," 是安全性质的否定，描述「怎样才算越界\u002F溢出\u002F空指针解引用」。",[11,16297,16298,16299,16301,16302,16304],{},"如果这个公式 ",[183,16300,405],{},"，求解器给出的模型就是一条能触发漏洞的输入，漏洞可达；如果 ",[183,16303,6456],{},"，说明在这条路径上不可能违反性质，可以安全剪枝。",[11,16306,16307,16308,2923],{},"这个转化是整个应用的基石：",[183,16309,16310],{},"「找漏洞」变成了「解约束」",[419,16312,16314],{"id":16313},"_52-缓冲区溢出","5.2 缓冲区溢出",[11,16316,16317],{},"先看一个最直观的例子：",[18,16319,16321],{"className":20,"code":16320,"language":22,"meta":23,"style":23},"void process(char *input, int len) {\n    char buf[8];\n    if (len > 4 && len \u003C 12) {\n        memcpy(buf, input, len);   \u002F\u002F 可疑点\n    }\n}\n",[25,16322,16323,16349,16364,16388,16399,16403],{"__ignoreMap":23},[28,16324,16325,16327,16330,16332,16335,16338,16340,16342,16344,16347],{"class":30,"line":31},[28,16326,35],{"class":34},[28,16328,16329],{"class":38}," process",[28,16331,43],{"class":42},[28,16333,16334],{"class":34},"char",[28,16336,16337],{"class":34}," *",[28,16339,15926],{"class":49},[28,16341,53],{"class":42},[28,16343,46],{"class":34},[28,16345,16346],{"class":49}," len",[28,16348,61],{"class":42},[28,16350,16351,16354,16357,16359,16361],{"class":30,"line":64},[28,16352,16353],{"class":34},"    char",[28,16355,16356],{"class":49}," buf",[28,16358,73],{"class":42},[28,16360,5236],{"class":76},[28,16362,16363],{"class":42},"];\n",[28,16365,16366,16368,16371,16373,16376,16378,16381,16383,16386],{"class":30,"line":95},[28,16367,118],{"class":34},[28,16369,16370],{"class":42}," (len ",[28,16372,130],{"class":34},[28,16374,16375],{"class":76}," 4",[28,16377,136],{"class":34},[28,16379,16380],{"class":42}," len ",[28,16382,1383],{"class":34},[28,16384,16385],{"class":76}," 12",[28,16387,61],{"class":42},[28,16389,16390,16393,16396],{"class":30,"line":115},[28,16391,16392],{"class":38},"        memcpy",[28,16394,16395],{"class":42},"(buf, input, len);",[28,16397,16398],{"class":157},"   \u002F\u002F 可疑点\n",[28,16400,16401],{"class":30,"line":154},[28,16402,164],{"class":42},[28,16404,16405],{"class":30,"line":161},[28,16406,170],{"class":42},[11,16408,16409,16412,16413,16416,16417,16420,16421,16423],{},[25,16410,16411],{},"buf"," 只有 8 字节，而 ",[25,16414,16415],{},"memcpy"," 拷贝 ",[25,16418,16419],{},"len"," 字节。如果 ",[25,16422,16419],{}," 能大于 8，就会发生栈溢出。",[11,16425,16426,16427,2693,16429,16431,16432,16434],{},"符号执行引擎把 ",[25,16428,15926],{},[25,16430,16419],{}," 当作符号变量，沿路径走到 ",[25,16433,16415],{}," 时，收集到的路径条件是：",[28,16436,16438],{"className":16437,"translate":193},[192],[28,16439,16441,16480],{"className":16440,"translate":193},[197],[28,16442,16444],{"className":16443},[201],[203,16445,16446],{"xmlns":205,"display":206},[208,16447,16448,16477],{},[211,16449,16450,16452,16454,16456,16458,16460,16462,16464,16466,16468,16470,16472,16474],{},[214,16451,1670],{},[214,16453,1667],{},[214,16455,3060],{},[217,16457,130],{},[224,16459,9215],{},[228,16461,230],{},[217,16463,233],{},[228,16465,230],{},[214,16467,1670],{},[214,16469,1667],{},[214,16471,3060],{},[217,16473,1383],{},[224,16475,16476],{},"12",[253,16478,16479],{"encoding":255},"len > 4 \\;\\wedge\\; len \u003C 12",[28,16481,16483,16509,16533,16557],{"className":16482,"ariaHidden":261},[260],[28,16484,16486,16490,16494,16497,16500,16503,16506],{"className":16485},[265],[28,16487],{"className":16488,"style":16489},[269],"height:0.7335em;vertical-align:-0.0391em;",[28,16491,1670],{"className":16492,"style":16493},[274,275],"margin-right:0.0197em;",[28,16495,1667],{"className":16496},[274,275],[28,16498,3060],{"className":16499},[274,275],[28,16501],{"className":16502,"style":302},[279],[28,16504,130],{"className":16505},[306],[28,16507],{"className":16508,"style":302},[279],[28,16510,16512,16515,16518,16521,16524,16527,16530],{"className":16511},[265],[28,16513],{"className":16514,"style":316},[269],[28,16516,9215],{"className":16517},[274],[28,16519],{"className":16520,"style":302},[279],[28,16522],{"className":16523,"style":280},[279],[28,16525,233],{"className":16526},[284],[28,16528],{"className":16529,"style":302},[279],[28,16531],{"className":16532,"style":280},[279],[28,16534,16536,16539,16542,16545,16548,16551,16554],{"className":16535},[265],[28,16537],{"className":16538,"style":16489},[269],[28,16540,1670],{"className":16541,"style":16493},[274,275],[28,16543,1667],{"className":16544},[274,275],[28,16546,3060],{"className":16547},[274,275],[28,16549],{"className":16550,"style":302},[279],[28,16552,1383],{"className":16553},[306],[28,16555],{"className":16556,"style":302},[279],[28,16558,16560,16563],{"className":16559},[265],[28,16561],{"className":16562,"style":316},[269],[28,16564,16476],{"className":16565},[274],[11,16567,16568],{},"要判断溢出是否可达，就在路径条件上再加一条「写入长度超过缓冲区大小」：",[28,16570,16572],{"className":16571,"translate":193},[192],[28,16573,16575,16629],{"className":16574,"translate":193},[197],[28,16576,16578],{"className":16577},[201],[203,16579,16580],{"xmlns":205,"display":206},[208,16581,16582,16626],{},[211,16583,16584,16586,16588,16590,16592,16594,16596,16598,16600,16602,16604,16606,16608,16610,16612,16614,16616,16618,16620,16622,16624],{},[214,16585,1670],{},[214,16587,1667],{},[214,16589,3060],{},[217,16591,130],{},[224,16593,9215],{},[228,16595,230],{},[217,16597,233],{},[228,16599,230],{},[214,16601,1670],{},[214,16603,1667],{},[214,16605,3060],{},[217,16607,1383],{},[224,16609,16476],{},[228,16611,230],{},[217,16613,233],{},[228,16615,230],{},[214,16617,1670],{},[214,16619,1667],{},[214,16621,3060],{},[217,16623,130],{},[224,16625,5236],{},[253,16627,16628],{"encoding":255},"len > 4 \\;\\wedge\\; len \u003C 12 \\;\\wedge\\; len > 8",[28,16630,16632,16656,16680,16704,16728,16752],{"className":16631,"ariaHidden":261},[260],[28,16633,16635,16638,16641,16644,16647,16650,16653],{"className":16634},[265],[28,16636],{"className":16637,"style":16489},[269],[28,16639,1670],{"className":16640,"style":16493},[274,275],[28,16642,1667],{"className":16643},[274,275],[28,16645,3060],{"className":16646},[274,275],[28,16648],{"className":16649,"style":302},[279],[28,16651,130],{"className":16652},[306],[28,16654],{"className":16655,"style":302},[279],[28,16657,16659,16662,16665,16668,16671,16674,16677],{"className":16658},[265],[28,16660],{"className":16661,"style":316},[269],[28,16663,9215],{"className":16664},[274],[28,16666],{"className":16667,"style":302},[279],[28,16669],{"className":16670,"style":280},[279],[28,16672,233],{"className":16673},[284],[28,16675],{"className":16676,"style":302},[279],[28,16678],{"className":16679,"style":280},[279],[28,16681,16683,16686,16689,16692,16695,16698,16701],{"className":16682},[265],[28,16684],{"className":16685,"style":16489},[269],[28,16687,1670],{"className":16688,"style":16493},[274,275],[28,16690,1667],{"className":16691},[274,275],[28,16693,3060],{"className":16694},[274,275],[28,16696],{"className":16697,"style":302},[279],[28,16699,1383],{"className":16700},[306],[28,16702],{"className":16703,"style":302},[279],[28,16705,16707,16710,16713,16716,16719,16722,16725],{"className":16706},[265],[28,16708],{"className":16709,"style":316},[269],[28,16711,16476],{"className":16712},[274],[28,16714],{"className":16715,"style":302},[279],[28,16717],{"className":16718,"style":280},[279],[28,16720,233],{"className":16721},[284],[28,16723],{"className":16724,"style":302},[279],[28,16726],{"className":16727,"style":280},[279],[28,16729,16731,16734,16737,16740,16743,16746,16749],{"className":16730},[265],[28,16732],{"className":16733,"style":16489},[269],[28,16735,1670],{"className":16736,"style":16493},[274,275],[28,16738,1667],{"className":16739},[274,275],[28,16741,3060],{"className":16742},[274,275],[28,16744],{"className":16745,"style":302},[279],[28,16747,130],{"className":16748},[306],[28,16750],{"className":16751,"style":302},[279],[28,16753,16755,16758],{"className":16754},[265],[28,16756],{"className":16757,"style":316},[269],[28,16759,5236],{"className":16760},[274],[11,16762,16763],{},"写成 SMT-LIB：",[18,16765,16769],{"className":16766,"code":16767,"language":16768,"meta":23,"style":23},"language-smt shiki shiki-themes github-dark","(set-logic QF_LIA)\n(declare-const len Int)\n(assert (and (> len 4) (\u003C len 12) (> len 8)))\n(check-sat)\n(get-model)\n","smt",[25,16770,16771,16776,16781,16786,16791],{"__ignoreMap":23},[28,16772,16773],{"class":30,"line":31},[28,16774,16775],{},"(set-logic QF_LIA)\n",[28,16777,16778],{"class":30,"line":64},[28,16779,16780],{},"(declare-const len Int)\n",[28,16782,16783],{"class":30,"line":95},[28,16784,16785],{},"(assert (and (> len 4) (\u003C len 12) (> len 8)))\n",[28,16787,16788],{"class":30,"line":115},[28,16789,16790],{},"(check-sat)\n",[28,16792,16793],{"class":30,"line":154},[28,16794,16795],{},"(get-model)\n",[11,16797,16798],{},"求解器返回：",[18,16800,16803],{"className":16801,"code":16802,"language":11179},[11177],"sat\n(model\n  (define-fun len () Int\n    9)\n)\n",[25,16804,16802],{"__ignoreMap":23},[11,16806,16807,16810,16811,16885,16886,16937,16938,16940],{},[25,16808,16809],{},"len = 9"," 是一个合法解：它满足 ",[28,16812,16814,16837],{"className":16813,"translate":193},[197],[28,16815,16817],{"className":16816},[201],[203,16818,16819],{"xmlns":205},[208,16820,16821,16834],{},[211,16822,16823,16825,16827,16830,16832],{},[224,16824,9215],{},[217,16826,1383],{},[224,16828,16829],{},"9",[217,16831,1383],{},[224,16833,16476],{},[253,16835,16836],{"encoding":255},"4 \u003C 9 \u003C 12",[28,16838,16840,16858,16876],{"className":16839,"ariaHidden":261},[260],[28,16841,16843,16846,16849,16852,16855],{"className":16842},[265],[28,16844],{"className":16845,"style":9429},[269],[28,16847,9215],{"className":16848},[274],[28,16850],{"className":16851,"style":302},[279],[28,16853,1383],{"className":16854},[306],[28,16856],{"className":16857,"style":302},[279],[28,16859,16861,16864,16867,16870,16873],{"className":16860},[265],[28,16862],{"className":16863,"style":9429},[269],[28,16865,16829],{"className":16866},[274],[28,16868],{"className":16869,"style":302},[279],[28,16871,1383],{"className":16872},[306],[28,16874],{"className":16875,"style":302},[279],[28,16877,16879,16882],{"className":16878},[265],[28,16880],{"className":16881,"style":316},[269],[28,16883,16476],{"className":16884},[274],"，同时 ",[28,16887,16889,16907],{"className":16888,"translate":193},[197],[28,16890,16892],{"className":16891},[201],[203,16893,16894],{"xmlns":205},[208,16895,16896,16904],{},[211,16897,16898,16900,16902],{},[224,16899,16829],{},[217,16901,130],{},[224,16903,5236],{},[253,16905,16906],{"encoding":255},"9 > 8",[28,16908,16910,16928],{"className":16909,"ariaHidden":261},[260],[28,16911,16913,16916,16919,16922,16925],{"className":16912},[265],[28,16914],{"className":16915,"style":9429},[269],[28,16917,16829],{"className":16918},[274],[28,16920],{"className":16921,"style":302},[279],[28,16923,130],{"className":16924},[306],[28,16926],{"className":16927,"style":302},[279],[28,16929,16931,16934],{"className":16930},[265],[28,16932],{"className":16933,"style":316},[269],[28,16935,5236],{"className":16936},[274],"。这条路径可达，",[25,16939,16415],{}," 会往 8 字节的缓冲区里写 9 字节，溢出 1 字节。是否真的覆盖到返回地址取决于栈布局，但「越界写」这个事实本身已经成立。",[11,16942,16943],{},"如果把代码改成：",[18,16945,16947],{"className":20,"code":16946,"language":22,"meta":23,"style":23},"if (len > 4 && len \u003C= 8) {\n    memcpy(buf, input, len);\n}\n",[25,16948,16949,16972,16980],{"__ignoreMap":23},[28,16950,16951,16954,16956,16958,16960,16962,16964,16967,16970],{"class":30,"line":31},[28,16952,16953],{"class":34},"if",[28,16955,16370],{"class":42},[28,16957,130],{"class":34},[28,16959,16375],{"class":76},[28,16961,136],{"class":34},[28,16963,16380],{"class":42},[28,16965,16966],{"class":34},"\u003C=",[28,16968,16969],{"class":76}," 8",[28,16971,61],{"class":42},[28,16973,16974,16977],{"class":30,"line":64},[28,16975,16976],{"class":38},"    memcpy",[28,16978,16979],{"class":42},"(buf, input, len);\n",[28,16981,16982],{"class":30,"line":95},[28,16983,170],{"class":42},[11,16985,16986],{},"约束就变成：",[28,16988,16990],{"className":16989,"translate":193},[192],[28,16991,16993,17047],{"className":16992,"translate":193},[197],[28,16994,16996],{"className":16995},[201],[203,16997,16998],{"xmlns":205,"display":206},[208,16999,17000,17044],{},[211,17001,17002,17004,17006,17008,17010,17012,17014,17016,17018,17020,17022,17024,17026,17028,17030,17032,17034,17036,17038,17040,17042],{},[214,17003,1670],{},[214,17005,1667],{},[214,17007,3060],{},[217,17009,130],{},[224,17011,9215],{},[228,17013,230],{},[217,17015,233],{},[228,17017,230],{},[214,17019,1670],{},[214,17021,1667],{},[214,17023,3060],{},[217,17025,1876],{},[224,17027,5236],{},[228,17029,230],{},[217,17031,233],{},[228,17033,230],{},[214,17035,1670],{},[214,17037,1667],{},[214,17039,3060],{},[217,17041,130],{},[224,17043,5236],{},[253,17045,17046],{"encoding":255},"len > 4 \\;\\wedge\\; len \\le 8 \\;\\wedge\\; len > 8",[28,17048,17050,17074,17098,17123,17147,17171],{"className":17049,"ariaHidden":261},[260],[28,17051,17053,17056,17059,17062,17065,17068,17071],{"className":17052},[265],[28,17054],{"className":17055,"style":16489},[269],[28,17057,1670],{"className":17058,"style":16493},[274,275],[28,17060,1667],{"className":17061},[274,275],[28,17063,3060],{"className":17064},[274,275],[28,17066],{"className":17067,"style":302},[279],[28,17069,130],{"className":17070},[306],[28,17072],{"className":17073,"style":302},[279],[28,17075,17077,17080,17083,17086,17089,17092,17095],{"className":17076},[265],[28,17078],{"className":17079,"style":316},[269],[28,17081,9215],{"className":17082},[274],[28,17084],{"className":17085,"style":302},[279],[28,17087],{"className":17088,"style":280},[279],[28,17090,233],{"className":17091},[284],[28,17093],{"className":17094,"style":302},[279],[28,17096],{"className":17097,"style":280},[279],[28,17099,17101,17105,17108,17111,17114,17117,17120],{"className":17100},[265],[28,17102],{"className":17103,"style":17104},[269],"height:0.8304em;vertical-align:-0.136em;",[28,17106,1670],{"className":17107,"style":16493},[274,275],[28,17109,1667],{"className":17110},[274,275],[28,17112,3060],{"className":17113},[274,275],[28,17115],{"className":17116,"style":302},[279],[28,17118,1876],{"className":17119},[306],[28,17121],{"className":17122,"style":302},[279],[28,17124,17126,17129,17132,17135,17138,17141,17144],{"className":17125},[265],[28,17127],{"className":17128,"style":316},[269],[28,17130,5236],{"className":17131},[274],[28,17133],{"className":17134,"style":302},[279],[28,17136],{"className":17137,"style":280},[279],[28,17139,233],{"className":17140},[284],[28,17142],{"className":17143,"style":302},[279],[28,17145],{"className":17146,"style":280},[279],[28,17148,17150,17153,17156,17159,17162,17165,17168],{"className":17149},[265],[28,17151],{"className":17152,"style":16489},[269],[28,17154,1670],{"className":17155,"style":16493},[274,275],[28,17157,1667],{"className":17158},[274,275],[28,17160,3060],{"className":17161},[274,275],[28,17163],{"className":17164,"style":302},[279],[28,17166,130],{"className":17167},[306],[28,17169],{"className":17170,"style":302},[279],[28,17172,17174,17177],{"className":17173},[265],[28,17175],{"className":17176,"style":316},[269],[28,17178,5236],{"className":17179},[274],[11,17181,17182,17183,17185],{},"求解器返回 ",[183,17184,6456],{},"。这条溢出路径不可达，工具不会报告漏洞。",[11,17187,17188,17189,17191,17192,17194,17195,17197,17198,12376],{},"注意这里用的是 ",[25,17190,2954],{},"（整数线性算术）。真实的 C 代码里 ",[25,17193,16419],{}," 是 32 位 ",[25,17196,46],{},"，更精确的建模应该用 ",[25,17199,3039],{},[18,17201,17203],{"className":16766,"code":17202,"language":16768,"meta":23,"style":23},"(set-logic QF_BV)\n(declare-const len (_ BitVec 32))\n(assert (and (bvsgt len (_ bv4 32))\n             (bvslt len (_ bv12 32))\n             (bvsgt len (_ bv8 32))))\n(check-sat)\n(get-model)\n",[25,17204,17205,17210,17215,17220,17225,17230,17234],{"__ignoreMap":23},[28,17206,17207],{"class":30,"line":31},[28,17208,17209],{},"(set-logic QF_BV)\n",[28,17211,17212],{"class":30,"line":64},[28,17213,17214],{},"(declare-const len (_ BitVec 32))\n",[28,17216,17217],{"class":30,"line":95},[28,17218,17219],{},"(assert (and (bvsgt len (_ bv4 32))\n",[28,17221,17222],{"class":30,"line":115},[28,17223,17224],{},"             (bvslt len (_ bv12 32))\n",[28,17226,17227],{"class":30,"line":154},[28,17228,17229],{},"             (bvsgt len (_ bv8 32))))\n",[28,17231,17232],{"class":30,"line":161},[28,17233,16790],{},[28,17235,17236],{"class":30,"line":167},[28,17237,16795],{},[11,17239,17240,17241,2951,17244,17247,17248,17250,17251,17254],{},"注意这里用的是有符号比较（",[25,17242,17243],{},"bvsgt",[25,17245,17246],{},"bvslt","），因为 C 里的 ",[25,17249,46],{}," 是有符号的。一个可能的模型是 ",[25,17252,17253],{},"len = #x00000009","。对这个例子来说，两种建模的结论一样；但下一个例子就会看到，理论选错，结论可能完全相反。",[419,17256,17258],{"id":17257},"_53-整数溢出","5.3 整数溢出",[18,17260,17262],{"className":20,"code":17261,"language":22,"meta":23,"style":23},"void copy(char *src, unsigned int off, unsigned int len) {\n    char buf[64];\n    if (off + len \u003C= 64) {\n        memcpy(buf + off, src, len);\n    }\n}\n",[25,17263,17264,17301,17314,17332,17344,17348],{"__ignoreMap":23},[28,17265,17266,17268,17271,17273,17275,17277,17280,17282,17285,17288,17291,17293,17295,17297,17299],{"class":30,"line":31},[28,17267,35],{"class":34},[28,17269,17270],{"class":38}," copy",[28,17272,43],{"class":42},[28,17274,16334],{"class":34},[28,17276,16337],{"class":34},[28,17278,17279],{"class":49},"src",[28,17281,53],{"class":42},[28,17283,17284],{"class":34},"unsigned",[28,17286,17287],{"class":34}," int",[28,17289,17290],{"class":49}," off",[28,17292,53],{"class":42},[28,17294,17284],{"class":34},[28,17296,17287],{"class":34},[28,17298,16346],{"class":49},[28,17300,61],{"class":42},[28,17302,17303,17305,17307,17309,17312],{"class":30,"line":64},[28,17304,16353],{"class":34},[28,17306,16356],{"class":49},[28,17308,73],{"class":42},[28,17310,17311],{"class":76},"64",[28,17313,16363],{"class":42},[28,17315,17316,17318,17321,17323,17325,17327,17330],{"class":30,"line":95},[28,17317,118],{"class":34},[28,17319,17320],{"class":42}," (off ",[28,17322,124],{"class":34},[28,17324,16380],{"class":42},[28,17326,16966],{"class":34},[28,17328,17329],{"class":76}," 64",[28,17331,61],{"class":42},[28,17333,17334,17336,17339,17341],{"class":30,"line":115},[28,17335,16392],{"class":38},[28,17337,17338],{"class":42},"(buf ",[28,17340,124],{"class":34},[28,17342,17343],{"class":42}," off, src, len);\n",[28,17345,17346],{"class":30,"line":154},[28,17347,164],{"class":42},[28,17349,17350],{"class":30,"line":161},[28,17351,170],{"class":42},[11,17353,17354,17355,17358,17359,2693,17362,17364,17365,3104],{},"看起来检查很严：只有 ",[25,17356,17357],{},"off + len"," 不超过 64 才拷贝。但 ",[25,17360,17361],{},"off",[25,17363,16419],{}," 都是 32 位无符号整数，加法是",[183,17366,17367,17368],{},"模 ",[28,17369,17371,17389],{"className":17370,"translate":193},[197],[28,17372,17374],{"className":17373},[201],[203,17375,17376],{"xmlns":205},[208,17377,17378,17386],{},[211,17379,17380],{},[3054,17381,17382,17384],{},[224,17383,1253],{},[224,17385,12998],{},[253,17387,17388],{"encoding":255},"2^{32}",[28,17390,17392],{"className":17391,"ariaHidden":261},[260],[28,17393,17395,17398],{"className":17394},[265],[28,17396],{"className":17397,"style":5477},[269],[28,17399,17401,17404],{"className":17400},[274],[28,17402,1253],{"className":17403},[274],[28,17405,17407],{"className":17406},[556],[28,17408,17410],{"className":17409},[560],[28,17411,17413],{"className":17412},[565],[28,17414,17416],{"className":17415,"style":5477},[569],[28,17417,17418,17421],{"style":3094},[28,17419],{"className":17420,"style":578},[577],[28,17422,17424],{"className":17423},[582,583,584,585],[28,17425,17427],{"className":17426},[274,585],[28,17428,12998],{"className":17429},[274,585],[11,17431,17432],{},"攻击者可以取：",[28,17434,17436],{"className":17435,"translate":193},[192],[28,17437,17439,17469],{"className":17438,"translate":193},[197],[28,17440,17442],{"className":17441},[201],[203,17443,17444],{"xmlns":205,"display":206},[208,17445,17446,17466],{},[211,17447,17448,17450,17452,17455,17457,17459,17461,17463],{},[228,17449,17361],{},[217,17451,83],{},[228,17453,17454],{"mathvariant":13013},"0xFFFFFFF0",[217,17456,1683],{"separator":261},[279,17458],{"width":4053},[228,17460,16419],{},[217,17462,83],{},[228,17464,17465],{"mathvariant":13013},"0x20",[253,17467,17468],{"encoding":255},"\\text{off} = \\texttt{0xFFFFFFF0}, \\qquad \\text{len} = \\texttt{0x20}",[28,17470,17472,17493,17529],{"className":17471,"ariaHidden":261},[260],[28,17473,17475,17478,17484,17487,17490],{"className":17474},[265],[28,17476],{"className":17477,"style":7448},[269],[28,17479,17481],{"className":17480},[274,11179],[28,17482,17361],{"className":17483},[274],[28,17485],{"className":17486,"style":302},[279],[28,17488,83],{"className":17489},[306],[28,17491],{"className":17492,"style":302},[279],[28,17494,17496,17499,17505,17508,17511,17514,17520,17523,17526],{"className":17495},[265],[28,17497],{"className":17498,"style":2371},[269],[28,17500,17502],{"className":17501},[274,11179],[28,17503,17454],{"className":17504},[274,13211],[28,17506,1683],{"className":17507},[1723],[28,17509],{"className":17510,"style":4222},[279],[28,17512],{"className":17513,"style":530},[279],[28,17515,17517],{"className":17516},[274,11179],[28,17518,16419],{"className":17519},[274],[28,17521],{"className":17522,"style":302},[279],[28,17524,83],{"className":17525},[306],[28,17527],{"className":17528,"style":302},[279],[28,17530,17532,17535],{"className":17531},[265],[28,17533],{"className":17534,"style":13204},[269],[28,17536,17538],{"className":17537},[274,11179],[28,17539,17465],{"className":17540},[274,13211],[11,17542,17543],{},"计算一下：",[28,17545,17547],{"className":17546,"translate":193},[192],[28,17548,17550,17663],{"className":17549,"translate":193},[197],[28,17551,17553],{"className":17552},[201],[203,17554,17555],{"xmlns":205,"display":206},[208,17556,17557,17660],{},[5015,17558,17559,17589,17610],{"rowspacing":5017,"columnalign":5018,"columnspacing":5019},[5021,17560,17561,17573],{},[5024,17562,17563],{},[5027,17564,17565],{"scriptlevel":89,"displaystyle":261},[211,17566,17567,17569,17571],{},[228,17568,17361],{},[217,17570,124],{},[228,17572,16419],{},[5024,17574,17575],{},[5027,17576,17577],{"scriptlevel":89,"displaystyle":261},[211,17578,17579,17581,17583,17585,17587],{},[211,17580],{},[217,17582,83],{},[228,17584,17454],{"mathvariant":13013},[217,17586,124],{},[228,17588,17465],{"mathvariant":13013},[5021,17590,17591,17597],{},[5024,17592,17593],{},[5027,17594,17595],{"scriptlevel":89,"displaystyle":261},[211,17596],{},[5024,17598,17599],{},[5027,17600,17601],{"scriptlevel":89,"displaystyle":261},[211,17602,17603,17605,17607],{},[211,17604],{},[217,17606,83],{},[228,17608,17609],{"mathvariant":13013},"0x100000010",[5021,17611,17612,17618],{},[5024,17613,17614],{},[5027,17615,17616],{"scriptlevel":89,"displaystyle":261},[211,17617],{},[5024,17619,17620],{},[5027,17621,17622],{"scriptlevel":89,"displaystyle":261},[211,17623,17624,17626,17628,17631,17633,17636,17638,17640,17642,17650,17652,17658],{},[211,17625],{},[217,17627,10074],{},[228,17629,17630],{"mathvariant":13013},"0x10",[217,17632,83],{},[224,17634,17635],{},"16",[279,17637],{},[279,17639],{"width":497},[217,17641,43],{"stretchy":241},[211,17643,17644,17646,17648],{},[214,17645,12983],{"mathvariant":484},[214,17647,3933],{"mathvariant":484},[214,17649,12988],{"mathvariant":484},[279,17651],{"width":12991},[3054,17653,17654,17656],{},[224,17655,1253],{},[224,17657,12998],{},[217,17659,1522],{"stretchy":241},[253,17661,17662],{"encoding":255},"\\begin{aligned}\n\\text{off} + \\text{len}\n&= \\texttt{0xFFFFFFF0} + \\texttt{0x20} \\\\\n&= \\texttt{0x100000010} \\\\\n&\\equiv \\texttt{0x10} = 16 \\pmod{2^{32}}\n\\end{aligned}",[28,17664,17666],{"className":17665,"ariaHidden":261},[260],[28,17667,17669,17673],{"className":17668},[265],[28,17670],{"className":17671,"style":17672},[269],"height:4.2241em;vertical-align:-1.8621em;",[28,17674,17676],{"className":17675},[274],[28,17677,17679,17751],{"className":17678},[5015],[28,17680,17682],{"className":17681},[5137],[28,17683,17685,17742],{"className":17684},[560,561],[28,17686,17688,17739],{"className":17687},[565],[28,17689,17692,17721,17730],{"className":17690,"style":17691},[569],"height:2.3621em;",[28,17693,17694,17697],{"style":5150},[28,17695],{"className":17696,"style":1914},[577],[28,17698,17700,17706,17709,17712,17715],{"className":17699},[274],[28,17701,17703],{"className":17702},[274,11179],[28,17704,17361],{"className":17705},[274],[28,17707],{"className":17708,"style":280},[279],[28,17710,124],{"className":17711},[284],[28,17713],{"className":17714,"style":280},[279],[28,17716,17718],{"className":17717},[274,11179],[28,17719,16419],{"className":17720},[274],[28,17722,17724,17727],{"style":17723},"top:-3.0221em;",[28,17725],{"className":17726,"style":1914},[577],[28,17728],{"className":17729},[274],[28,17731,17733,17736],{"style":17732},"top:-1.4979em;",[28,17734],{"className":17735,"style":1914},[577],[28,17737],{"className":17738},[274],[28,17740,593],{"className":17741},[592],[28,17743,17745],{"className":17744},[565],[28,17746,17749],{"className":17747,"style":17748},[569],"height:1.8621em;",[28,17750],{},[28,17752,17754],{"className":17753},[5205],[28,17755,17757,17927],{"className":17756},[560,561],[28,17758,17760,17924],{"className":17759},[565],[28,17761,17763,17804,17830],{"className":17762,"style":17691},[569],[28,17764,17765,17768],{"style":5150},[28,17766],{"className":17767,"style":1914},[577],[28,17769,17771,17774,17777,17780,17783,17789,17792,17795,17798],{"className":17770},[274],[28,17772],{"className":17773},[274],[28,17775],{"className":17776,"style":302},[279],[28,17778,83],{"className":17779},[306],[28,17781],{"className":17782,"style":302},[279],[28,17784,17786],{"className":17785},[274,11179],[28,17787,17454],{"className":17788},[274,13211],[28,17790],{"className":17791,"style":280},[279],[28,17793,124],{"className":17794},[284],[28,17796],{"className":17797,"style":280},[279],[28,17799,17801],{"className":17800},[274,11179],[28,17802,17465],{"className":17803},[274,13211],[28,17805,17806,17809],{"style":17723},[28,17807],{"className":17808,"style":1914},[577],[28,17810,17812,17815,17818,17821,17824],{"className":17811},[274],[28,17813],{"className":17814},[274],[28,17816],{"className":17817,"style":302},[279],[28,17819,83],{"className":17820},[306],[28,17822],{"className":17823,"style":302},[279],[28,17825,17827],{"className":17826},[274,11179],[28,17828,17609],{"className":17829},[274,13211],[28,17831,17832,17835],{"style":17732},[28,17833],{"className":17834,"style":1914},[577],[28,17836,17838,17841,17844,17847,17850,17856,17859,17862,17865,17868,17871,17874,17877,17886,17889,17921],{"className":17837},[274],[28,17839],{"className":17840},[274],[28,17842],{"className":17843,"style":302},[279],[28,17845,10074],{"className":17846},[306],[28,17848],{"className":17849,"style":302},[279],[28,17851,17853],{"className":17852},[274,11179],[28,17854,17630],{"className":17855},[274,13211],[28,17857],{"className":17858,"style":302},[279],[28,17860,83],{"className":17861},[306],[28,17863],{"className":17864,"style":302},[279],[28,17866,17635],{"className":17867},[274],[28,17869],{"className":17870},[279,13069],[28,17872],{"className":17873,"style":540},[279],[28,17875,43],{"className":17876},[348],[28,17878,17880],{"className":17879},[274],[28,17881,17883],{"className":17882},[274],[28,17884,13092],{"className":17885},[274,1712],[28,17887],{"className":17888,"style":13096},[279],[28,17890,17892,17895],{"className":17891},[274],[28,17893,1253],{"className":17894},[274],[28,17896,17898],{"className":17897},[556],[28,17899,17901],{"className":17900},[560],[28,17902,17904],{"className":17903},[565],[28,17905,17907],{"className":17906,"style":4877},[569],[28,17908,17909,17912],{"style":4880},[28,17910],{"className":17911,"style":578},[577],[28,17913,17915],{"className":17914},[582,583,584,585],[28,17916,17918],{"className":17917},[274,585],[28,17919,12998],{"className":17920},[274,585],[28,17922,1522],{"className":17923},[355],[28,17925,593],{"className":17926},[592],[28,17928,17930],{"className":17929},[565],[28,17931,17933],{"className":17932,"style":17748},[569],[28,17934],{},[11,17936,17937,17989,17990,17993,17994,17996,17997,2923],{},[28,17938,17940,17958],{"className":17939,"translate":193},[197],[28,17941,17943],{"className":17942},[201],[203,17944,17945],{"xmlns":205},[208,17946,17947,17955],{},[211,17948,17949,17951,17953],{},[224,17950,17635],{},[217,17952,1876],{},[224,17954,17311],{},[253,17956,17957],{"encoding":255},"16 \\le 64",[28,17959,17961,17980],{"className":17960,"ariaHidden":261},[260],[28,17962,17964,17968,17971,17974,17977],{"className":17963},[265],[28,17965],{"className":17966,"style":17967},[269],"height:0.7804em;vertical-align:-0.136em;",[28,17969,17635],{"className":17970},[274],[28,17972],{"className":17973,"style":302},[279],[28,17975,1876],{"className":17976},[306],[28,17978],{"className":17979,"style":302},[279],[28,17981,17983,17986],{"className":17982},[265],[28,17984],{"className":17985,"style":316},[269],[28,17987,17311],{"className":17988},[274],"，检查通过。但 ",[25,17991,17992],{},"buf + off"," 指向的是缓冲区外大约 4GB 的位置，",[25,17995,16415],{}," 会往一个完全无关的地址写 32 字节。这是一个典型的",[183,17998,17999],{},"整数溢出导致的任意地址写",[11,18001,18002],{},"用位向量理论来问：",[18,18004,18006],{"className":16766,"code":18005,"language":16768,"meta":23,"style":23},"(set-logic QF_BV)\n(declare-const off (_ BitVec 32))\n(declare-const len (_ BitVec 32))\n(assert (bvule (bvadd off len) (_ bv64 32)))\n(assert (bvugt off (_ bv64 32)))\n(assert (bvule len (_ bv64 32)))\n(check-sat)\n(get-model)\n",[25,18007,18008,18012,18017,18021,18026,18031,18036,18040],{"__ignoreMap":23},[28,18009,18010],{"class":30,"line":31},[28,18011,17209],{},[28,18013,18014],{"class":30,"line":64},[28,18015,18016],{},"(declare-const off (_ BitVec 32))\n",[28,18018,18019],{"class":30,"line":95},[28,18020,17214],{},[28,18022,18023],{"class":30,"line":115},[28,18024,18025],{},"(assert (bvule (bvadd off len) (_ bv64 32)))\n",[28,18027,18028],{"class":30,"line":154},[28,18029,18030],{},"(assert (bvugt off (_ bv64 32)))\n",[28,18032,18033],{"class":30,"line":161},[28,18034,18035],{},"(assert (bvule len (_ bv64 32)))\n",[28,18037,18038],{"class":30,"line":167},[28,18039,16790],{},[28,18041,18043],{"class":30,"line":18042},8,[28,18044,16795],{},[11,18046,18047],{},"求解器返回 sat，模型可能是：",[18,18049,18052],{"className":18050,"code":18051,"language":11179},[11177],"off = #xfffffff0\nlen = #x00000020\n",[25,18053,18051],{"__ignoreMap":23},[11,18055,18056],{},"漏洞可达。",[11,18058,18059,18060,2693,18062,18064],{},"如果换一种建模，把 ",[25,18061,17361],{},[25,18063,16419],{}," 当成数学整数：",[28,18066,18068],{"className":18067,"translate":193},[192],[28,18069,18071,18117],{"className":18070,"translate":193},[197],[28,18072,18074],{"className":18073},[201],[203,18075,18076],{"xmlns":205,"display":206},[208,18077,18078,18114],{},[211,18079,18080,18082,18084,18086,18088,18090,18092,18094,18096,18098,18100,18102,18104,18106,18108,18110,18112],{},[228,18081,17361],{},[217,18083,124],{},[228,18085,16419],{},[217,18087,1876],{},[224,18089,17311],{},[228,18091,230],{},[217,18093,233],{},[228,18095,230],{},[228,18097,17361],{},[217,18099,130],{},[224,18101,17311],{},[228,18103,230],{},[217,18105,233],{},[228,18107,230],{},[228,18109,16419],{},[217,18111,9572],{},[224,18113,89],{},[253,18115,18116],{"encoding":255},"\\text{off} + \\text{len} \\le 64 \\;\\wedge\\; \\text{off} > 64 \\;\\wedge\\; \\text{len} \\ge 0",[28,18118,18120,18141,18162,18186,18207,18231,18252],{"className":18119,"ariaHidden":261},[260],[28,18121,18123,18126,18132,18135,18138],{"className":18122},[265],[28,18124],{"className":18125,"style":4154},[269],[28,18127,18129],{"className":18128},[274,11179],[28,18130,17361],{"className":18131},[274],[28,18133],{"className":18134,"style":280},[279],[28,18136,124],{"className":18137},[284],[28,18139],{"className":18140,"style":280},[279],[28,18142,18144,18147,18153,18156,18159],{"className":18143},[265],[28,18145],{"className":18146,"style":17104},[269],[28,18148,18150],{"className":18149},[274,11179],[28,18151,16419],{"className":18152},[274],[28,18154],{"className":18155,"style":302},[279],[28,18157,1876],{"className":18158},[306],[28,18160],{"className":18161,"style":302},[279],[28,18163,18165,18168,18171,18174,18177,18180,18183],{"className":18164},[265],[28,18166],{"className":18167,"style":316},[269],[28,18169,17311],{"className":18170},[274],[28,18172],{"className":18173,"style":302},[279],[28,18175],{"className":18176,"style":280},[279],[28,18178,233],{"className":18179},[284],[28,18181],{"className":18182,"style":302},[279],[28,18184],{"className":18185,"style":280},[279],[28,18187,18189,18192,18198,18201,18204],{"className":18188},[265],[28,18190],{"className":18191,"style":16489},[269],[28,18193,18195],{"className":18194},[274,11179],[28,18196,17361],{"className":18197},[274],[28,18199],{"className":18200,"style":302},[279],[28,18202,130],{"className":18203},[306],[28,18205],{"className":18206,"style":302},[279],[28,18208,18210,18213,18216,18219,18222,18225,18228],{"className":18209},[265],[28,18211],{"className":18212,"style":316},[269],[28,18214,17311],{"className":18215},[274],[28,18217],{"className":18218,"style":302},[279],[28,18220],{"className":18221,"style":280},[279],[28,18223,233],{"className":18224},[284],[28,18226],{"className":18227,"style":302},[279],[28,18229],{"className":18230,"style":280},[279],[28,18232,18234,18237,18243,18246,18249],{"className":18233},[265],[28,18235],{"className":18236,"style":17104},[269],[28,18238,18240],{"className":18239},[274,11179],[28,18241,16419],{"className":18242},[274],[28,18244],{"className":18245,"style":302},[279],[28,18247,9572],{"className":18248},[306],[28,18250],{"className":18251,"style":302},[279],[28,18253,18255,18258],{"className":18254},[265],[28,18256],{"className":18257,"style":316},[269],[28,18259,89],{"className":18260},[274],[11,18262,18263,18264,18266,18267,18346],{},"这个公式是 ",[183,18265,6456],{},"，因为 ",[28,18268,18270,18292],{"className":18269,"translate":193},[197],[28,18271,18273],{"className":18272},[201],[203,18274,18275],{"xmlns":205},[208,18276,18277,18289],{},[211,18278,18279,18281,18283,18285,18287],{},[228,18280,17361],{},[217,18282,124],{},[228,18284,16419],{},[217,18286,130],{},[224,18288,17311],{},[253,18290,18291],{"encoding":255},"\\text{off} + \\text{len} > 64",[28,18293,18295,18316,18337],{"className":18294,"ariaHidden":261},[260],[28,18296,18298,18301,18307,18310,18313],{"className":18297},[265],[28,18299],{"className":18300,"style":4154},[269],[28,18302,18304],{"className":18303},[274,11179],[28,18305,17361],{"className":18306},[274],[28,18308],{"className":18309,"style":280},[279],[28,18311,124],{"className":18312},[284],[28,18314],{"className":18315,"style":280},[279],[28,18317,18319,18322,18328,18331,18334],{"className":18318},[265],[28,18320],{"className":18321,"style":16489},[269],[28,18323,18325],{"className":18324},[274,11179],[28,18326,16419],{"className":18327},[274],[28,18329],{"className":18330,"style":302},[279],[28,18332,130],{"className":18333},[306],[28,18335],{"className":18336,"style":302},[279],[28,18338,18340,18343],{"className":18339},[265],[28,18341],{"className":18342,"style":316},[269],[28,18344,17311],{"className":18345},[274]," 直接和第一条矛盾。工具会得出结论「没有漏洞」，而实际上漏洞就在那里。",[11,18348,18349,18352,18353,18356],{},[183,18350,18351],{},"同一个程序，两种理论，两个相反的答案。"," 这就是为什么漏洞检测工具必须精确建模目标语言的整数语义：C 的 ",[25,18354,18355],{},"unsigned int"," 是模运算，不是数学整数。",[419,18358,18360],{"id":18359},"_54-空指针","5.4 空指针",[11,18362,18363],{},"静态分析经常报「可能的空指针解引用」。这类告警里有很多是误报，SMT 可以用来过滤。",[18,18365,18367],{"className":20,"code":18366,"language":22,"meta":23,"style":23},"int read_flag(struct node *p) {\n    if (p == NULL) return 0;\n    return p->flag;     \u002F\u002F 静态分析：p 可能为空？\n}\n",[25,18368,18369,18391,18414,18425],{"__ignoreMap":23},[28,18370,18371,18373,18376,18378,18381,18384,18387,18389],{"class":30,"line":31},[28,18372,46],{"class":34},[28,18374,18375],{"class":38}," read_flag",[28,18377,43],{"class":42},[28,18379,18380],{"class":34},"struct",[28,18382,18383],{"class":42}," node ",[28,18385,18386],{"class":34},"*",[28,18388,11],{"class":49},[28,18390,61],{"class":42},[28,18392,18393,18395,18398,18400,18403,18406,18409,18412],{"class":30,"line":64},[28,18394,118],{"class":34},[28,18396,18397],{"class":42}," (p ",[28,18399,147],{"class":34},[28,18401,18402],{"class":76}," NULL",[28,18404,18405],{"class":42},") ",[28,18407,18408],{"class":34},"return",[28,18410,18411],{"class":76}," 0",[28,18413,112],{"class":42},[28,18415,18416,18419,18422],{"class":30,"line":95},[28,18417,18418],{"class":34},"    return",[28,18420,18421],{"class":42}," p->flag;",[28,18423,18424],{"class":157},"     \u002F\u002F 静态分析：p 可能为空？\n",[28,18426,18427],{"class":30,"line":115},[28,18428,170],{"class":42},[11,18430,18431,18432,18435,18436,18439],{},"工具在 ",[25,18433,18434],{},"p->flag"," 处收集路径条件。走到这一行，必然经过了 ",[25,18437,18438],{},"p == NULL"," 为假的分支，所以路径条件里包含：",[28,18441,18443],{"className":18442,"translate":193},[192],[28,18444,18446,18465],{"className":18445,"translate":193},[197],[28,18447,18449],{"className":18448},[201],[203,18450,18451],{"xmlns":205,"display":206},[208,18452,18453,18462],{},[211,18454,18455,18457,18459],{},[214,18456,11],{},[217,18458,1854],{"mathvariant":484},[228,18460,18461],{"mathvariant":13013},"NULL",[253,18463,18464],{"encoding":255},"p \\ne \\texttt{NULL}",[28,18466,18468,18519],{"className":18467,"ariaHidden":261},[260],[28,18469,18471,18474,18477,18480,18516],{"className":18470},[265],[28,18472],{"className":18473,"style":2371},[269],[28,18475,11],{"className":18476},[274,275],[28,18478],{"className":18479,"style":302},[279],[28,18481,18483,18510,18513],{"className":18482},[306],[28,18484,18486],{"className":18485},[306],[28,18487,18489],{"className":18488},[274,2359],[28,18490,18492],{"className":18491},[2363],[28,18493,18495,18498,18507],{"className":18494},[2367],[28,18496],{"className":18497,"style":2371},[269],[28,18499,18501],{"className":18500},[2375],[28,18502,18504],{"className":18503},[274],[28,18505,2382],{"className":18506},[306],[28,18508],{"className":18509},[2386],[28,18511],{"className":18512},[279,2390],[28,18514,83],{"className":18515},[306],[28,18517],{"className":18518,"style":302},[279],[28,18520,18522,18525],{"className":18521},[265],[28,18523],{"className":18524,"style":13204},[269],[28,18526,18528],{"className":18527},[274,11179],[28,18529,18461],{"className":18530},[274,13211],[11,18532,18533,18534,18536],{},"静态分析如果只做局部启发式，可能会说「",[25,18535,11],{}," 可能是空指针」。这时问 SMT：",[28,18538,18540],{"className":18539,"translate":193},[192],[28,18541,18543,18573],{"className":18542,"translate":193},[197],[28,18544,18546],{"className":18545},[201],[203,18547,18548],{"xmlns":205,"display":206},[208,18549,18550,18570],{},[211,18551,18552,18554,18556,18558,18560,18562,18564,18566,18568],{},[214,18553,11],{},[217,18555,83],{},[228,18557,18461],{"mathvariant":13013},[228,18559,230],{},[217,18561,233],{},[228,18563,230],{},[214,18565,11],{},[217,18567,1854],{"mathvariant":484},[228,18569,18461],{"mathvariant":13013},[253,18571,18572],{"encoding":255},"p = \\texttt{NULL} \\;\\wedge\\; p \\ne \\texttt{NULL}",[28,18574,18576,18594,18621,18672],{"className":18575,"ariaHidden":261},[260],[28,18577,18579,18582,18585,18588,18591],{"className":18578},[265],[28,18580],{"className":18581,"style":612},[269],[28,18583,11],{"className":18584},[274,275],[28,18586],{"className":18587,"style":302},[279],[28,18589,83],{"className":18590},[306],[28,18592],{"className":18593,"style":302},[279],[28,18595,18597,18600,18606,18609,18612,18615,18618],{"className":18596},[265],[28,18598],{"className":18599,"style":13204},[269],[28,18601,18603],{"className":18602},[274,11179],[28,18604,18461],{"className":18605},[274,13211],[28,18607],{"className":18608,"style":302},[279],[28,18610],{"className":18611,"style":280},[279],[28,18613,233],{"className":18614},[284],[28,18616],{"className":18617,"style":302},[279],[28,18619],{"className":18620,"style":280},[279],[28,18622,18624,18627,18630,18633,18669],{"className":18623},[265],[28,18625],{"className":18626,"style":2371},[269],[28,18628,11],{"className":18629},[274,275],[28,18631],{"className":18632,"style":302},[279],[28,18634,18636,18663,18666],{"className":18635},[306],[28,18637,18639],{"className":18638},[306],[28,18640,18642],{"className":18641},[274,2359],[28,18643,18645],{"className":18644},[2363],[28,18646,18648,18651,18660],{"className":18647},[2367],[28,18649],{"className":18650,"style":2371},[269],[28,18652,18654],{"className":18653},[2375],[28,18655,18657],{"className":18656},[274],[28,18658,2382],{"className":18659},[306],[28,18661],{"className":18662},[2386],[28,18664],{"className":18665},[279,2390],[28,18667,83],{"className":18668},[306],[28,18670],{"className":18671,"style":302},[279],[28,18673,18675,18678],{"className":18674},[265],[28,18676],{"className":18677,"style":13204},[269],[28,18679,18681],{"className":18680},[274,11179],[28,18682,18461],{"className":18683},[274,13211],[11,18685,18686,18687,18689],{},"这是明显的矛盾，返回 ",[183,18688,6456],{},"，告警被排除。",[11,18691,18692],{},"反过来，如果代码是：",[18,18694,18696],{"className":20,"code":18695,"language":22,"meta":23,"style":23},"int read_flag(struct node *p) {\n    if (p->flag == 1) {   \u002F\u002F 这里没有检查 p\n        return 1;\n    }\n    return 0;\n}\n",[25,18697,18698,18716,18734,18743,18747,18755],{"__ignoreMap":23},[28,18699,18700,18702,18704,18706,18708,18710,18712,18714],{"class":30,"line":31},[28,18701,46],{"class":34},[28,18703,18375],{"class":38},[28,18705,43],{"class":42},[28,18707,18380],{"class":34},[28,18709,18383],{"class":42},[28,18711,18386],{"class":34},[28,18713,11],{"class":49},[28,18715,61],{"class":42},[28,18717,18718,18720,18723,18725,18728,18731],{"class":30,"line":64},[28,18719,118],{"class":34},[28,18721,18722],{"class":42}," (p->flag ",[28,18724,147],{"class":34},[28,18726,18727],{"class":76}," 1",[28,18729,18730],{"class":42},") {",[28,18732,18733],{"class":157},"   \u002F\u002F 这里没有检查 p\n",[28,18735,18736,18739,18741],{"class":30,"line":95},[28,18737,18738],{"class":34},"        return",[28,18740,18727],{"class":76},[28,18742,112],{"class":42},[28,18744,18745],{"class":30,"line":115},[28,18746,164],{"class":42},[28,18748,18749,18751,18753],{"class":30,"line":154},[28,18750,18418],{"class":34},[28,18752,18411],{"class":76},[28,18754,112],{"class":42},[28,18756,18757],{"class":30,"line":161},[28,18758,170],{"class":42},[11,18760,18761,18762,18848],{},"路径条件里没有 ",[28,18763,18765,18782],{"className":18764,"translate":193},[197],[28,18766,18768],{"className":18767},[201],[203,18769,18770],{"xmlns":205},[208,18771,18772,18780],{},[211,18773,18774,18776,18778],{},[214,18775,11],{},[217,18777,1854],{"mathvariant":484},[228,18779,18461],{"mathvariant":13013},[253,18781,18464],{"encoding":255},[28,18783,18785,18836],{"className":18784,"ariaHidden":261},[260],[28,18786,18788,18791,18794,18797,18833],{"className":18787},[265],[28,18789],{"className":18790,"style":2371},[269],[28,18792,11],{"className":18793},[274,275],[28,18795],{"className":18796,"style":302},[279],[28,18798,18800,18827,18830],{"className":18799},[306],[28,18801,18803],{"className":18802},[306],[28,18804,18806],{"className":18805},[274,2359],[28,18807,18809],{"className":18808},[2363],[28,18810,18812,18815,18824],{"className":18811},[2367],[28,18813],{"className":18814,"style":2371},[269],[28,18816,18818],{"className":18817},[2375],[28,18819,18821],{"className":18820},[274],[28,18822,2382],{"className":18823},[306],[28,18825],{"className":18826},[2386],[28,18828],{"className":18829},[279,2390],[28,18831,83],{"className":18832},[306],[28,18834],{"className":18835,"style":302},[279],[28,18837,18839,18842],{"className":18838},[265],[28,18840],{"className":18841,"style":13204},[269],[28,18843,18845],{"className":18844},[274,11179],[28,18846,18461],{"className":18847},[274,13211],"，查询：",[28,18850,18852],{"className":18851,"translate":193},[192],[28,18853,18855,18873],{"className":18854,"translate":193},[197],[28,18856,18858],{"className":18857},[201],[203,18859,18860],{"xmlns":205,"display":206},[208,18861,18862,18870],{},[211,18863,18864,18866,18868],{},[214,18865,11],{},[217,18867,83],{},[228,18869,18461],{"mathvariant":13013},[253,18871,18872],{"encoding":255},"p = \\texttt{NULL}",[28,18874,18876,18894],{"className":18875,"ariaHidden":261},[260],[28,18877,18879,18882,18885,18888,18891],{"className":18878},[265],[28,18880],{"className":18881,"style":612},[269],[28,18883,11],{"className":18884},[274,275],[28,18886],{"className":18887,"style":302},[279],[28,18889,83],{"className":18890},[306],[28,18892],{"className":18893,"style":302},[279],[28,18895,18897,18900],{"className":18896},[265],[28,18898],{"className":18899,"style":13204},[269],[28,18901,18903],{"className":18902},[274,11179],[28,18904,18461],{"className":18905},[274,13211],[11,18907,18908,18909,18911,18912,18915],{},"返回 ",[183,18910,405],{},"，模型给出 ",[25,18913,18914],{},"p = NULL","。这是一条真实可达的空指针路径，告警保留。",[11,18917,18918,18919,18922],{},"这个用法体现了一个重要原则：",[183,18920,18921],{},"SMT 不负责发现漏洞，它负责判断「这条路径到底可不可能」","。发现可疑点靠前端分析，排除误报靠 SMT。",[419,18924,18926],{"id":18925},"_55-数组越界","5.5 数组越界",[18,18928,18930],{"className":20,"code":18929,"language":22,"meta":23,"style":23},"int get(int *a, int i) {\n    if (i \u003C 100) {\n        return a[i];     \u002F\u002F i 可能为负\n    }\n    return -1;\n}\n",[25,18931,18932,18956,18970,18982,18986,18997],{"__ignoreMap":23},[28,18933,18934,18936,18939,18941,18943,18945,18947,18949,18951,18954],{"class":30,"line":31},[28,18935,46],{"class":34},[28,18937,18938],{"class":38}," get",[28,18940,43],{"class":42},[28,18942,46],{"class":34},[28,18944,16337],{"class":34},[28,18946,238],{"class":49},[28,18948,53],{"class":42},[28,18950,46],{"class":34},[28,18952,18953],{"class":49}," i",[28,18955,61],{"class":42},[28,18957,18958,18960,18963,18965,18968],{"class":30,"line":64},[28,18959,118],{"class":34},[28,18961,18962],{"class":42}," (i ",[28,18964,1383],{"class":34},[28,18966,18967],{"class":76}," 100",[28,18969,61],{"class":42},[28,18971,18972,18974,18976,18979],{"class":30,"line":95},[28,18973,18738],{"class":34},[28,18975,70],{"class":49},[28,18977,18978],{"class":42},"[i];",[28,18980,18981],{"class":157},"     \u002F\u002F i 可能为负\n",[28,18983,18984],{"class":30,"line":115},[28,18985,164],{"class":42},[28,18987,18988,18990,18993,18995],{"class":30,"line":154},[28,18989,18418],{"class":34},[28,18991,18992],{"class":34}," -",[28,18994,1244],{"class":76},[28,18996,112],{"class":42},[28,18998,18999],{"class":30,"line":161},[28,19000,170],{"class":42},[11,19002,19003],{},"只检查了上界，没检查下界。问 SMT：",[28,19005,19007],{"className":19006,"translate":193},[192],[28,19008,19010,19040],{"className":19009,"translate":193},[197],[28,19011,19013],{"className":19012},[201],[203,19014,19015],{"xmlns":205,"display":206},[208,19016,19017,19037],{},[211,19018,19019,19021,19023,19025,19027,19029,19031,19033,19035],{},[214,19020,1686],{},[217,19022,1383],{},[224,19024,77],{},[228,19026,230],{},[217,19028,233],{},[228,19030,230],{},[214,19032,1686],{},[217,19034,1383],{},[224,19036,89],{},[253,19038,19039],{"encoding":255},"i \u003C 100 \\;\\wedge\\; i \u003C 0",[28,19041,19043,19062,19086,19104],{"className":19042,"ariaHidden":261},[260],[28,19044,19046,19050,19053,19056,19059],{"className":19045},[265],[28,19047],{"className":19048,"style":19049},[269],"height:0.6986em;vertical-align:-0.0391em;",[28,19051,1686],{"className":19052},[274,275],[28,19054],{"className":19055,"style":302},[279],[28,19057,1383],{"className":19058},[306],[28,19060],{"className":19061,"style":302},[279],[28,19063,19065,19068,19071,19074,19077,19080,19083],{"className":19064},[265],[28,19066],{"className":19067,"style":316},[269],[28,19069,77],{"className":19070},[274],[28,19072],{"className":19073,"style":302},[279],[28,19075],{"className":19076,"style":280},[279],[28,19078,233],{"className":19079},[284],[28,19081],{"className":19082,"style":302},[279],[28,19084],{"className":19085,"style":280},[279],[28,19087,19089,19092,19095,19098,19101],{"className":19088},[265],[28,19090],{"className":19091,"style":19049},[269],[28,19093,1686],{"className":19094},[274,275],[28,19096],{"className":19097,"style":302},[279],[28,19099,1383],{"className":19100},[306],[28,19102],{"className":19103,"style":302},[279],[28,19105,19107,19110],{"className":19106},[265],[28,19108],{"className":19109,"style":316},[269],[28,19111,89],{"className":19112},[274],[11,19114,19115,19116,2923,19119,19122],{},"返回 sat，例如 ",[25,19117,19118],{},"i = -1",[25,19120,19121],{},"a[-1]"," 是一次越界读。",[11,19124,19125],{},"如果加上下界检查：",[18,19127,19129],{"className":20,"code":19128,"language":22,"meta":23,"style":23},"if (i >= 0 && i \u003C 100) {\n    return a[i];\n}\n",[25,19130,19131,19153,19162],{"__ignoreMap":23},[28,19132,19133,19135,19137,19140,19142,19144,19147,19149,19151],{"class":30,"line":31},[28,19134,16953],{"class":34},[28,19136,18962],{"class":42},[28,19138,19139],{"class":34},">=",[28,19141,18411],{"class":76},[28,19143,136],{"class":34},[28,19145,19146],{"class":42}," i ",[28,19148,1383],{"class":34},[28,19150,18967],{"class":76},[28,19152,61],{"class":42},[28,19154,19155,19157,19159],{"class":30,"line":64},[28,19156,18418],{"class":34},[28,19158,70],{"class":49},[28,19160,19161],{"class":42},"[i];\n",[28,19163,19164],{"class":30,"line":95},[28,19165,170],{"class":42},[11,19167,19168],{},"约束变成：",[28,19170,19172],{"className":19171,"translate":193},[192],[28,19173,19175,19217],{"className":19174,"translate":193},[197],[28,19176,19178],{"className":19177},[201],[203,19179,19180],{"xmlns":205,"display":206},[208,19181,19182,19214],{},[211,19183,19184,19186,19188,19190,19192,19194,19196,19198,19200,19202,19204,19206,19208,19210,19212],{},[214,19185,1686],{},[217,19187,9572],{},[224,19189,89],{},[228,19191,230],{},[217,19193,233],{},[228,19195,230],{},[214,19197,1686],{},[217,19199,1383],{},[224,19201,77],{},[228,19203,230],{},[217,19205,233],{},[228,19207,230],{},[214,19209,1686],{},[217,19211,1383],{},[224,19213,89],{},[253,19215,19216],{"encoding":255},"i \\ge 0 \\;\\wedge\\; i \u003C 100 \\;\\wedge\\; i \u003C 0",[28,19218,19220,19239,19263,19281,19305,19323],{"className":19219,"ariaHidden":261},[260],[28,19221,19223,19227,19230,19233,19236],{"className":19222},[265],[28,19224],{"className":19225,"style":19226},[269],"height:0.7955em;vertical-align:-0.136em;",[28,19228,1686],{"className":19229},[274,275],[28,19231],{"className":19232,"style":302},[279],[28,19234,9572],{"className":19235},[306],[28,19237],{"className":19238,"style":302},[279],[28,19240,19242,19245,19248,19251,19254,19257,19260],{"className":19241},[265],[28,19243],{"className":19244,"style":316},[269],[28,19246,89],{"className":19247},[274],[28,19249],{"className":19250,"style":302},[279],[28,19252],{"className":19253,"style":280},[279],[28,19255,233],{"className":19256},[284],[28,19258],{"className":19259,"style":302},[279],[28,19261],{"className":19262,"style":280},[279],[28,19264,19266,19269,19272,19275,19278],{"className":19265},[265],[28,19267],{"className":19268,"style":19049},[269],[28,19270,1686],{"className":19271},[274,275],[28,19273],{"className":19274,"style":302},[279],[28,19276,1383],{"className":19277},[306],[28,19279],{"className":19280,"style":302},[279],[28,19282,19284,19287,19290,19293,19296,19299,19302],{"className":19283},[265],[28,19285],{"className":19286,"style":316},[269],[28,19288,77],{"className":19289},[274],[28,19291],{"className":19292,"style":302},[279],[28,19294],{"className":19295,"style":280},[279],[28,19297,233],{"className":19298},[284],[28,19300],{"className":19301,"style":302},[279],[28,19303],{"className":19304,"style":280},[279],[28,19306,19308,19311,19314,19317,19320],{"className":19307},[265],[28,19309],{"className":19310,"style":19049},[269],[28,19312,1686],{"className":19313},[274,275],[28,19315],{"className":19316,"style":302},[279],[28,19318,1383],{"className":19319},[306],[28,19321],{"className":19322,"style":302},[279],[28,19324,19326,19329],{"className":19325},[265],[28,19327],{"className":19328,"style":316},[269],[28,19330,89],{"className":19331},[274],[11,19333,18908,19334,19336],{},[183,19335,6456],{},"，越界路径被排除。",[11,19338,19339,19340,19343,19344,19347],{},"这个例子还可以扩展成带数组理论的版本。比如要验证「下标不同时，写入 ",[25,19341,19342],{},"a[j]"," 不会影响对 ",[25,19345,19346],{},"a[i]"," 的读取」，可以把「影响了」写成公式，再问它是否可满足：",[28,19349,19351],{"className":19350,"translate":193},[192],[28,19352,19354,19452],{"className":19353,"translate":193},[197],[28,19355,19357],{"className":19356},[201],[203,19358,19359],{"xmlns":205,"display":206},[208,19360,19361,19449],{},[211,19362,19363,19365,19367,19369,19371,19373,19375,19389,19391,19403,19405,19407,19409,19411,19413,19415,19417,19419,19421,19423,19425,19439,19441,19443,19445,19447],{},[214,19364,1686],{},[217,19366,1854],{"mathvariant":484},[214,19368,7907],{},[228,19370,230],{},[217,19372,233],{},[228,19374,230],{},[211,19376,19377,19379,19381,19383,19385,19387],{},[214,19378,1664],{"mathvariant":484},[214,19380,1667],{"mathvariant":484},[214,19382,1670],{"mathvariant":484},[214,19384,1667],{"mathvariant":484},[214,19386,22],{"mathvariant":484},[214,19388,1241],{"mathvariant":484},[217,19390,43],{"fence":261,"stretchy":261,"minsize":1810,"maxsize":1810},[211,19392,19393,19395,19397,19399,19401],{},[214,19394,1664],{"mathvariant":484},[214,19396,1241],{"mathvariant":484},[214,19398,3933],{"mathvariant":484},[214,19400,1867],{"mathvariant":484},[214,19402,1667],{"mathvariant":484},[217,19404,43],{"stretchy":241},[214,19406,238],{},[217,19408,1683],{"separator":261},[214,19410,7907],{},[217,19412,1683],{"separator":261},[214,19414,1693],{},[217,19416,1522],{"stretchy":241},[217,19418,1683],{"separator":261},[214,19420,1686],{},[217,19422,1522],{"fence":261,"stretchy":261,"minsize":1810,"maxsize":1810},[217,19424,1854],{"mathvariant":484},[211,19426,19427,19429,19431,19433,19435,19437],{},[214,19428,1664],{"mathvariant":484},[214,19430,1667],{"mathvariant":484},[214,19432,1670],{"mathvariant":484},[214,19434,1667],{"mathvariant":484},[214,19436,22],{"mathvariant":484},[214,19438,1241],{"mathvariant":484},[217,19440,43],{"stretchy":241},[214,19442,238],{},[217,19444,1683],{"separator":261},[214,19446,1686],{},[217,19448,1522],{"stretchy":241},[253,19450,19451],{"encoding":255},"i \\ne j \\;\\wedge\\; \\mathrm{select}\\bigl(\\mathrm{store}(a, j, v), i\\bigr) \\ne \\mathrm{select}(a, i)",[28,19453,19455,19506,19530,19638],{"className":19454,"ariaHidden":261},[260],[28,19456,19458,19461,19464,19467,19503],{"className":19457},[265],[28,19459],{"className":19460,"style":2371},[269],[28,19462,1686],{"className":19463},[274,275],[28,19465],{"className":19466,"style":302},[279],[28,19468,19470,19497,19500],{"className":19469},[306],[28,19471,19473],{"className":19472},[306],[28,19474,19476],{"className":19475},[274,2359],[28,19477,19479],{"className":19478},[2363],[28,19480,19482,19485,19494],{"className":19481},[2367],[28,19483],{"className":19484,"style":2371},[269],[28,19486,19488],{"className":19487},[2375],[28,19489,19491],{"className":19490},[274],[28,19492,2382],{"className":19493},[306],[28,19495],{"className":19496},[2386],[28,19498],{"className":19499},[279,2390],[28,19501,83],{"className":19502},[306],[28,19504],{"className":19505,"style":302},[279],[28,19507,19509,19512,19515,19518,19521,19524,19527],{"className":19508},[265],[28,19510],{"className":19511,"style":13600},[269],[28,19513,7907],{"className":19514,"style":8057},[274,275],[28,19516],{"className":19517,"style":302},[279],[28,19519],{"className":19520,"style":280},[279],[28,19522,233],{"className":19523},[284],[28,19525],{"className":19526,"style":302},[279],[28,19528],{"className":19529,"style":280},[279],[28,19531,19533,19536,19542,19548,19554,19557,19560,19563,19566,19569,19572,19575,19578,19581,19584,19587,19590,19596,19599,19635],{"className":19532},[265],[28,19534],{"className":19535,"style":2469},[269],[28,19537,19539],{"className":19538},[274],[28,19540,1713],{"className":19541},[274,1712],[28,19543,19545],{"className":19544},[348],[28,19546,43],{"className":19547},[2169,2170],[28,19549,19551],{"className":19550},[274],[28,19552,2696],{"className":19553},[274,1712],[28,19555,43],{"className":19556},[348],[28,19558,238],{"className":19559},[274,275],[28,19561,1683],{"className":19562},[1723],[28,19564],{"className":19565,"style":530},[279],[28,19567,7907],{"className":19568,"style":8057},[274,275],[28,19570,1683],{"className":19571},[1723],[28,19573],{"className":19574,"style":530},[279],[28,19576,1693],{"className":19577,"style":298},[274,275],[28,19579,1522],{"className":19580},[355],[28,19582,1683],{"className":19583},[1723],[28,19585],{"className":19586,"style":530},[279],[28,19588,1686],{"className":19589},[274,275],[28,19591,19593],{"className":19592},[355],[28,19594,1522],{"className":19595},[2169,2170],[28,19597],{"className":19598,"style":302},[279],[28,19600,19602,19629,19632],{"className":19601},[306],[28,19603,19605],{"className":19604},[306],[28,19606,19608],{"className":19607},[274,2359],[28,19609,19611],{"className":19610},[2363],[28,19612,19614,19617,19626],{"className":19613},[2367],[28,19615],{"className":19616,"style":2371},[269],[28,19618,19620],{"className":19619},[2375],[28,19621,19623],{"className":19622},[274],[28,19624,2382],{"className":19625},[306],[28,19627],{"className":19628},[2386],[28,19630],{"className":19631},[279,2390],[28,19633,83],{"className":19634},[306],[28,19636],{"className":19637,"style":302},[279],[28,19639,19641,19644,19650,19653,19656,19659,19662,19665],{"className":19640},[265],[28,19642],{"className":19643,"style":341},[269],[28,19645,19647],{"className":19646},[274],[28,19648,1713],{"className":19649},[274,1712],[28,19651,43],{"className":19652},[348],[28,19654,238],{"className":19655},[274,275],[28,19657,1683],{"className":19658},[1723],[28,19660],{"className":19661,"style":530},[279],[28,19663,1686],{"className":19664},[274,275],[28,19666,1522],{"className":19667},[355],[11,19669,19670,19671,19755,19756,19758],{},"数组理论会展开 read-over-write 公理，算术理论会处理 ",[28,19672,19674,19692],{"className":19673,"translate":193},[197],[28,19675,19677],{"className":19676},[201],[203,19678,19679],{"xmlns":205},[208,19680,19681,19689],{},[211,19682,19683,19685,19687],{},[214,19684,1686],{},[217,19686,1854],{"mathvariant":484},[214,19688,7907],{},[253,19690,19691],{"encoding":255},"i \\ne j",[28,19693,19695,19746],{"className":19694,"ariaHidden":261},[260],[28,19696,19698,19701,19704,19707,19743],{"className":19697},[265],[28,19699],{"className":19700,"style":2371},[269],[28,19702,1686],{"className":19703},[274,275],[28,19705],{"className":19706,"style":302},[279],[28,19708,19710,19737,19740],{"className":19709},[306],[28,19711,19713],{"className":19712},[306],[28,19714,19716],{"className":19715},[274,2359],[28,19717,19719],{"className":19718},[2363],[28,19720,19722,19725,19734],{"className":19721},[2367],[28,19723],{"className":19724,"style":2371},[269],[28,19726,19728],{"className":19727},[2375],[28,19729,19731],{"className":19730},[274],[28,19732,2382],{"className":19733},[306],[28,19735],{"className":19736},[2386],[28,19738],{"className":19739},[279,2390],[28,19741,83],{"className":19742},[306],[28,19744],{"className":19745,"style":302},[279],[28,19747,19749,19752],{"className":19748},[265],[28,19750],{"className":19751,"style":13600},[269],[28,19753,7907],{"className":19754,"style":8057},[274,275],"，两个理论协作给出 ",[183,19757,6456],{},"——也就是说，「写入影响了另一个下标」的情况不可能发生。这正是 3.3 节里理论组合的实际用武之地。",[419,19760,19762],{"id":19761},"_56-完整流程","5.6 完整流程",[11,19764,19765],{},"把上面的步骤串起来，一个典型的漏洞检测流程是这样的：",[2907,19767,19768],{},[2910,19769],{"height":19770,"width":19771,"style":2914,"data-d2-theme":2915,"alt":23,"src":19772},240,2053,"data:image\u002Fsvg+xml;base64,PHN2ZyB3aWR0aD0iMjA1MyIgaGVpZ2h0PSIyNDAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgZGF0YS1kMi12ZXJzaW9uPSJ2MC45LjAiIHZpZXdCb3g9IjAgMCAyMDUzIDI0MCI+PHN2ZyB3aWR0aD0iMjA1MyIgaGVpZ2h0PSIyNDAiIGNsYXNzPSJkMi0zNzYyNjY4MTczIGQyLXN2ZyIgdmlld0JveD0iLTEgLTEgMjA1MyAyNDAiPjxyZWN0IHdpZHRoPSIyMDUzIiBoZWlnaHQ9IjI0MCIgeD0iLTEiIHk9Ii0xIiBzdHJva2Utd2lkdGg9IjAiIHJ4PSIwIiBzdHlsZT0iZmlsbDojZmZmIi8+PHN0eWxlPi5kMi0zNzYyNjY4MTczIC50ZXh0LWJvbGR7Zm9udC1mYW1pbHk6JnF1b3Q7ZDItMzc2MjY2ODE3My1mb250LWJvbGQmcXVvdDt9QGZvbnQtZmFjZXtmb250LWZhbWlseTpkMi0zNzYyNjY4MTczLWZvbnQtYm9sZDtzcmM6dXJsKGRhdGE6YXBwbGljYXRpb24vZm9udC13b2ZmO2Jhc2U2NCxkMDlHUmdBQkFBQUFBQTRvQUFvQUFBQUFGWHdBQWd1RkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQlBVeTh5QUFBQTlBQUFBR0FBQUFCZ1h4SFhybU50WVhBQUFBRlVBQUFBckFBQUFPd0VPQVU4WjJ4NVpnQUFBZ0FBQUFlTUFBQUo3QkhWK0RSb1pXRmtBQUFKakFBQUFEWUFBQUEyRzM4ZTFHaG9aV0VBQUFuRUFBQUFKQUFBQUNRS2Z3WGhhRzEwZUFBQUNlZ0FBQUNJQUFBQWlFRmZCYjlzYjJOaEFBQUtjQUFBQUVZQUFBQkdMUzRxMkcxaGVIQUFBQXE0QUFBQUlBQUFBQ0FBT2dEM2JtRnRaUUFBQ3RnQUFBTXZBQUFJS2dqd1ZrRndiM04wQUFBT0NBQUFBQ0FBQUFBZy85RUFNZ0FEQWlvQ3ZBQUZBQUFDaWdKWUFBQUFTd0tLQWxnQUFBRmVBRElCS1FBQUFnc0hBd01FQXdJQ0JHQUFBdmNBQUFBREFBQUFBQUFBQUFCQlJFSlBBQ0FBSVAvL0F1Ny9CZ0FBQTlnQkVTQUFBWjhBQUFBQUFmQUNsQUFBQUNBQUEzaWNoTTA3SzhWeEFJZnh6OS81dVIvMysvME1Ob05CM2dDZFNlb1VrMDJTMUVreWVFY0lrMFd5OEZMWW1DejJyenFUN2ZTc24zcFFxYWxRVjN4Z1hVTlJOR3pZdEdYYnJxWjlMWWVPSER0MXJ1M1NkY0kvdGFOcFQ4dEJSNTA0MDNiaEtzbG5mdk9UNzN6bFBXOTV6VXVlODVUSFBPUStkN25OVGVmZnZjcWFWY3RXOUtncGV2WHBOMkRRa0dGMUkwYU5HVGRoMHBScE0yYk5tYmRnMFJKL0FBQUEvLzhEQUtaYkwxbDRuR1JXU1d3YjF4biszeVBGaVNqSzBuQTRISkxpTm56a0RCZUpzamdjamlSS3BpaFIxR0xSMm14WmpyVTRncHNva1d3SHRsekxpWUFjYWlSb1NxTW82Qlp1QWpRTFdyUUZHdFNGVWRRMTRCNEtkREdTVXgwMHA5aHUwVXR5cUlXVVhkSlF3MktHbEd5cnAzY1l2di8vTnY3L2d3YVlBc0FyK0JvWW9CRmF3QW9zZ0VUemRFZ1NSVUlwa3FJUXpxQ0lpS2Ftc0ZYOTBRL0ZpREVTTVViOTEzMnZMQytqd2hLK3RyTitzckN5OHEvbGRGcjl3YTl2cTFmUmhkc0FCaWdBNEQ1Y0JCcGNFTkJxU2dtN25iV1pLRlkvVE1RZ0pWSnlVaUNFbGhMNldYaVFXeC9vQ0NlR2N1ZEhsb2RUWFlsa2Z2WnlYLzhzTG5yeW1kaHNpN0g1Y0hib2FBUzlFU1dDWDUyZmo0VUFFTVNyWlh3UVg0YzJnSWFBSU1qSlZFcEsyRGxLRUVqQVpHSnRkaW1SVWpnVFdweDVjL2JZMVpuTWFmNklVeUh0WTdHNTBYREdjV1RHTXZIZE0rdmZuNVlDUzV3bnNUUjQrdVdnYytFVUlDZ0FvRWU0Q0UyNkhpelBTaXhoZWJhQXJxdGYzYitQV25CeDZ4dXZmbThMTkF3YTEzVmNCSXZPazVZWXljQVFBOFVXU3NiZnZ2Kzd6OTU3WndJWDFYK2lKcldpYmlMbTlNL3JkOUJmY1JFYWFuZDR0bEJDR0JkM3RyZGdyK1lIdUFnKy9UdGp0M05TS3FVd0VrMDBpZ3FoS0NLS3hJdFp0dkRlaTJhcjJXaW16Uys4K3pyVmFEREtpOU9MU2FQeEdRb1gxZnZ1UTE3dklUY0s3R3c4OGs5TytkNys4c3UzZlZPVC9rY0FXTzl4VU1kdGU4SWhFeUhzbmljUFJ5L204eHZEMDZPYkEzMDVYQlFYSmlkV09qOUZNNnRTdElhVFZNdllqSzlEVk5kZlZPeWE0SEpTRU1VNGZ0b00xbWJudUZvSFpCdDRMWEdVeklYakhWTHNHTjhucEYvTWRiOGNQZXdmRUlXT251alJkTDczck9WZy9HdGVJZUR4ZWF6QkE1MzV6dFI4c2oyNjZHenp1YjFlT3VBNE9weGE2QVlFVGdETTRDSlFHZ01pOHl5aFA3cUovbnNUdDI1dDdXelhNQVlCVUFVWG9SRkFraEV2OHl6aTJTRHlxMStoMitwRFJFNmdYMjJkVU1lMk5FMmkxVEw2R0ZYQUNRU0FDMmlCVXZRc1VhSk9ocVdKU0V3bUpaRlNaRDFmdjhsTlhTbGhFdkVOQk9YT3RkN2w1emZOUnQvSU04NFFjNlRQWnptZU9UTGZ3b3NPOWpsUDhPeDU5VytTbTV6bm1PUG1tTWZCMWJCVnkrZ09xb0JyZjM1SjRIRjZUY2c1ZkM0Nyt2VmNmTVE5VFB4eUpuUFFFV2Q2UTNPVy9vc3pzeHY5WG03Wk01RWRLTEF0cC94dEdtY01ZcldNS3ZnT01PRGY1YUhCNTBSWmVvTEJyakZmTEp4TEx5Y2ozVTVUYWROc2RPV3hRN1F5TVJ0SmRWcStkWG42NGlHM1krS25PME5kTHJKcGMzNW9QVEEwTWpZTVdNZitGMVFCQi9pZVFxOTVUUEZhRWpUc0JpbXBkVUcra2ZPRFErdnBrY1ZPSTFZL01lZTc1RlNYc1BUV1RiRTlrTEljMnBpWjNzaGsxbkpNcURFbDhTZGNYdFFia1RzMUxnWUlWRHN3aFNyUUNXa1kxOWtJY2xLUjlYNzFJeVVsT0lrbDlRQUhSSTJVcE5sbE01a01laUJyUkpuNjBBa0kraysrNkYzcUhtSGEvQTVYcEhkSmJ1ZC9PVWsxSnVjVmo4OGFpRXd0UEpmYkd2ZUlvc2NqaXBIRWdCaVNuTHlscmYrZXE3dTlMMnhzRHZ2YUVxMUdheTdXTnhtMnJEVUZiRDNqUVhPTG5iR21oNlRwT0xvYmpZaVJjRGdTVlV0Qko5ZHFNRGljYm8vR0IwRldNd2pmcWYvcldHbzNXTFF1RkVWblM1VDdjR0o2ck9UeHU4TU9mT2RuSjV5eHRVWDFJOFNud2s1Ty9RVlVxNkFBd0tmNEhoWTBmNEVDSHQ2czFhNldrUlhmZ1JaZEo1bVc2TDBRL1hFaVhhSWJHeWlUMVJLeW5EeU15YzRubkJXaE13M1VMaVpVcVdQaXBQL0R0R2syK2d0N29OQjJ4dHZ4RktaYUhuU2ZXdlpOWTkwRjhRa1hrRDF6THBjN2w4bWN6ZVhPWmpyaThZNTRSMGM5eS8wYnN6TVgreThWQnJJVFdxUTFXTm5xS0xhakNqRGdCZUFlbzlPdEZrU09aYlRhSktEdGx1eW0yZWdaRTU5ZDdWdE8rZnRjRFpOQ2FpNFd0WVZ2NFo5MHVjZzNMeHpiekxRNUo3K0Rndm1KMXpzK3RCNm8rNEcralNwZ2ZaSjdmV3JWbUxkTkNLemI3R2gydHJyN2JXajdlS0tyb2VFMW96R1NVQjhDQXJaYVJ1K2dDb2k2NW85bm9GQ2JnWHZGdEFub3hhek5kSy9yQldFd2tQSHhYay9jNVUySFh6eldjOXczNkVxNmVub0VmMzlrMVNMNEZweHRIRVBiR2JNbDJCTVpuaE1kOHphNzZIQWVhQ0k5OGFIRldvN29haG1keFJ2QTZXckxNcEVWUmRJWDFlUEJBUXVUdVFuNmxVdVhpTWZpTkhPTVlubHA3dTRaMDVVckYvNFFEWm1NYXlaTHJWWmZ0WXorZzdiQnRpODNkSDFjL0hsNnJPVDF1d1Y3YWJQSjRCdTNyQzJpcFBwQWpyZzhhRlJ0SFE2MUE5TDJINnFpYldnR2tBd1NWOTlaaW1TNCtlTnJBMmJHYkd4a3pObXI3NlB0ejBNRlVTeUVQbGRiOWQ3MmFoazl3RzlBWkw5K1JONE56ZTcwZmZ5QStFZmhETWw1OHVIT2J2ZjQ4TnhBV0FnbzN2SDJsZDZWeTRxa2pHVFhMSW53b2pzb0J0MFIrMnFud0llOHJtZUYyTW5acnJ6ZDJGbzRsSjZOMVhoejFUSjZpRjhGMzc3ZW12VWl3N09FMmt2d3Y0K3NDNE9lWExpcnQ3dmRIZklNV3RIcVowMjhvSnpzenI1a1NZWVdYYUZFMThIRUFXc1VaYmN1dFVTUDUvS25rM3FQNXVvcGxNSy9Cd01BeDBpRzVydW43cjVyZUw3eWx2WXRBRXZvN3pnRlRRQ0tUR1JKcmhuNHB4czMxbS9jV0xxMWV1dlc2cTE2UnVGanRLM1YwTjRMMlJMYVZsc0JWVC9BUFRDTDcybjNhWDFiMVZRS3hlT2hVRHlPZTZLRVJLT0VST0YvQUFBQS8vOERBTHloQ3FVQUFRQUFBQUlMaFlCTE1HVmZEenoxQUFFRDZBQUFBQURZWGFDRUFBQUFBTjFtTHpiK04vN0VDRzBEOFFBQkFBTUFBZ0FBQUFBQUFBQUJBQUFEMlA3dkFBQUltUDQzL2pjSWJRQUJBQUFBQUFBQUFBQUFBQUFBQUFBQUlnS3lBRkFBeUFBQUFsMEFUUUpHQUM0Q0pBQk5BbVlBVFFJR0FFMEMrZ0JOQWxRQVRRSXNBQ01DTEFBWkFoMEFKQUlQQUNvQjB3QWtBajBBSndJR0FDUUNGZ0FpQWpzQVFRRVVBRGNCSGdCQkFqd0FRUUlyQUNRQ1BRQkJBWTRBUVFHN0FCVUJmd0FSQWpnQVBBSUxBQXdDRUFBV0FoQUFGd0ZUQUEwQ0VBQWlBUlFBUVFBQS82MEFBQUFzQUN3QVlBQ01BS0lBdkFETUFQNEJJQUZnQVhJQmlBSEFBZXdDSGdKU0Fyb0MzQUxvQXdRREpnTlNBNElEb2dQZUJBUUVKZ1JDQklBRXNnVEFCTlFFNEFUMkFBQUFBUUFBQUNJQWtBQU1BR01BQndBQkFBQUFBQUFBQUFBQUFBQUFBQVFBQTNpY25KVFBiaHRsRk1WL1RtelRDc0VDUlZXNmliNEZpeUsxWTFNbFZkdXNKcVJXUmtSeDhMZ2dKSVEwdGllMjVmSE15RE4yR3A2QU5XL0JXM1RGUS9BY2lEVzYxOWV1WFJBRks0cDFadWIrT2QrNTUzN0FBWCt5VDZWNkgvaXRuaHF1Y0ZTL05yekh2ZnFGNFgxYTlUM0RWUjdWZmpkY1kxQmJHSzd6ZWExaitDUGVWbjh4ZkkvajZvK0c3M05ZYlJuK21LZlZBOE9mN0R2K01Qd3B4N3hkNGdvODUyZkRGUTdKRGU5eHdBK0c5M21BMWF4VWVVRFRjSTNQT0RKYzV3am9NcVlrWVV6S0VNY05ZNGJNbVJGVEVCSXpZOHdOTVFNY0FUNEpwYjVOaVJRNWh2LzROaUtrWkVha0ZVZVVPQkpDRWlJS1JsYnhKODNLdU5hTzBtZW1TTHI1bEl5STZHbkdoSWdVUjhhUWpKU1lpZFlwS2NsNVNZTUdCWDNsbTFOUzRGRXdKc0VqWThhUUJtMWFYTkpseEpnQ1Iwc3JDYk9RakJ0S2JvbTB2N01JVWFaUFRFcGhyT2FrREpTblUzNnhaZ2RjNG1pVGEreG01Y3V0Q285eGZLdlp3azFpSEYvaTZiL2JZTGJkZDhVbVlxRjZpb1k5RXVWNXF4TWNxZUxTMStjYnhTVXZjVHZwczgza3d4b05sSjNNZWt5UHVjNWY1aWQ1d2lURnVVTjhRblZRNkI3aU9OUG5nRkFWK1k2QUxoZTBlVTFYbjMwNmRQQzVva3ZBSzgxdDA4SHhGVzJ1T05lTVFQSHlXMHNkYzhYM09MNG0wQmlwSFpzK29yazh2U0UzZHd0M2NZYWNZMHF1V3lBemx2T0w4K09kSml3N2xHMjVvMUJYOUhXUEpGTDJRRlNSUFlzWW1pdHlkY1ZVdFZ4NW96RDlCdVlJK1ZycWJOOTlsMjFZMk82dHR2aU9USGZZTVRkT01ya2xvdzlOMVh2UE03ZjY1eEV4SUtPbkVYMHlwalFvdWRPelhSTXhKOEZ4cmo2KzBDMHA4ZGM1MHVkT1hSSXpWUVlCcWRhWmtldHZaTDRKalh0L3kvZk83aExadktudTZHUjlxbDI2U09WMFkwYXZWYjNWdDlCVWpqY20wTENwWnBZakU1Ykt5NU9LOXlYYTIrSWZxdnNMdmQweW5uQkdSc0xnYnpmQVV6eWFISFBDS1NQdElKVlRGblk3TlBXR2FQS0NVejM5aEZpajVMNThvenBKaFJNOG5uSENDUzk0OXA2T0t5Yk91TGcxbDgzZVB1ZWMwZWIwUDUxaUdkL21qRmZyZC8vZTlWZGwydFN6T0o2c241N3ZQTVZILzhPdFgvQjQ2NzdzNkMwZ203T3dhdSsyNG9xSXFYQnhoNXRhdUlkNGZ3RUFBUC8vQXdEMHQwOVJBQUFEQUFBQUFBQUEvODRBTWdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQSl9LmQyLTM3NjI2NjgxNzMgLnRleHQtaXRhbGlje2ZvbnQtZmFtaWx5OiZxdW90O2QyLTM3NjI2NjgxNzMtZm9udC1pdGFsaWMmcXVvdDt9QGZvbnQtZmFjZXtmb250LWZhbWlseTpkMi0zNzYyNjY4MTczLWZvbnQtaXRhbGljO3NyYzp1cmwoZGF0YTphcHBsaWNhdGlvbi9mb250LXdvZmY7YmFzZTY0LGQwOUdSZ0FCQUFBQUFBNUFBQW9BQUFBQUZmUUFBUmhSQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFCUFV5OHlBQUFBOUFBQUFHQUFBQUJnVzFTVmVHTnRZWEFBQUFGVUFBQUFyQUFBQU93RU9BVThaMng1WmdBQUFnQUFBQWVvQUFBS1hCOUkxQWRvWldGa0FBQUpxQUFBQURZQUFBQTJHN1VyMm1ob1pXRUFBQW5nQUFBQUpBQUFBQ1FMZUFqR2FHMTBlQUFBQ2dRQUFBQ0lBQUFBaUR4TkErVnNiMk5oQUFBS2pBQUFBRVlBQUFCR0x2Z3NlbTFoZUhBQUFBclVBQUFBSUFBQUFDQUFPZ0QyYm1GdFpRQUFDdlFBQUFNckFBQUlNZ250VnpOd2IzTjBBQUFPSUFBQUFDQUFBQUFnLzhZQU1nQURBZUVCa0FBRkFBQUNpZ0pZLy9FQVN3S0tBbGdBUkFGZUFESUJJd0FBQWdzRkF3TUVBd2tDQkNBQUFIY0FBQUFEQUFBQUFBQUFBQUJCUkVKUEFBRUFJUC8vQXU3L0JnQUFBOWdCRVNBQUFaTUFBQUFBQWVZQ2xBQUFBQ0FBQTNpY2hNMDdLOFZ4QUlmeHo5LzV1Ui8zKy8wTU5vTkIzZ0NkU2VvVWswMlMxRWt5ZUVjSWswV3k4RkxZbUN6MnJ6cVQ3ZlNzbjNwUXFhbFFWM3hnWFVOUk5Hell0R1hicnFaOUxZZU9IRHQxcnUzU2RjSS90YU5wVDh0QlI1MDQwM2JoS3NsbmZ2T1Q3M3psUFc5NXpVdWU4NVRIUE9RK2Q3bk5UZWZmdmNxYVZjdFc5S2dwZXZYcE4yRFFrR0YxSTBhTkdUZGgwcFJwTTJiTm1iZGcwUkovQUFBQS8vOERBS1piTDFsNG5IeFdiV3diWngzL1A4OWQ3cExXU2VPY1gybzNmbjNzcytPY25mZ2UyeGZIc1IzYlNaejRwVW02cHUyYU9GbXJwVzhySldxM1ViUjFZNjFVZGZzd1RGVStNRTB3OFNhbVNoU2xYNWlvTnFFaVZvWXE4YUdnb1UwSUJHU3dJZzJpcUl5cE9hT3ozU1NORUYvT0ovbnUvL3YvZnYvZi8vY2N0SUFIQUovQjE0Q0JOdGdGWFdBRW9JS0xZYWlpRURORGZUN0M4NHBQRUhqUFJYVG40aHRzN3ZCZi9XLzlSM0t3K1ZmZUx2N2pxZXY0MnZwcDlMWEt5eStyczFjV0Z3L2V2NjhHME8vdUF3QXdRQUN3RTFkQkQxYnRuZ3BVTmhrTkhNZnpwdm92WWFnY2kwWkVzbmxETHQxWU9OMmI4eUE2bG45eDcrRDgvT0hSd3V3elorZlBsQ2VleGRWQ1hocVJXbGxkWm1DaUlxSG44MHBRWHY5MHRDUW5OVHdFOGRvYUR1STN3UUhRNGhiRmFDU0ZxV3d5ODZKSTNCM1lhRENacUJ4VHpCeUgzTVVUc2Y3REYwb0QwN3RqUWt3Y1hNaDYzSVdFUCtja25vb3VkMzV2K2RwWDhrcWd4K2xMUG4xK0tGR0pPdmZJam1BZFErUFVpYXV3VStQajRsMDg1UW52NHNrbGRLcGQvWFBnWHgyZlVTUjI0R3JtdDlrSDJlYnpCM0VWZE5yemxLR0k4Z0poZUo1YzJwdGgwTVNoQjkrY2Z1blZJSzZxdDlESVEvVTBPbnI1NDBjNDZDcXVRa3ZqUFExaDcvUEkwSTZyNjh1UDZ0N0NWYkRVL3hmTVZCRW9RNFJZVENFOFF4Z2Y0VGllSVpjcWNSTTdkcnR5cVZocXMrcll5WjlMU1JQTGRiUVdjRlg5OXBVcjZPajZFam9ybmVxOXFuNGZ6VjJWVGtycTY0QTFiQnlzY3pSc21Sb2hqTEE1cG5mbXpoWmUyWDh5a2xsWVBGVWFYOFRWd29HcDQySDFjNVNmbW96VHhqeDB0VFdrNGpjaEFHQjJpejZscm44MEl2cDgybkJpc1kzaGNKelJZREtiRzY3NEpMZmtqOXRtbEtIcG9MY1VTRVRuRW9tbkhOUXlGdkpHYldGUHFTK1NPS1liSE96dGxVY0dQTElwWkoxUTVIMXl4Qit5OXpqNjk0aDlwbUIzWGhtY2pRQ0NDZ0NPNGlyd0dndWl1SGpDL1BDNWQ5dlJyOXZmZXc2WGM3bjFtL1UrYXpVQWJNTlZhQU1nQ25JcExoNjVlTFFEdmEzZTYwQ3Y3bEFQbytLdVB1ek1oTmIvbUFYQTRLdXRvYy9SS2hnMHBjenVEYU5SaFRKRUlSem5rMk9Lc3VHNm04TWxxVEJQZlVrOUs2U09wRnRaY3FoTG5QUklScm5iazRzNndyclptYkd2emxHL0s2bGF4NzE5dzZHKzM0dnV3RVJGVGpkOTdhMnRvV1cwQ3QyUG9XMHExM1QxaDVOUFMrVWpVV25JRkJSRVcvK0JXSHpRR1RPNXJXWGRzY3JJdVprK3Q2WGZiQnhaeW1YSHJIclo0TlZxMTdsZ0g3NERSdkE4VnAwcS81L01ZQmZUS1phclRUWjd2ZHZaK0p3TDc2NFBiS2VENjF6ZVE2dGdCZTlXUEczeXZJdmIyRkNHeGpTbmFRei9jdUJrc0RqWHIyVHN1aGIxRjIzT1hNQVdOOXR0MDkrcVlhYXJoMFRuZGFlT2pDN3RrMEpUY2pmdFNFOTVMWHBxZENEdnp0M3QzV0hIREdCQU5ROWFSYXZnZ05CV0p5b0t4NUd0akNuRGNjeGpiSytIRHhCUDk2Zy9WZWl3aVB2N2tsTzlFM05oTWFWbmhQUXg0VnljVEx0N1RlRnVrcUgydm85Rlc5VHNMZzJmRUtVRE03bG5uNVMxZVRJTHg1Q3JOL0FiMGQwemRxZy9rV2pNMHdHQVBzUjNtcnZMODdTK0NrWURYMS9nYUlTNE9aNXh2Rjd1NzJSNzlrbXBhR3VxTk1TeTQ5M2pvVkY4NTM2UzlHVUdIQjcxQXlRWmRyY1hBeUgxUjdXYWxubndCVjdHSWpnQmdBUFhlQU5McXEzQkYvZ09kR25Nb3hFdEpiUnRhOHI4cFF6M1F2a0NRbnFHNDlFT2t5NnR0K0JuMXIvQnR6RmRDQ2RZZGt1L2FCVjJOL3I5MyswZVNmTnN6NzdRWTkyaWxRbFBlSHV6Rzc1REg2RlYyQVcyclQ0d0dqcXdUOWFxUGpMM3ZjbDVxVEF2VHk1SXhmbEFjSnJHWk8yaU96RTdlbTRtMUxnT1o1ZEdzdm5jMGtoMlRLdGRlMUNqNko5b3RlRnBma3ZISFppNFJlMUVFK1FVYmtCb1o5R08xOUljNDUwSjFmZFVGb2NFM09YNGdTY1h0ZmYzdUtkSnlFRHY0cHZEam1EVDJJNFQzMEVvTUZHaHFXUkEvSnZYdGFuUmkyZ1ZPcmRvWk9iRlI5cnNaRzJsb01XNHA5UHFLVG1TYUtVaUpkdEdXdE1KOVM2ZzJzUGFHcnFBVnNHM1BTZTN4NlNXa28yUS9GNjRZdWszRDR1QlpNOUFLQzVOU0tGQ2QwaWdMakVjYzZZaS9mdDBFYi9vOEllSTFlZXdwbnA2TTE2UDNXK3dCaDEyc2NzOUpBVkh2RnJQUTdVMWRBaWYzc2lWbUNLUU5LYmFrY1pzeVpWM2hpTXNpdWQzbGp5WlBTL29Mc1NaYm5lSGRhZStzMCtYRHU2eXRxT3VlTXZseXluMTA2NHV1MzFIaThMdjBtb1AxTmJRWjJnRkxKdTFONTBuTktQbGVqTEdzcWx5a21YSGJYbHB0S1NGbzMrL0xxdm9IUUtLcWZjRWkyWVpkRWkxRmtqelRFa0FvRCtoRldnSG9Bd1ZUQ1l6aldrRjBjVjh5Y055TEt2M0NGOHZxK3RvUmYyRUZJbG53b01zcXJYK2J1M2Z0VFgwSy93YStMZnBUSlFOeC9HK2hyYzUzdGdRK21lWlJUczFGOElqQi9jdjZpWm5mVEsxNVd5K0p5cFRCNHVGYUNKNVVwY0ordDJSWXB4bUIzdVM5a0NzMjB6VFU5bmtuSkhWajh2Sko4T2FGbEJiUXgvaGw4QzVGWGNEVUhEeGhHOGFsT051WmVadHNpa3pFQmlYMGhHSDVIUk5vZDcydjBmMEFjdjRRdTZNTGgzc2NVVUNaWm9hNnRSYlVUQjdxMVUzODBUcHk5cEJnV28vclQyRnZvdC9DUXdBanlnYVI4c0Rhdmt0NXRqRE4rcjhvUitPb3c5d1FQdDJVYUlrU3FQVVNJM0UrSWNmM3hpNjhaUGo3OGR2MzQ2LzMvUXkzRVVyV2gzdDI4TnhwSHdVcmRSRlJKREhSVmpHeTFvTlFjdk9adC9uQlRzeEcyd0VGODBtaTJ1M3llTDhMd0FBQVAvL0F3QTYrQ1BGQUFFQUFBQUJHRkZ2TGRoVFh3ODg5UUFCQStnQUFBQUEyRjJnekFBQUFBRGRaaTgzL3IzKzNRZ2RBOGtBQWdBREFBSUFBQUFBQUFBQUFRQUFBOWorN3dBQUNFRCt2ZjI4Q0IwRDZBREMvOUVBQUFBQUFBQUFBQUFBQUNJQ2RBQWtBTWdBQUFKSEFDTUNKZ0E1QWZjQUl3SXZBQ01CemdBakFzRUFJd0ltQUNNQitnQU1BZjRBWFFJQS8vOENHUUFuQWJNQUpRSVhBQ2NCNFFBbEFoTUFBUUlMQUI4QTdRQWZBUGdBTEFJTkFCOENBd0FuQWhmLzlnRldBQjhCa3YvOEFVVUFQQUlRQURnQndBQTdBZUQvOXdIZ0FBQUJWUCs0QWVBQU1BRHRBQjhBQUFCSEFBQUFMZ0F1QUdZQW1BQ3dBTXdBM0FFS0FTNEJiZ0dDQVpvQjBnSUFBamdDY2dLNkF1UUM4QU1TQXp3RGFnT2tBOElEL2dRc0JGZ0VkZ1N5Qk9ZRTlnVUtCUmdGTGdBQUFBRUFBQUFpQUl3QURBQm1BQWNBQVFBQUFBQUFBQUFBQUFBQUFBQUVBQU40bkp5VTNXNGFWeFNGUDJLZ1RmOHVLaXR5YnF4em1Vck80RVp4bE1SWDR6cFdSa1dRTXFRL1VsVnBnREVnWUdiRUREak9FL1M2YjlHM3lGVWZvMDlSOWJyYW13MWhJcXRXVUJSckRXZi9yTFAyMmdmWTUxLzJxRlR2QW4vVmw0WXJITlovTm55SEwrcE53M3VjMVQ4elhPV285cmZoR29QYVc4TjFIdFE2aGovaFhmVVB3NS95dVBxYjRic2NWQzhNZjg2ajZyN2hML2NjL3hqK2lzZThXK0VLUE9WM3d4VU95QXpmWVo5ZkRlOXhENnRacVhLUFk4TTF2dWJRY0oxRG9NdVlnaWxqRW9ZNExoa3paTUdjbUp5UW1EbGpMb2taNEFqd21WTG9yd21SSXNmd3hsOGpRZ3JtUkZweFJJRmpTc2lVaUp5UlZYeXJXU212dEtQMG1TdVNiajRGSXlKNm1qRWhJc0dSTWlRbElXYWlkUW9LTXA3VG9FRk9YL2xtRk9SNDVJeVo0cEV5WjBpRE5oYzA2VEppVEk3alFpc0pzNUNVU3dxdWlMUy9zd2hScGs5TVFtNnNGaVFNbEtkVGZyRm1CelJ4dE1rMGRydHlzMVRoQ01lUG1pM2NKTWJ4TFo3K2Qxdk15bjNYYkNLV3FxZG8yR09xUEs5MGdpTlZYUHI2L0tDNDREbHVKMzNLVEc3WGFLRHNaTlpqZWl4MC9qSS95Uk1tQ2M0ZDRCT3FnMEozSDhlWmZnZUVxc2hQQkhSNVNadlhkUFhicDBNSG54WmRBbDVvYnBzT2p1OW8wK0pjTXdMRnE3TUxkVXlMWDNCOFQ2QXhVanMyZlVSeitYcERadTRXN3VJTXVjZU1UTGRBWml6M0YrZkhPMDFZZGlndHVTTlhWL1IxanlSUzlrQlVrVDJMR0pvck1uWEZUTFZjZXlNMy9RYm1DRGt0ZExidnoyVWJsclo3NnkyK0p0VWRkaXlNazB4dXhlaTJxWG9mZU9aSy8zbEVERWpwYVVTZmxCa05DcTcxYnErSVdEREZjYTQrZnFsYlV1QnZjcVRQdGJva1pxWU1BaEt0TXlmVHY1SDVKalR1L1pMdm5iMGxzbmt6M2RISjVsYTdkSkhLeWRhTVhxdDY2N1BRVkk2M0p0Q3dxYWFXSXhPV3lxdWJpdmNsMml2eEQ5WDl1YjV1S1E4SnRLNU1zbi9qSzNETU0wNDRaYVJkcEhyQ2NuTW1yNFJFbktvQ0UyS05ramZ6aldyMUNJOFRQSjV3d2duUGVQS0JsbXMyenZpNEVwL3Qvajdubk5IbTlOYmJyR0xiblBHaVZPMy9PLytwYkkvMVBvNkhtNituTzAvendVZTQ5aHVPU3U5bVIxOEQyYUNsVlh1L0hTMGlac0xGSFd4cjRlN2ovUWNBQVAvL0F3QnlvVkZBQUFBREFBRC85UUFBLzg0QU1nQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUEpfS5jb25uZWN0aW9uLC5zaGFwZXtzdHJva2UtbGluZWpvaW46cm91bmR9LnNoYXBle3NoYXBlLXJlbmRlcmluZzpnZW9tZXRyaWNQcmVjaXNpb259LmNvbm5lY3Rpb257c3Ryb2tlLWxpbmVjYXA6cm91bmR9LmQyLTM3NjI2NjgxNzMgLmZpbGwtTjF7ZmlsbDojMGEwZjI1fS5kMi0zNzYyNjY4MTczIC5maWxsLU4ye2ZpbGw6IzY3NmM3ZX0uZDItMzc2MjY2ODE3MyAuc3Ryb2tlLUIxe3N0cm9rZTojMGQzMmIyfTwvc3R5bGU+PGcgY2xhc3M9ImMzSmogYXJ0aWZhY3QiPjxwYXRoIGZpbGw9IiNmZmY4ZTYiIHN0cm9rZT0iI2M5YTIyNyIgZD0iTTAgMTQ5Vjg0aDE3N3Y2NWMtMjktMTQtNTktMTQtODggMC0zMCAxNS01OSAxNS04OSAwWiIgY2xhc3M9InNoYXBlIiBzdHlsZT0ic3Ryb2tlLXdpZHRoOjIiLz48dGV4dCB4PSI4OC41IiB5PSIxMTcuNjExIiBmaWxsPSIjMGEwZjI1IiBjbGFzcz0idGV4dC1ib2xkIGZpbGwtTjEiIHN0eWxlPSJ0ZXh0LWFuY2hvcjptaWRkbGU7Zm9udC1zaXplOjE2cHgiPua6kOS7o+eggSAvIOS6jOi\u002Fm+WItjwvdGV4dD48L2c+PGcgY2xhc3M9ImMzbHQgc3RlcCI+PHBhdGggZmlsbD0iI2VlZjRmZiIgc3Ryb2tlPSIjNGE2ZmE1IiBkPSJNMjk0IDgxaDE3NnY4MkgyOTR6IiBjbGFzcz0ic2hhcGUiIHN0eWxlPSJzdHJva2Utd2lkdGg6MiIvPjx0ZXh0IHg9IjM4MiIgeT0iMTE5LjUiIGZpbGw9IiMwYTBmMjUiIGNsYXNzPSJ0ZXh0LWJvbGQgZmlsbC1OMSIgc3R5bGU9InRleHQtYW5jaG9yOm1pZGRsZTtmb250LXNpemU6MTZweCI+PHRzcGFuIHg9IjM4MiIgZHk9IjAiPuespuWPt+aJp+ihjOW8leaTjjwvdHNwYW4+PHRzcGFuIHg9IjM4MiIgZHk9IjE4LjUiPktMRUUgLyBhbmdyIC8gQ0JNQzwvdHNwYW4+PC90ZXh0PjwvZz48ZyBjbGFzcz0iY0dGMGFBPT0gYXJ0aWZhY3QiPjxwYXRoIGZpbGw9IiNmZmY4ZTYiIHN0cm9rZT0iI2M5YTIyNyIgZD0iTTU4NyAxNTdWNzNoMTQ4djg0Yy0yNS0xOC00OS0xOC03NCAwLTI1IDE3LTQ5IDE3LTc0IDBaIiBjbGFzcz0ic2hhcGUiIHN0eWxlPSJzdHJva2Utd2lkdGg6MiIvPjx0ZXh0IHg9IjY2MSIgeT0iMTA2LjM3OCIgZmlsbD0iIzBhMGYyNSIgY2xhc3M9InRleHQtYm9sZCBmaWxsLU4xIiBzdHlsZT0idGV4dC1hbmNob3I6bWlkZGxlO2ZvbnQtc2l6ZToxNnB4Ij48dHNwYW4geD0iNjYxIiBkeT0iMCI+6Lev5b6E5p2h5Lu2PC90c3Bhbj48dHNwYW4geD0iNjYxIiBkeT0iMTguNSI+cGF0aCBjb25kaXRpb248L3RzcGFuPjwvdGV4dD48L2c+PGcgY2xhc3M9ImMyMTAgc3RlcCI+PHBhdGggZmlsbD0iI2VlZjRmZiIgc3Ryb2tlPSIjNGE2ZmE1IiBkPSJNODUyIDgxaDE4OHY4Mkg4NTJ6IiBjbGFzcz0ic2hhcGUiIHN0eWxlPSJzdHJva2Utd2lkdGg6MiIvPjx0ZXh0IHg9Ijk0NiIgeT0iMTE5LjUiIGZpbGw9IiMwYTBmMjUiIGNsYXNzPSJ0ZXh0LWJvbGQgZmlsbC1OMSIgc3R5bGU9InRleHQtYW5jaG9yOm1pZGRsZTtmb250LXNpemU6MTZweCI+PHRzcGFuIHg9Ijk0NiIgZHk9IjAiPlNNVCDmsYLop6Plmag8L3RzcGFuPjx0c3BhbiB4PSI5NDYiIGR5PSIxOC41Ij5aMyAvIGN2YzUgLyBCb29sZWN0b3I8L3RzcGFuPjwvdGV4dD48L2c+PGcgY2xhc3M9ImMyRjAgcmVzdWx0Ij48ZyBjbGFzcz0ic2hhcGUiPjxlbGxpcHNlIGN4PSIxMzc4LjUiIGN5PSIxOTUiIGZpbGw9IiNlYWY3ZWUiIHN0cm9rZT0iIzRhOWQ2YiIgY2xhc3M9InNoYXBlIiByeD0iMTE1LjUiIHJ5PSIzOSIgc3R5bGU9InN0cm9rZS13aWR0aDoyIi8+PC9nPjx0ZXh0IHg9IjEzNzguNSIgeT0iMTkyLjUiIGZpbGw9IiMwYTBmMjUiIGNsYXNzPSJ0ZXh0LWJvbGQgZmlsbC1OMSIgc3R5bGU9InRleHQtYW5jaG9yOm1pZGRsZTtmb250LXNpemU6MTZweCI+PHRzcGFuIHg9IjEzNzguNSIgZHk9IjAiPnNhdDwvdHNwYW4+PHRzcGFuIHg9IjEzNzguNSIgZHk9IjE4LjUiPueUn+aIkOinpuWPkei+k+WFpTwvdHNwYW4+PC90ZXh0PjwvZz48ZyBjbGFzcz0iZFc1ellYUT0gZmFpbCI+PGcgY2xhc3M9InNoYXBlIj48ZWxsaXBzZSBjeD0iMTM3OC41IiBjeT0iNDgiIGZpbGw9IiNmZGVjZWMiIHN0cm9rZT0iI2MwNTA0ZCIgY2xhc3M9InNoYXBlIiByeD0iMTQ0LjUiIHJ5PSI0OCIgc3R5bGU9InN0cm9rZS13aWR0aDoyIi8+PC9nPjx0ZXh0IHg9IjEzNzguNSIgeT0iNDUuNSIgZmlsbD0iIzBhMGYyNSIgY2xhc3M9InRleHQtYm9sZCBmaWxsLU4xIiBzdHlsZT0idGV4dC1hbmNob3I6bWlkZGxlO2ZvbnQtc2l6ZToxNnB4Ij48dHNwYW4geD0iMTM3OC41IiBkeT0iMCI+dW5zYXQ8L3RzcGFuPjx0c3BhbiB4PSIxMzc4LjUiIGR5PSIxOC41Ij7ot6\u002FlvoTkuI3lj6\u002Fovr7vvIzliarmnp08L3RzcGFuPjwvdGV4dD48L2c+PGcgY2xhc3M9ImNtVndjbTg9IHN0ZXAiPjxwYXRoIGZpbGw9IiNlZWY0ZmYiIHN0cm9rZT0iIzRhNmZhNSIgZD0iTTE2NDAgMTU0aDEyNHY4MmgtMTI0eiIgY2xhc3M9InNoYXBlIiBzdHlsZT0ic3Ryb2tlLXdpZHRoOjIiLz48dGV4dCB4PSIxNzAyIiB5PSIxOTIuNSIgZmlsbD0iIzBhMGYyNSIgY2xhc3M9InRleHQtYm9sZCBmaWxsLU4xIiBzdHlsZT0idGV4dC1hbmNob3I6bWlkZGxlO2ZvbnQtc2l6ZToxNnB4Ij48dHNwYW4geD0iMTcwMiIgZHk9IjAiPui+k+WFpeWbnuaUvjwvdHNwYW4+PHRzcGFuIHg9IjE3MDIiIGR5PSIxOC41Ij7noa7orqTltKnmuoM8L3RzcGFuPjwvdGV4dD48L2c+PGcgY2xhc3M9ImNtVndiM0owIHJlc3VsdCI+PGcgY2xhc3M9InNoYXBlIj48ZWxsaXBzZSBjeD0iMTk2NiIgY3k9IjE5NS41IiBmaWxsPSIjZWFmN2VlIiBzdHJva2U9IiM0YTlkNmIiIGNsYXNzPSJzaGFwZSIgcng9Ijg1IiByeT0iNDIuNSIgc3R5bGU9InN0cm9rZS13aWR0aDoyIi8+PC9nPjx0ZXh0IHg9IjE5NjYiIHk9IjE5MyIgZmlsbD0iIzBhMGYyNSIgY2xhc3M9InRleHQtYm9sZCBmaWxsLU4xIiBzdHlsZT0idGV4dC1hbmNob3I6bWlkZGxlO2ZvbnQtc2l6ZToxNnB4Ij48dHNwYW4geD0iMTk2NiIgZHk9IjAiPua8j+a0nuaKpeWRijwvdHNwYW4+PHRzcGFuIHg9IjE5NjYiIGR5PSIxOC41Ij4rIFBvQzwvdHNwYW4+PC90ZXh0PjwvZz48ZyBjbGFzcz0iS0hOeVl5QXRKbWQwT3lCemVXMHBXekJkIj48bWFya2VyIGlkPSJtay1kMi0zNzYyNjY4MTczLTM0ODgzNzgxMzQiIG1hcmtlckhlaWdodD0iMTIiIG1hcmtlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgbWFya2VyV2lkdGg9IjEwIiBvcmllbnQ9ImF1dG8iIHJlZlg9IjciIHJlZlk9IjYiIHZpZXdCb3g9IjAgMCAxMCAxMiI+PHBhdGggc3Ryb2tlLXdpZHRoPSIyIiBkPSJtMCAwIDEwIDYtMTAgNnoiIGNsYXNzPSJjb25uZWN0aW9uIiBzdHlsZT0iZmlsbDojMGQzMmIyIi8+PC9tYXJrZXI+PHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMGQzMmIyIiBtYXJrZXItZW5kPSJ1cmwoI21rLWQyLTM3NjI2NjgxNzMtMzQ4ODM3ODEzNCkiIGQ9Ik0xNzkgMTIxLjk4M2M0NC44LS4zODMgNjguMy0uNDgzIDExMS41LS40ODMiIGNsYXNzPSJjb25uZWN0aW9uIHN0cm9rZS1CMSIgbWFzaz0idXJsKCNkMi0zNzYyNjY4MTczKSIgc3R5bGU9InN0cm9rZS13aWR0aDoyIi8+PC9nPjxnIGNsYXNzPSJLSE41YlNBdEptZDBPeUJ3WVhSb0tWc3dYUT09Ij48cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwZDMyYjIiIG1hcmtlci1lbmQ9InVybCgjbWstZDItMzc2MjY2ODE3My0zNDg4Mzc4MTM0KSIgZD0iTTQ3MS41IDEyMS41YzQ1LjIgMCA2OC43LS4xIDExMS41LS40NjYiIGNsYXNzPSJjb25uZWN0aW9uIHN0cm9rZS1CMSIgbWFzaz0idXJsKCNkMi0zNzYyNjY4MTczKSIgc3R5bGU9InN0cm9rZS13aWR0aDoyIi8+PC9nPjxnIGNsYXNzPSJLSEJoZEdnZ0xTWm5kRHNnYzIxMEtWc3dYUT09Ij48cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwZDMyYjIiIG1hcmtlci1lbmQ9InVybCgjbWstZDItMzc2MjY2ODE3My0zNDg4Mzc4MTM0KSIgZD0iTTczNyAxMjEuMDE3YzQ0LjguMzgzIDY4LjMuNDgzIDExMS41LjQ4MyIgY2xhc3M9ImNvbm5lY3Rpb24gc3Ryb2tlLUIxIiBtYXNrPSJ1cmwoI2QyLTM3NjI2NjgxNzMpIiBzdHlsZT0ic3Ryb2tlLXdpZHRoOjIiLz48L2c+PGcgY2xhc3M9IktITnRkQ0F0Sm1kME95QnpZWFFwV3pCZCI+PHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMGQzMmIyIiBtYXJrZXItZW5kPSJ1cmwoI21rLWQyLTM3NjI2NjgxNzMtMzQ4ODM3ODEzNCkiIGQ9Ik0xMDQxLjg2OSAxNTguNzEzQzExMTcuNiAxODcuNiAxMTYyLjIgMTk1IDEyNTkgMTk1IiBjbGFzcz0iY29ubmVjdGlvbiBzdHJva2UtQjEiIG1hc2s9InVybCgjZDItMzc2MjY2ODE3MykiIHN0eWxlPSJzdHJva2Utd2lkdGg6MiIvPjx0ZXh0IHg9IjExNDkiIHk9IjE5OCIgZmlsbD0iIzY3NmM3ZSIgY2xhc3M9InRleHQtaXRhbGljIGZpbGwtTjIiIHN0eWxlPSJ0ZXh0LWFuY2hvcjptaWRkbGU7Zm9udC1zaXplOjE2cHgiPuWPr+a7oei2szwvdGV4dD48L2c+PGcgY2xhc3M9IktITnRkQ0F0Sm1kME95QjFibk5oZENsYk1GMD0iPjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzBkMzJiMiIgbWFya2VyLWVuZD0idXJsKCNtay1kMi0zNzYyNjY4MTczLTM0ODgzNzgxMzQpIiBkPSJNMTA0MS44NjkgODQuMjg3QzExMTcuNiA1NS40IDExNTYuNCA0OCAxMjMwIDQ4IiBjbGFzcz0iY29ubmVjdGlvbiBzdHJva2UtQjEiIG1hc2s9InVybCgjZDItMzc2MjY2ODE3MykiIHN0eWxlPSJzdHJva2Utd2lkdGg6MiIvPjx0ZXh0IHg9IjExMzQuNSIgeT0iNTgiIGZpbGw9IiM2NzZjN2UiIGNsYXNzPSJ0ZXh0LWl0YWxpYyBmaWxsLU4yIiBzdHlsZT0idGV4dC1hbmNob3I6bWlkZGxlO2ZvbnQtc2l6ZToxNnB4Ij7kuI3lj6\u002Fmu6HotrM8L3RleHQ+PC9nPjxnIGNsYXNzPSJLSE5oZENBdEptZDBPeUJ5WlhCeWJ5bGJNRjA9Ij48cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwZDMyYjIiIG1hcmtlci1lbmQ9InVybCgjbWstZDItMzc2MjY2ODE3My0zNDg4Mzc4MTM0KSIgZD0iTTE0OTYgMTk1aDE0MC41IiBjbGFzcz0iY29ubmVjdGlvbiBzdHJva2UtQjEiIG1hc2s9InVybCgjZDItMzc2MjY2ODE3MykiIHN0eWxlPSJzdHJva2Utd2lkdGg6MiIvPjwvZz48ZyBjbGFzcz0iS0hKbGNISnZJQzBtWjNRN0lISmxjRzl5ZENsYk1GMD0iPjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzBkMzJiMiIgbWFya2VyLWVuZD0idXJsKCNtay1kMi0zNzYyNjY4MTczLTM0ODgzNzgxMzQpIiBkPSJNMTc2NS41IDE5NUgxODc3IiBjbGFzcz0iY29ubmVjdGlvbiBzdHJva2UtQjEiIG1hc2s9InVybCgjZDItMzc2MjY2ODE3MykiIHN0eWxlPSJzdHJva2Utd2lkdGg6MiIvPjwvZz48bWFzayBpZD0iZDItMzc2MjY2ODE3MyIgd2lkdGg9IjIwNTMiIGhlaWdodD0iMjQwIiB4PSItMSIgeT0iLTEiIG1hc2tVbml0cz0idXNlclNwYWNlT25Vc2UiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0tMS0xaDIwNTN2MjQwSC0xeiIvPjxwYXRoIGQ9Ik0xMTE4IDE4Mmg2MnYyMWgtNjJ6TTEwOTQgNDJoODF2MjFoLTgxeiIvPjwvbWFzaz48L3N2Zz48L3N2Zz4=",[11,19774,19775,19776],{},"整个系统里，SMT 只负责中间那个方框。前面「怎么把程序变成公式」是符号执行引擎的事，后面「怎么确认漏洞」是测试和人工的事。",[183,19777,19778],{},"公式建得对不对，直接决定 SMT 的结论有没有意义。",[11,19780,19781,19782,19785],{},"所以，SMT 在漏洞检测里的正确定位是：",[183,19783,19784],{},"一个强大但需要被正确使用的判定引擎","。它能把「这条路径可不可能」回答得很准，但「该问哪些问题」「怎么把程序翻译成问题」，仍然依赖前端工具和工程师的判断。",[414,19787,19789],{"id":19788},"六小结","六、小结",[11,19791,19792,19793,19888,19889,19892],{},"回到开头那道小学题。SMT 的价值，不是把 ",[28,19794,19796,19822],{"className":19795,"translate":193},[197],[28,19797,19799],{"className":19798},[201],[203,19800,19801],{"xmlns":205},[208,19802,19803,19819],{},[211,19804,19805,19807,19809,19811,19813,19815,19817],{},[214,19806,176],{},[217,19808,130],{},[224,19810,3400],{},[217,19812,233],{},[214,19814,176],{},[217,19816,1383],{},[224,19818,251],{},[253,19820,19821],{"encoding":255},"x > 3 \\wedge x \u003C 5",[28,19823,19825,19843,19861,19879],{"className":19824,"ariaHidden":261},[260],[28,19826,19828,19831,19834,19837,19840],{"className":19827},[265],[28,19829],{"className":19830,"style":2616},[269],[28,19832,176],{"className":19833},[274,275],[28,19835],{"className":19836,"style":302},[279],[28,19838,130],{"className":19839},[306],[28,19841],{"className":19842,"style":302},[279],[28,19844,19846,19849,19852,19855,19858],{"className":19845},[265],[28,19847],{"className":19848,"style":316},[269],[28,19850,3400],{"className":19851},[274],[28,19853],{"className":19854,"style":280},[279],[28,19856,233],{"className":19857},[284],[28,19859],{"className":19860,"style":280},[279],[28,19862,19864,19867,19870,19873,19876],{"className":19863},[265],[28,19865],{"className":19866,"style":2616},[269],[28,19868,176],{"className":19869},[274,275],[28,19871],{"className":19872,"style":302},[279],[28,19874,1383],{"className":19875},[306],[28,19877],{"className":19878,"style":302},[279],[28,19880,19882,19885],{"className":19881},[265],[28,19883],{"className":19884,"style":316},[269],[28,19886,251],{"className":19887},[274]," 算得更快，而是让机器",[183,19890,19891],{},"在保留「整数」「数组」「位向量」这些概念的前提下","，仍然能自动地回答「有没有解」。",[11,19894,19895,19898,19899,19902],{},[183,19896,19897],{},"SMT = SAT + 背景理论。"," 布尔层负责组合，理论层负责语义，两者通过「原子真值」这一层接口通信。 ",[183,19900,19901],{},"它的核心取舍是用表达力换可判定性。"," 把主战场放在无量词的可判定片段，换来一个在片段内保证终止、且能处理工业规模混合约束的自动判定过程。",[19904,19905,19906],"style",{},"html pre.shiki code .snl16, html code.shiki .snl16{--shiki-default:#F97583}html pre.shiki code .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}html pre.shiki code .s95oV, html code.shiki .s95oV{--shiki-default:#E1E4E8}html pre.shiki code .s9osk, html code.shiki .s9osk{--shiki-default:#FFAB70}html pre.shiki code .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":23,"searchDepth":64,"depth":64,"links":19908},[19909,19914,19921,19928,19937,19945],{"id":416,"depth":64,"text":417,"children":19910},[19911,19912,19913],{"id":421,"depth":95,"text":422},{"id":853,"depth":95,"text":854},{"id":2926,"depth":95,"text":2927},{"id":3190,"depth":64,"text":3191,"children":19915},[19916,19917,19918,19919,19920],{"id":3194,"depth":95,"text":3195},{"id":4795,"depth":95,"text":4796},{"id":5586,"depth":95,"text":5587},{"id":6602,"depth":95,"text":6603},{"id":7277,"depth":95,"text":7278},{"id":7304,"depth":64,"text":7305,"children":19922},[19923,19924,19925,19926,19927],{"id":7308,"depth":95,"text":7309},{"id":7478,"depth":95,"text":7479},{"id":8527,"depth":95,"text":8528},{"id":9650,"depth":95,"text":9651},{"id":9745,"depth":95,"text":9746},{"id":9775,"depth":64,"text":9776,"children":19929},[19930,19931,19932,19933,19934,19935,19936],{"id":9779,"depth":95,"text":9780},{"id":9828,"depth":95,"text":9829},{"id":11169,"depth":95,"text":11170},{"id":11210,"depth":95,"text":11211},{"id":13910,"depth":95,"text":13911},{"id":14489,"depth":95,"text":14490},{"id":15718,"depth":95,"text":15719},{"id":15762,"depth":64,"text":15763,"children":19938},[19939,19940,19941,19942,19943,19944],{"id":15766,"depth":95,"text":15767},{"id":16313,"depth":95,"text":16314},{"id":17257,"depth":95,"text":17258},{"id":18359,"depth":95,"text":18360},{"id":18925,"depth":95,"text":18926},{"id":19761,"depth":95,"text":19762},{"id":19788,"depth":64,"text":19789},false,true,"md",null,{},"\u002Fblog\u002F2026\u002F0013-satisfiability-modulo-theories",{"title":6,"description":13},"blog\u002F2026\u002F0013-satisfiability-modulo-theories","很多实际问题用纯命题逻辑（SAT）表达时，要么根本无法表达。而用一般的一阶逻辑或高阶逻辑表达虽然自然，却无法自动高效求解。人们要么用专用算法解决特定问题（如线性规划、等价性检查），难以组合多种约束。SMT 把 SAT 的布尔搜索与多个理论求解器组合起来，使得混合理论约束可以被统一、自动地判定。",[19956],"logic","2026-10-29T09:03:03+08:00","tktAQX0_RZgjdZxL-V4k6t4ethwuxmjapt9meUdcoZ0",{"id":19960,"title":19961,"body":19962,"description":20138,"draft":19946,"enableCodeHighlight":19946,"enableCodeHightlight":19946,"enableComment":19947,"enableD2":19946,"enableKatex":19946,"extension":19948,"image":23,"important":19946,"location":19949,"meta":20139,"navigation":19947,"ogImage":19949,"path":20140,"seo":20141,"stem":20142,"summary":20143,"tags":20144,"time":20146,"__hash__":20147},"blog\u002Fblog\u002F2026\u002F0012-shu-xue-yu-hua-jia.md","数学与画家",{"type":8,"value":19963,"toc":20136},[19964,19975,20005,20008,20011,20014,20017,20020,20023,20026,20029,20032,20035,20038,20041,20044,20047,20050,20053,20056,20059,20062,20065,20068,20071,20074,20077,20080,20083,20086,20089,20092,20095,20098,20101,20104,20107,20110,20113,20116,20119,20122,20125,20128,20131],[11,19965,19966,19967,19974],{},"前段时间，OpenAI 声称，他们用内部尚未正式发布的模型产出了七百多篇论文，「AI 接替数学家」的叙事于是再一次被推到台前。市场是狂热还是炒作，我已经疲于争论。那七百篇论文是否名副其实，也先放在一边。真正让我想写点东西的，",[238,19968,19973],{"href":19969,"rel":19970,"target":19972},"https:\u002F\u002Fx.com\u002FNoe1017_Monad\u002Fstatus\u002F2112008540592410951",[19971],"nofollow","_blank","是 Twitter 上一条获得不少认同的帖子","。它把数学结构说成人类为了迁就自己那点脑容量而被迫发明的拐杖，把 AI 说成不需要几何直观、可以直接站在高维展开式里往下看的怪物。最后一句尤其漂亮：我们终于拿到了上帝账本里的答案，却发现上帝算账根本不用微积分，他老人家是直接拿计算器硬按出来的。",[15772,19976,19977],{},[11,19978,19979,19980,19983,19984,19986,19987,19989,19990,19992,19993,19995,19996,19998,19999,20001,20002,20004],{},"所谓优雅的数学结构，本质上是人类为了迁就自己那点可怜的脑容量，被迫发明出来的拐杖。  ",[19981,19982],"br",{},"\n一个顶尖人类数学家的工作内存，撑死也就同时追踪五六个变量的交互。  ",[19981,19985],{},"\n当你在算一个偏微分方程或者组合不等式时，一旦展开到三阶以上，几十个交叉项涌出来，人脑就直接宕机了。  ",[19981,19988],{},"\n所以人类数学家极其厌恶展开高阶项，一旦看到高阶项发散，人类的本能反应是此路不通，赶紧退回来找对称性、找不变量、搞同调代数或者几何直观，试图不展开式子就把问题绕过去。  ",[19981,19991],{},"\n但 AI 没有这个生理缺陷。  ",[19981,19994],{},"\n对于上万个并发的 Agent 来说，同时追踪一万个五阶交叉项的系数变化，跟我们算 1+1 一样轻松。  ",[19981,19997],{},"\n在它的视野里，根本不需要什么几何直观，它直接站在高维的代数展开式里往下看，人类觉得像乱麻一样的百项高阶余项，在它眼里就是一张明明白白的线性方程组。  ",[19981,20000],{},"\n既然把式子硬展开到第七阶，再凑几个待定系数就能让所有讨厌的发散项精准归零，它为什么要费劲去帮你发明一个人类能看懂的新概念？  ",[19981,20003],{},"\n这 700 个结果背后最无奈的黑色幽默：我们终于拿到了上帝账本里的答案，却发现上帝算账根本不用微积分，他老人家是直接拿计算器硬按出来的。",[11,20006,20007],{},"这套论证值得认真对待，恰恰因为它错得很有代表性：它把人类的工作记忆、数学的审美偏好、AI 的暴力计算串成了一条看似严密的因果链。但这条链中间有一个关键的偷换——它把「人类因为认知限制而偏爱结构」偷换成了「结构只是认知限制的产物」。前者是发生学上的事实，后者是一个关于数学本体的判断。两者之间隔着一整个哲学鸿沟。",[11,20009,20010],{},"画家这个比喻，也许比「拐杖」更接近真相。画家画不出世界上的每一个光子，所以他发明了透视、明暗和构图。但这些都长在真实的结构上：透视是射影几何，明暗是光的传播，构图是视觉心理。一个能逐像素渲染世界的渲染器，仍然跑在同一套射影几何上。暴力计算并没有绕开结构。它把结构执行到了人眼跟不上的规模。数学里的「硬展开」也一样。",[11,20012,20013],{},"它对人类工作记忆的描述大体成立，对数学的判断则基本错了。结构就是数学本身，拐杖之说站不住。AI 同样依赖结构，只不过那种结构人读不懂。问题在于「能不能翻译」，美丑反而次要。而翻译，恰恰是当前 AI 数学产出链条上最缺失的一环。",[11,20015,20016],{},"先承认其中合理的部分。人类的工作记忆确实窄得可怜。Miller 在 1956 年给出著名的 7±2，后来 Cowan 又把它修正到 4±1 左右。数字有争议，但「窄」这个结论没有被推翻。数学家偏爱对称性、不变量、同调，厌恶把式子硬展开，很大程度上确实是认知经济学的产物：找不变量，本质上是把高维信息压缩成一两个人类握得住的符号。AI 在大规模符号展开和并行系数追踪上的优势也是真实的。AlphaTensor 找矩阵乘法算法、各种组合搜索里那些看似暴力、实则依赖结构化搜索空间的路线，确实绕开了人类偏好的那条美学路径。",[11,20018,20019],{},"问题出在下一步。从「人类因为认知限制而偏爱结构」推到「结构只是认知限制的产物」，这是一个发生学谬误。一个东西因为什么被发明出来，并不等于它是什么。望远镜是因为人眼太弱才被造出来的，但这不意味着望远镜里的木星卫星是人类的幻觉。十进制是因为人有十根手指才流行的，但这也不意味着素数分布依赖于手指的数量。数学结构也一样：它可能是因为人脑太窄才被优先发现的，但一旦被发现，它说的就是对象本身的事，与人类脑容量无关。",[11,20021,20022],{},"把 Galois 群说成「人类算不动五次方程，所以编个借口说它不可解」，是一种误解。它本身是一个定理：一个方程能用根式解，当且仅当它的 Galois 群可解。五次一般方程对应的对称群 S5 不是可解群，所以没有根式解。这个结论与人类的工作记忆无关。就算人类有无限的工作记忆，S5 依然不是可解群，这个定理依然成立。同样，Noether 定理把连续对称性和守恒律绑在一起。把它说成「人类看不懂，所以画个对称性的图安慰自己」，也是一种误解。它说的是物理世界的一条结构事实：如果世界没有这种对称性，相应的守恒律就不存在。同调群也常被误解成「空间太复杂，人类算不动，所以发明一个符号糊弄过去」。它探测的是空间的洞，而它作为不变量能被计算，本身依赖链复形这一整套结构。",[11,20024,20025],{},"此外，它的说服力有很大一部分来自修辞。「可怜的脑容量」「拐杖」「硬按」——这些词先把你放在一个需要被怜悯的位置，再让你接受结论。把修辞剥掉，论证的核心其实只有一句：人脑窄，AI 不窄，所以结构是拐杖。而这句话恰恰是跳步的。",[11,20027,20028],{},"退一步说，就算 AI 真的把式子硬展开到第七阶，把所有发散项精准归零，它拿到的只是一张针对这个特例的系数表，换一个情形就未必管用。它能告诉你「这里可以归零」，但不能告诉你「为什么这里必然可以归零」。前者是答案，后者才是数学。打个比方：给你七百个点，你总可以找到一个不超过 699 次的多项式，让它精确穿过每一个点。但这只是插值，够不上理解。它在七百个点之外没有任何预测力。硬展开加待定系数，本质上就是高维版本的插值——你用一个足够大的展开式，把眼前的项全部按住，然后宣布问题解决了。可数学要的是「为什么会这样，以及换一个情形会怎样」。「按住」远远不够。",[11,20030,20031],{},"照这个逻辑，AI 不需要几何直观，可以直接站在高维的代数展开式里往下看。这个画面假设存在一个「没有直观」的视角。但任何计算都发生在某种表示里，而表示本身就是一种结构。Transformer 的注意力是内容相关的路由，等变网络把对称性硬编码进架构，神经算子学的是函数空间之间的映射——这些做法都把结构写进了模型，只是藏得比较深。没有免费午餐定理早就说过，不存在对所有问题都最优的通用学习器。每一个能学的模型，都带着自己的归纳偏置。所谓「不需要直观的 AI」，只是把直观藏进了架构里，让人看不见而已。",[11,20033,20034],{},"AlphaTensor 常被拿来当例子，但它恰恰站在这个论证的反面。DeepMind 并没有枚举所有可能的算法。它在张量分解的结构化空间里做强化学习搜索。它能找到 Strassen 式的算法，正是因为搜索空间被结构约束过。把 AlphaTensor 说成「暴力硬算」的证据，是对它的误读。",[11,20036,20037],{},"更有意思的是，AI 自己的前沿正在往结构走，纯暴力那条路反而越走越窄。等变网络、神经算子、状态空间模型、注意力机制，都是在把某种先验写进模型。为什么？因为纯暴力在高维会指数爆炸。这个领域最聪明的一批人，正在用工程手段重新发明数学家一百年前就熟悉的那些东西：对称性、局部性、可分解性。AI 的研究者自己正在沿着那条路径追赶，「绕开审美」的预言并没有发生。",[11,20039,20040],{},"技术细节上也站不住。「高阶项发散」常被当作「项太多、人脑装不下」的同义词。但在很多场合，发散属于表示问题，跟项数多少关系不大：这个展开本身是一个渐近级数，并不收敛。渐近级数在前几项可以给出极好的近似，但继续展开不会逼近真值。你需要的是重求和、解析延拓，或者换一个表示。数学家看到发散就后退，是因为他们知道「继续展开」不会自动收敛。这时候该做的是换一种表示，把项数堆得更高没有用。AI 就算把发散项凑没了，也可能只找到一种形式上的消去，并未得到收敛的表示。",[11,20042,20043],{},"即便并行 Agent 真的能同时追踪一万个五阶交叉项，代价也不是零。算力、内存、通信都会随着项数组合爆炸。「并行」被当成了免费的午餐。更关键的是，这个天花板背后还有复杂性理论：在普遍接受的复杂性假设下，有些问题是内在难解的——问题本身的复杂度摆在那里，跟聪明与否关系不大。「人脑太小」和「问题太难」被混为一谈了。就算给一个无限工作记忆的理想智能体，它也会撞上指数爆炸。人类偏爱结构，既因为脑子小，也因为问题本身硬。",[11,20045,20046],{},"所以，AI 可以使用一种人读不懂的结构。硬展开同样有结构，只不过这种结构被执行到了人跟不上的规模。一个逐像素渲染的渲染器，算得比任何画家都细，却始终跑在射影几何上，把透视算到了人眼看不见的精度。AI 的硬展开也一样：它把代数结构展开到了人脑装不下的长度，却始终在代数结构之内。",[11,20048,20049],{},"「上帝拿计算器硬按」假设答案先于结构存在。它背后是一个很朴素的柏拉图式画面：答案早就躺在那里，结构只是人类够不着时用的梯子。但数学的实践不是这样。很多答案是在结构被发明出来之后才成为「答案」的。",[11,20051,20052],{},"一个猜想在 n=5 成立、在 n=6 崩掉，硬算给你两个数。结构告诉你边界在哪里，以及为什么边界在那里。两个数可以和无穷多个故事相容，结构帮你挑出正确的那个。更一般地，硬算只能处理有限多个情形。即使你在计算机上验证费马大定理到 n 等于十亿，也不构成对所有的 n 的证明。Wiles 的证明之所以成立，靠的是模形式这座桥，把问题接到了另一个世界。计算量的大小并非关键。",[11,20054,20055],{},"知道一个命题为真，和知道它为什么为真，不是一回事。前者是证明，后者是理解。硬算可以给你前者，未必给你后者。而且，硬算能证明的通常只是有限多个特例。一旦命题是全称的，你就需要结构、归纳或者某种不变量，才能跨过「有限」到「所有」的鸿沟。七百个结果里可能有一些本身就是关于有限对象的定理，本身就有价值。但如果它们大多是硬展开出来的特例，那么它们更像是一批精确的数值事实，未必是可迁移的定理。另外，「七百篇论文」和「七百个结果」不是一回事。前者可能包含大量增量工作，后者才是数学意义上的成果。这个区分本身就值得追问，但先放在一边。",[11,20057,20058],{},"数学史上早有「先有黑箱，后有理解」的先例。四色定理 1976 年由机器辅助证明，当时吵得很厉害。后来人类花了很多年去简化、去压缩，形式化验证也完成了，但「机器证明算不算理解」这个问题并没有完全消失。Kepler 猜想被 Hales 用大规模计算机辅助证明，后来又有 Flyspeck 项目做形式化验证。模式很清楚：先拿到一个可验证但不可读的答案，再花一代人把它翻译成人类握得住的结构。翻译可能失败，也可能要几代人，但「现在翻译不出来」从来不足以让人停下来。",[11,20060,20061],{},"而且，人类数学自己也早就遇到过不可读的问题。有限单群分类定理的证明上万页，散落在几百篇文章里，据说至今没有人从头到尾读完。这是人类自己造出来的黑箱。区别只在于规模：人类数学在二十世纪就已经开始生产超出个体阅读能力的结果，AI 只是把这个趋势推得更远。",[11,20063,20064],{},"黑箱当然有价值。它可以被引用、被使用、被当作下一步的踏脚石。但它的价值有一个天花板：验证成本无法摊销。一个你理解了的定理，可以在一段话里教给别人，可以在新问题里直接调用。一个你不理解的黑箱，每用一次都要重新跑一遍、重新信一遍。理解之所以重要，是因为它把验证成本压缩成了可复用的结构。没有理解，知识就不能以低成本累积。",[11,20066,20067],{},"把这种思路推到极端：也许黑箱就是数学的新常态。也许未来的数学单位会从定理变成证书。数学家追求的东西，也会从「看懂」转向「可验证、可组合、可规模化」。这是一个严肃的可能性，我不打算轻易否定它。但它比「AI 算得更快」是一个大得多的主张：它改变的是数学知识的定义，速度倒在其次。而且，就算走到那一步，信任基础设施本身仍然是结构：证书格式、证明助理、可复现性标准、社区共识。黑箱的未来并未取消结构，只不过把结构挪到了另一个地方。",[11,20069,20070],{},"至于审美，AI 正在用一个丑但有效的答案挑战「美是数学的先验判据」这个前提。这个前提站不住。",[11,20072,20073],{},"数学史上「丑的真理」屡见不鲜。三次方程的求根公式在 16 世纪就撞上了 casus irreducibilis：三个实根，却必须经过复数才能算出来。当时的数学家觉得这近乎荒谬。非欧几何刚出来的时候，高斯不敢公开发表。Cantor 的无穷集合遭到 Kronecker 的激烈反对。Weierstrass 造出处处连续、处处不可导的函数，被当时的许多人视为病态。Banach-Tarski 分球悖论更是像在说「数学不该长这样」。后来的处理方式，是扩写美的定义，把这些东西留下来。复数变成了复平面上的几何，非欧几何变成了曲率，病态函数催生了测度论，也逼着拓扑学重新审视连续与收敛。分球悖论则逼着人们去追问选择公理到底意味着什么。丑的东西待得够久，人类就会给它找一套它配得上的语言。语言找到了，它就不丑了。",[11,20075,20076],{},"所以，美更像事后的评价。数学家说一个证明美，通常是在说：它把原本分散的东西统一了，没有多余的假设，并且揭示了机制。这些都是理解完成之后的判词，很难充当发现之前的门槛。历史上真正被审美直觉挡在门外的结果——比如 Galois 生前没能发表的手稿——事后看，那是审美的失败，数学本身并没有失败。",[11,20078,20079],{},"但也不要走到另一个极端，把审美说成纯粹的非理性。审美其实是一个关于「可压缩性」的启发式：一个漂亮的证明，往往更容易推广、更容易迁移、更容易在别的问题里复用。它当然会犯错，但命中率并不低。数学家对丑的警惕，除了对陌生的恐惧，还包含一种合理怀疑：这东西也许无法一般化。把审美当成纯粹的偏见，这太便宜了。",[11,20081,20082],{},"所以，「能不能翻译」比「美不美」更值得问。丑是可以忍受的，只要它能在可接受的成本内被压缩成一套可迁移的结构。丑而无法批量翻译，才是真正的问题。对 AI 那七百个结果，关键在翻译成本：把它们变成人类可读的结构要花多大代价，这个代价能不能被规模化地摊薄。如果每个结果都需要一位数学家花十年去反推，那七百个结果的边际价值就取决于翻译的规模化程度——而这恰恰是 AI 可能帮上忙的地方：让 AI 去搜「能压缩这七百个结果的统一框架」。丑不可怕，可怕的是丑得无法批量处理。",[11,20084,20085],{},"「地球灭亡之前，人类没法理解的事情肯定存在。」这句话我同意。Gödel 的不完备定理保证了真而不可证的东西存在，复杂性理论则告诉我们，一大批问题在可接受的资源内算不动。但这句话不能推出「所以现在别理解了」。",[11,20087,20088],{},"从「存在无法理解的东西」推不出「眼前这七百个就是无法理解的」。这是一个很基本的逻辑错误：存在量词不能这样实例化。而且，可理解域的边界是未知的，历史上每一次都被推得比预期远得多。Hilbert 纲领失败了，但失败本身催生了证明论和可计算性理论，也深刻改变了模型论的问题意识。数学的边界更像一片雾。你往前走，雾就退一点。",[11,20090,20091],{},"理解有许多层次。我们理解热力学，不需要追踪每一个分子。同样，我们理解一个函数，不需要它的封闭形式。七百个结果可能在细粒度上不可读，但在粗粒度上仍然可以被理解：它们可能共享某种对称性、某种生成机制、某种还没被命名的结构。放弃理解需要「已经证明这里推不动」。「现在看着像一团乱麻」还不够。前者是数学，后者是情绪。",[11,20093,20094],{},"另外，AI 的方法太有针对性，这是数学界最实在的批评之一。以前一个理论出来，不仅解决目标问题，还会带来一整套工具箱，影响其他领域。现在的 AI 方法往往只解决目标问题，然后就结束了。",[11,20096,20097],{},"这条批评有它的道理。人类数学的溢出效应是结构性的。Galois 理论本来是为了解五次方程，产出的群论和域扩张后来成了整个代数的主干。Riemann 为了理解素数分布把复分析引进数论，他的几何工作又养活了微分几何和拓扑。同调代数从拓扑里长出来，最后变成了交换代数、代数几何、表示论的通用语法。目标问题是钩子，工具箱才是本体。数学界评价一个工作，隐含的标准是「它留下了什么可复用的东西」。「它证明了什么」只是起点。",[11,20099,20100],{},"AI 目前的产出恰好踩在这个标准的反面。AlphaTensor 找矩阵乘法算法、组合搜索、符号回归凑公式，共同特征是：针对特定实例、依赖大规模搜索、结果的可迁移性有限。它优化的是「这个问题有没有解、解是什么」。「这类问题的结构长什么样」则被放在一边。一个只针对单点的工具，边际价值确实低，尤其当它消耗的算力还能拿去做别的事。",[11,20102,20103],{},"但针对性太强，是 AI 的局限，还是当前阶段的局限？历史上「针对性太强」的批评也落在过人类自己头上。数值分析早期被纯数学家看不起，觉得是工程凑数，后来它长出了稳定性、收敛阶、条件数这一整套理论。概率论被当成赌博工具几百年，Kolmogorov 公理化之后才翻身。针对性强的工具，如果被反复使用，往往会倒逼出一般理论。差别在于：人类工具的一般化是被使用者的需求驱动的，慢但稳。AI 工具的一般化目前没有人系统性地做，因为发论文的激励在「又刷了一个纪录」，不在「把这套方法抽象成可复用的框架」。",[11,20105,20106],{},"所以，真正缺的，是有人负责把针对性的方法一般化。「AI 方法针对性太强」只是表象。人类数学家有同行评议和长期声誉在逼他们想「这东西能不能推广」。AI 数学的产出链条里，这个环节目前是断的。如果哪天真有团队认真做「把七百个硬展开结果反推成一个统一框架」，而且做成了，那这条批评就自动消解了。但这件事的难度不比发现那七百个结果低，甚至更高：归纳一个框架，靠的是猜对抽象层级，算力反而次要。而这恰恰是目前最说不清楚 AI 能不能做好的部分。",[11,20108,20109],{},"翻译是一项制度功能，很难靠某位数学家的英雄行为完成。人类数学之所以能把计算变成结构，靠的是一整套同行评议、教科书、研讨会和长期声誉的机器，在逼着每一代人去问「这东西能不能推广」。个别天才只是其中一环。AI 数学现在缺的，正是这台机器，算力和聪明的模型都还在其次。真正的瓶颈在分工，认知带宽不是主要问题。",[11,20111,20112],{},"这套论证的力量来自三个漂亮的偷换，把动机当成定义，把事后的判词当成先验的门槛，把答案当成理解。",[11,20114,20115],{},"但挑战是真的，只是位置放错了：我们把计算翻译成结构的制度，没有跟上计算的速度。「AI 比人算得快」只是表面。",[11,20117,20118],{},"画家画不出世界上的每一个光子，所以他发明透视。但透视是射影几何，跟「眼睛不行」没有关系。",[11,20120,20121],{},"今天最强的渲染器可以逐像素地硬算，但它仍然跑在透视的数学上。硬算并没有取消结构。它把结构算到了人眼跟不上的地方。",[11,20123,20124],{},"上帝或许真的在用计算器。但账本不是给计算器看的。人类接下来要做的，是翻译账本，让计算器的结果变得可读。",[11,20126,20127],{},"所以说，AI 在未来会彻底取代数学研究的劳动吗？",[11,20129,20130],{},"我认为不会，而且在未来很长一段时间里，都不会，至少在 AGI 诞生之前永远不会。",[15772,20132,20133],{},[11,20134,20135],{},"砸掉计算器解决不了问题。数学的下一份工作，也许要从「发现」转向「翻译」。",{"title":23,"searchDepth":64,"depth":64,"links":20137},[],"前段时间，OpenAI 声称，他们用内部尚未正式发布的模型产出了七百多篇论文，「AI 接替数学家」的叙事于是再一次被推到台前。市场是狂热还是炒作，我已经疲于争论。那七百篇论文是否名副其实，也先放在一边。真正让我想写点东西的，是 Twitter 上一条获得不少认同的帖子。它把数学结构说成人类为了迁就自己那点脑容量而被迫发明的拐杖，把 AI 说成不需要几何直观、可以直接站在高维展开式里往下看的怪物。最后一句尤其漂亮：我们终于拿到了上帝账本里的答案，却发现上帝算账根本不用微积分，他老人家是直接拿计算器硬按出来的。",{},"\u002Fblog\u002F2026\u002F0012-shu-xue-yu-hua-jia",{"title":19961,"description":20138},"blog\u002F2026\u002F0012-shu-xue-yu-hua-jia","结构本身就是定理，AI 也有结构，只是那种结构人读不懂。关键在于可翻译性，以及把计算翻译成结构的制度是否跟得上。硬算常给出有限情形的答案而非「为什么」，而把针对性的结果一般化、翻译成可复用结构的制度，在 AI 数学的产出链条里是断的。",[20145],"thoughts","2026-10-25T16:52:45+08:00","MTXFn_wz9eNH537cFyhWDAYMtvfSTEdfulMeMndlEyU",1793236640886]