停机问题不可判定:从反证法到自指矛盾,为何没有万能检测器?
很多朋友第一次听说“停机问题不可判定”时第一反应大概率是这应该只是还没找到聪明的算法吧其实完全不是。这个结论说的是不存在一个通用程序能够对“任意程序P在输入I下最终是会停还是一直转下去”给出正确判断。注意“任意”这两个字。问题不是某个具体程序太难分析而是“判断任意程序是否停机”这个任务本身就不可能被一个固定算法完成。这篇文章我不打算堆术语而是把停机问题的定义、反证法的完整过程、自指带来的本质矛盾以及它在实际开发中到底意味着什么一层层拆开讲清楚。无论你是写业务代码的工程师、做静态分析的研究者还是纯粹好奇理论计算机都能从里面找到自己关心的东西。1. 停机问题在问什么先定义清楚“停机”和“万能检测器”1.1 形式化定义到底长什么样要讨论一个数学问题第一步是把“程序”“输入”“停机”这些词换成严谨的定义。这里的“程序”指的是任何能在计算模型上运行的算法描述像普通函数、脚本都可以。输入则是程序在运行时需要的数据可能是字符串、数字、文件内容之类的具体值。“停机”指的是程序在有限步之后结束运行而不是无限循环。我们想要的“万能检测器”可以想象成这样一个函数给它两个参数一个是程序P一个是输入I它立刻输出一个布尔值。输出“真”表示预测P(I)会在有限步内停机输出“假”表示预测P(I)会永远运行下去。为了方便阅读写成伪代码大概是function H(P, I): # 根据某种算法分析 P 和 I if P(I) eventually halts: return true else: return false这里最关键的点在于H必须对任意程序P和任意输入I都有效。它不能只对几十个例子有效也不能对某类特殊程序失效时找借口说“超出了支持范围”。一旦我们说“H是停机问题的判定器”就意味着它在所有情况下都给出正确结果并且每次都在有限时间内结束。这才是“判定”和“猜测”的区别。为了感受一下这个要求有多强可以看两类极端简单的程序。print(hello)显然会停机while True: pass显然不会停机。如果一个检测器只能处理这两种程序那当然很容易。但实际想要的是给它一个几千行的递归函数里面还有动态修改代码、跳转、异常处理、并发调度它也能瞬间判断出结果。这种“全能性”才是停机问题里真正的难处。1.2 “不存在”和“还没找到”是两回事为什么要把这个区别单独拎出来因为绝大多数人对不可判定的误解都出在这。数学里很多难题是“还没找到解法”比如某个超大数的素因子分解你可能会说“现在算不出来”但理论上可以用试除法慢慢算只是时间太长。这类问题是可判定的只是复杂度太高。停机问题性质完全不同它被证明在逻辑上不可能有统一解法即使把计算能力放大一万倍或者给算法跑一亿年也不会有结果。打个比方可判定问题像是一个“箱子里确实有钥匙只是箱子锁得严”你只要花足够时间总能打开停机问题则像是“箱子的锁和钥匙被设计成互相矛盾的关系”当你终于找到一把钥匙时这把钥匙又同时会把锁焊死。所以它不是一个效率问题而是一个存在性问题。明白这一点之后再去看后面的反证法就不会云里雾里。这里也要澄清一个常见的表述误解。“不可判定”不是说“我们不知道它停不停”而是“任何一个固定算法都会在某些输入上出错”。对于某个具体的、拎出来的程序人类或机器可能通过针对性的推理判断出它是否停机但对于“所有程序”这个全体不存在通用答案。这就是为什么后面证明的构造方式如此重要它不是展示一个“特别难猜的例子”而是展示了无论检测器多强都有一个专门跟它对着干的程序。2. 从反证法到内心崩溃一个无法存在的检测器2.1 假设存在画出H的样子现在做反证。先假设那个万能检测器H真的存在。不要想象它有多复杂也不要想它怎么实现。它唯一需要满足的性质是无论给它什么程序、什么输入都能在有限时间内正确回答“停不停”。就用这个性质去推到矛盾完全不需要知道H内部用了什么策略。这就好像我们玩一个游戏先假装世界上有一把“什么锁都能打开”的万能钥匙然后我们设计一把“这种钥匙打不开的锁”。如果锁真的能设计出来就说明万能钥匙不存在。下面构造的那段程序Q就相当于这把锁。反证法的妙处在于我们并不需要真的运行H。我们可以把它当作一个已经存在的黑盒来使用所有推理都建立在这个黑盒的属性之上。只要从属性推出矛盾就说明这个黑盒在逻辑上不可能存在。这会比“试图穷举所有H的实现然后逐一排除”干净得多。2.2 构造“捣乱程序Q”让H自打嘴巴用H来构造一个新程序Q。Q的输入也是一个程序它把自己的输入当作另一个输入对象来处理。伪代码如下function Q(P): result H(P, P) if result true: # H 说 P(P) 会停机 while True: # 那 Q 就故意死循环 pass else: # H 说 P(P) 不会停机 return 42 # 那 Q 就立刻结束这里有两个细节不要看漏。第一H在Q内部拿到的两个参数都是同一个P也就是说H被用来判断“P以自己为输入时是否停机”。为什么可以这样因为在计算机里程序本身也可以被当成数据处理代码就是字节串函数也可以作为参数被另一个函数接收。所以把程序P传给它自己在计算模型里是合法的。第二Q拿到H的判断结果之后故意做出相反的行为如果H说会停Q就不停如果H说不会停Q就停。这个“相反”是整个矛盾的引擎。可以把这个Q理解成一个职业唱反调的人。H的结论是“你会停”Q就回答“那我偏不停”H的结论是“你不会停”Q就回答“那我偏停”。无论H怎么说Q都有本事让自己站在答案的对立面。2.3 把Q喂给自己矛盾收网好现在Q本身也是一个程序所以我们可以把Q当作输入丢给自身。也就是说执行Q(Q)。按照Q的定义它会先调用H(Q, Q)也就是让万能检测器判断“Q以自己为输入时会不会停”。关键在于H的答案是二选一如果H返回真即预测Q(Q)会停机那么Q内部的代码就走进死循环分支于是Q(Q)实际上不会停机。这跟H的预测相反矛盾。如果H返回假即预测Q(Q)不会停机那么Q内部的代码走进返回42的分支于是Q(Q)反而在有限步骤内结束了。这又跟H的预测相反矛盾。把结果整理成表格更清楚H 的预测Q 的实际行为结果Q(Q) 会停机进入死循环不停机预测错误Q(Q) 不会停机返回 42停机预测错误两个可能性都矛盾说明什么说明我们最初的假设“存在这样一个H”是错的。只要H存在就一定能构造出这样一个Q让H在自己身上撒谎。所以不存在能判定任意程序停机的通用程序。有人可能会追问那Q(Q)到底会不会停机严格说这个问题没有答案因为H不存在Q的定义本身就无法完成。我们构造的是一个“如果H存在就能运行”的反事实程序它建立在错误假设上。反证法不需要算出真实行为只需要证明假设会导致逻辑不一致。3. 自指与对角线为什么这个矛盾不能靠绕道解决3.1 理发师悖论最直观的自指陷阱熟悉集合论的人会想起理发师悖论一个理发师说“我只给所有不给自己理发的人理发”那么他给不给自己理发如果他给自己理发那他就属于“给自己理发的人”按照规则他不该给自己理发如果他不给自己理发那他又属于“不给自己理发的人”按照规则他又该给自己理发。这是一个经典的自指矛盾。停机问题的证明和它有相似之处但又更本质。理发师悖论可以通过澄清“这样的理发师不存在”来解决停机问题则是通过合法程序构造了自指场景矛盾结果不是出现悖论而是说明H不存在。换句话说程序语言本身就允许我们写出这种自引用代码所以在计算机世界里这个矛盾是真实成立的。自指为什么这么重要因为H想判断的对象恰好包含H自己。H可以判断“别人”但一旦判断到那个把自己当参数的Q就会陷入逻辑泥潭。Q像一个镜子把H的判断反射回H自己脸上。这种“自己审判自己”的结构是许多不可判定性证明的通用配方。3.2 对角线法为什么Q逃出所有可能另一个理解角度是对角线法。假设可以把所有程序排成一个列表P1, P2, P3...。我们可以做一个巨大的表格第i行第j列回答“Pi(Pj)最终是否停机”。如果H存在那么表格的每个格子都能由H算出。现在看Q。Q取一个程序P之后它的行为和H(P,P)的结论恰好相反。想象我们从表格左上角开始逐个看对角线上的格子第一行第一列P1(P1)第二行第二列P2(P2)...。Q就是那个“在对角线的每个结果上都取反”的程序。取反后的结果一定不同于每一行对角线上的值因此Q的行为模式不可能完整出现在任何一行里。但Q明明也是一个程序它必须出现在列表的某一行。于是出现矛盾。这个视角能更清楚地看到问题的结构Q不是针对某个特殊输入捣乱而是针对“整个程序列表”的对角线属性捣乱。这也是为什么它常被称为“对角线构造法”。它展示了一种普遍的矛盾制造方式先枚举所有可能性再构造一个在每个枚举项上都取反的新对象让新对象跳出集合。3.3 可计算边界不是数学太弱而是“可计算”本身定义了边界有人会问能不能让H更聪明一点或者在运行前多收集点信息然后避开Q不行。证明并没有限制H的实现方式不管它是查表、符号推理、穷举还是启发式只要它是一个可计算的程序就会被Q当作子程序调用并翻转结果。即使换成并行计算、量子计算只要计算模型仍然能表达Q矛盾就依然存在。还有人说那不让Q知道自己被H调用或者把Q包装成更复杂的形式能不能绕过关键在于Q不需要“知道”自己会被调用。Q的定义是显式调用H的H的输入是程序文本。当输入是Q自己时H拿到的是Q的文本分析Q的代码自然发现Q在调用H。这个关系是固定的不是运行时魔法。从更广的角度说停机问题不可判定不是数学工具失败它反而划清了“什么是可计算”的边界。可计算问题集合里从一开始就不包括“判断任意程序停机”这个任务。任何企图把它硬塞进可计算集合中的尝试最后都会被反证法原样顶回来。理解这一点才算真正理解不可判定而不是停留在“好神奇”的阶段。4. 停机问题不可判定在日常技术中的真实投影4.1 编译器里的死代码识别为何不可能完美编译器为了优化和警告常常需要判断某段代码是否永远执行不到。比如函数里在一条无限循环之后放一行代码理论上这行代码是死代码。但“这个循环是否无限”本质上就是“这个函数是否停机”的变体。一个编译器能不能对所有程序都正确判断哪部分无限循环不能。所以编译器采用保守策略只有能通过简单规则明确证明不可达的代码才被删掉比如return之后、break之后紧随的语句或者永不成立的条件分支。对于更复杂的情况它就保留代码宁可生成稍大一点的程序也不能冒“删错代码改变语义”的风险。这不是编译器厂商偷懒而是不可判定性逼出来的设计取舍。举个具体例子。假设有一段代码if future_condition(x): do_stuff()如果future_condition(x)的判定需要执行一个极其复杂的递归函数而这个函数可能不停机那么编译器就无法确定do_stuff()是否可达。它只能假设可达把代码保留下来。对编译结果来说顶多多几行字节码但语义一定安全。这是工程上的“最小后悔策略”。同样的逻辑也出现在代码覆盖率工具、误报率分析、安全扫描器中。所有这类工具都只能输出“我找到了这些问题”而极少敢说“除此之外完全没有问题”。一旦理解停机问题你就能明白它们为什么不敢这么说。4.2 程序验证工具为什么总在要你人肉辅助自动化程序验证希望证明代码没有死循环、不会越界、循环不变式始终保持。如果存在一个万能程序证明任意程序的终止性质许多验证工作就可以全自动完成。但停机问题的结论掐死了这条路径。因此工具普遍采用人机结合的方式系统负责模式匹配、符号计算和抽象解释人类负责提供循环不变量、终止秩函数等关键信息。例如要证明一个循环结束验证器会要求你给出一个表达式比如整型变量x的当前值。然后展示每次循环后x严格递减并且x始终不小于0。因为自然数不能无限递减所以循环必然停止。这个递减表达式就是“秩函数”。验证器通常只负责检查你提供的秩函数能否构成递减链而不负责从零开始发明所有可能秩函数。这里的核心思路是把“判定任意程序是否终止”这样一个不可解问题缩小为“在给定候选证据的情况下检查证据是否有效”。后者往往是可判定的甚至只需要做符号计算和整数比较。工业级验证工具能自动处理很多简单循环但遇到嵌套、复杂数据结构、动态特性的代码时就需要用户介入。这并不意味着工具无用而是它清楚地划定了自己的可判定领地。4.3 超时机制和半判定向不可判定妥协的正确姿势生产环境里最常见的“解决停机问题”方式其实是超时。给程序设定一个时间上限到期强制中断。这种方式看起来很接地气但要注意它的本质是改变判定条件不再问“如果永远运行会不会停”而是问“在10秒内会不会停”。后者是可判定的因为只需要模拟10秒的执行即可。它没有违反停机问题的结论而是把问题换成了一个工程上可回答的近亲。停机问题也带来一个“半判定”性质如果要证明程序会停机我们可以去无限枚举执行步骤终究能等到它结束因此“会停机”这个性质是半可判定的但要证明它不停机这种枚举法永远拿不到有穷证据。所以很多工具设计成“尽力找证据找不到就报告未知”。给判定结果增加“未知”状态是工程面对不可判定性最常见的智慧。这个“三态输出”和“二态判定器”之间的差异非常关键。H的理想形态是只输出“停”和“不停”不允许“不知道”。工程工具则愿意输出“不确定请人工再看一下”。一旦允许三态很多理论上不可判定的问题就可以退化成“可以找到部分答案的搜索问题”这正是编译器、验证器、测试工具能够存在的理论前提。5. 实际开发中怎么和不可判定性相处5.1 判断单个具体程序常常可行“任意程序不可判定”很容易被误解成“任何程序都无法判断”。实际情况完全不同。我们每天都在判断具体程序。比如while x 0: x x - 1在初等算术范围内很容易证明它会在有限步结束。停机问题的结论针对的是“对所有程序通用的判定器”而不是“对某个具体程序的具体证明”。很多实际开发中的循环都有明确边界完全可以通过人工分析或静态规则确定终止性。所以你不必在每一个函数面前都感到绝望。可以把问题层次分成三种第一某个具体程序会不会停这个问题常常有答案也可能能找到证明第二是否存在一个固定的判定算法能对所有程序统一作答这个问题已经被证明为“否”第三对于某个类的程序是否存在覆盖这一类所有程序的特化判定方法则可能是一个很有价值的研究问题。很多静态分析工具就是在第三层做工作。5.2 终止性检查器的实现思路如果你要在自己的系统里做终止检查常见做法是维护一个“秩函数库”。对每个循环系统尝试几条路径找整数变量之间的线性约束找自然数表达式找递归调用的参数是否有单调递减的字典序如果都不行就放弃并提示用户。因为放弃是允许的只要你别谎报“一定不停机”即可。举个例子循环while n 0: n n // 2可以选秩函数为n。每次循环后n变成n // 2只要n还是正整数数值就严格下降并且已知n不小于0。由于每次除以2至少减少1所以迭代次数有上限。这就是一个最简秩函数。工具自动寻找候选n并不困难困难的是处理多变量相互依赖的循环那才需要更复杂的线性算术或抽象解释。这套思路本质上和程序验证器一致把“证明终止”变成“搜索有根据的递减证据”。搜索范围虽然不完整但覆盖了绝大多数业务代码里出现的简单循环。真正落入不可判定陷阱的代码通常是那些不断自我修改、动态跳转、依赖外部输入产生奇异控制流的程序这在普通业务系统里很少出现。5.3 给普通开发者的三条实操建议第一不要把“能不能判断”和“能不能靠经验预判”混为一谈。写完代码自己动脑子想想循环出口、递归基例这永远不亏。有了停机问题的概念你会更警惕那些“理论上可能终止但毫无保证”的递归调用。第二如果系统必须处理可能失控的第三方代码用超时和资源限制来兜底不要试图用“万能分析器”一劳永逸。第三阅读或维护形式化验证工具的输出时把“未证明”理解为“工具能力不够而不是代码一定有错”。接受这个输出里的灰色地带你的工作压力会小很多。最后我再分享一点个人体会。我把整个证明从头到尾自己动手写了一遍之后最大的变化不是记住了结论而是看代码时多了一根弦每次看到“我们可以自动判断一切程序是否终止”的宣传标语都会下意识地去想它隐藏的限制条件。停机问题就像是一个永远闪着的警示灯提醒我们计算世界里存在一些界限任何框架、任何语言、任何聪明算法都无法跨越。这不是坏消息。恰恰是因为知道了边界在哪里我们才不会把工程资源浪费在建造永动机上而是去设计那些真正能做得好、做得稳的部分。这大概就是理论带给工程师们最实在的安慰。

相关新闻

终端里的Agent Flow实战:从流程编排到稳定跑通的全记录

终端里的Agent Flow实战:从流程编排到稳定跑通的全记录

前阵子我在终端里折腾一个叫 Agent Flow 的东西,起因其实特别朴素:手头有一堆零散的批处理任务,今天抓点数据,明天清洗一下,后天再生成个报告,每一步之间还有依赖关系。一开始我用 shell 脚本硬串&#xff…

2026/10/16 16:25:21 阅读更多 →
InternVL2-Pretrain-Models的Pixel Shuffle与mlp1投影器:图像特征如何压缩成LLM的词汇

InternVL2-Pretrain-Models的Pixel Shuffle与mlp1投影器:图像特征如何压缩成LLM的词汇

【免费下载链接】InternVL2-Pretrain-Models 项目地址: https://ai.gitcode.com/OpenGVLab/InternVL2-Pretrain-Models 点击查看 免费下载 InternVL2-Pretrain-Models 是 InternVL 2.0 多模态大语言模型 Stage-1 阶段的多模态预训练模型仓库,提供从 Int…

2026/10/16 16:24:17 阅读更多 →
EN 300 132-1接口A1标准解读:电压暂降、冲击电流与保护器件选型实战

EN 300 132-1接口A1标准解读:电压暂降、冲击电流与保护器件选型实战

简介:《ETSI EN 300 132-1 V2.1.1(2019-03)》是欧洲电信标准协会发布的环境工程与信息通信技术(ICT)设备电源接口标准,其第1部分规定了交流电输入接口的电压范围、电流等级、插头插座类型、过载及接地保护等…

2026/10/16 16:23:15 阅读更多 →

最新新闻

贝叶斯决策实战:不用公式也能做高质量判断

贝叶斯决策实战:不用公式也能做高质量判断

1. 这不是数学考试,而是你每天都在做的判断“贝叶斯决策”这四个字一出来,很多人第一反应是:哦,又是概率论里那个带公式的章节——先背公式,再套题,最后考完就忘。但事实是,你今天早上决定要不要…

2026/10/16 17:07:06 阅读更多 →
智慧燃气GIS系统建设指南:从数据治理到应急实战

智慧燃气GIS系统建设指南:从数据治理到应急实战

1. 先搞清楚:为什么燃气系统非要跟GIS绑在一起做燃气行业信息化这几年,我听到最多的一个需求就是“把管网的底数摸清楚”。过去很多燃气公司的现状是:CAD图一套、Excel台账一套、现场实际又是另一套,调度中心一个数,工…

2026/10/16 17:07:06 阅读更多 →
基于Python的三层蒸发蓄满产流模型(新安江模型)实现与参数率定

基于Python的三层蒸发蓄满产流模型(新安江模型)实现与参数率定

简介:这是一份面向水文水资源领域的三层蒸发蓄满产流模型(新安江模型)Python计算程序,适用于水利工程、水文预报及流域模拟方向的从业者、研究人员与学生,帮助解决蓄满产流过程的核心计算与编程实现问题。压缩包内仅含…

2026/10/16 17:07:06 阅读更多 →
用NeMo AutoModel训练扩散模型:Qwen-Image、FLUX与Wan文生图微调完全指南

用NeMo AutoModel训练扩散模型:Qwen-Image、FLUX与Wan文生图微调完全指南

【免费下载链接】Automodel 🚀 Pytorch Distributed native training library for LLMs/VLMs with OOTB Hugging Face support 项目地址: https://gitcode.com/gh_mirrors/aut/Automodel 点击查看 免费下载 NeMo AutoModel 是 NVIDIA 开源的 PyTorch 分…

2026/10/16 17:07:06 阅读更多 →
别只会预设模式!Univer 插件架构一图看懂,电商/金融项目选型照着抄

别只会预设模式!Univer 插件架构一图看懂,电商/金融项目选型照着抄

别只会预设模式!Univer 插件架构一图看懂,电商/金融项目选型照着抄 【免费下载链接】univer The Office Harness for AI Agents — Spreadsheets, Docs, Slides, Canvas, Relational Tables, and PDF in one runtime. 项目地址: https://gitcode.com/G…

2026/10/16 17:07:06 阅读更多 →
山脉数组二分查找全解:三次二分破解 LeetCode 1095

山脉数组二分查找全解:三次二分破解 LeetCode 1095

前几天刷题群里有朋友卡在 LeetCode 1095 上,说山脉数组的解法绕来绕去,边界条件一多就犯迷糊。这道题其实很有代表性——它是“二分查找变体”里最典型的综合题之一,把“峰值查找”和“两侧有序区间的定向二分”串在一起考,我当年…

2026/10/16 17:06:04 阅读更多 →

日新闻

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 0:00:05 阅读更多 →
信号与系统频域分析作业解题指南

信号与系统频域分析作业解题指南

1. 作业背景与核心要求解析信号与系统作为电子信息类专业的核心基础课,其作业设计往往直接关联课程的核心知识框架。2026年春季第六次作业的布置,通常对应着课程进展到频域分析的关键阶段。根据常规教学进度推测,本次作业可能涉及以下核心内容…

2026/10/16 0:00:05 阅读更多 →
Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

1. 从一个"四不像"的练手项目说起如果你已经看完了Django的官方教程前几章,跟着敲完了投票应用,大概会有一种"我好像会了,又好像什么都不会"的割裂感。教程里每个知识点都是拆开的——这一章讲模型,下一章讲视…

2026/10/16 0:00:05 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →