有些公式看着像天书,实际上不过是几个数字在玩捉迷藏。想象一下你手里拿着一张脸谱图,上面画着大量个角色,每种颜色代表一种真值,黑话白,白话黑。
要是这个图里所有的黑话白都凑在一起,形成了某种整个的画面,那它就是一个命题可知足公式。别被“命题”这两个字吓住,它就是指一个断言,就像那句“忒阳从东边升起”,在特定条件下是成立的。但有时候,忒阳确实从西边升起,那公式就变成不可知足的了。 这就好比你在做逻辑题,手里有一串指令,比如“要是 A 形成,那么 B",可你发现 A 真 B 假,B 真 A 假,这指令就卡住了。
这时候就要看这个指令是不是松的。
要是存有一种情况,让所有分支都跑通,那公式就是可知足的。
这时候你就有了希望,游戏还能持续。但要是甭管如何走,全是死胡同,那这个公式就是不可知足的。 拿 Python 语言来说,大量逻辑库都会自动帮你搞这个事。
比如 matplotlib 要么 numpy 这些库,它们内部有一堆代码在后台默默地在比对数据。当你调用 `satisfiable` 函数时,它就像个老手,手里拿着无数的试错,悄悄地在心里演练一遍。
要是它能找到哪怕一个解,那整个公式就活了;要是试遍了所有可能性,最终还是凑不出个像样的,那它就死了。 举一个具体的例子,假设我们要判断两个命题:P 和 Q。P 是“今天下雨”,Q 是“我带伞”。在现实世界里,今天确实下着雨,那你带伞,这肯定是确实。逻辑表达式写出来就是 `(下雨) AND (带伞)`。目前换个场景,要是你在火星上,那里根本没有大气层,自然也就没有雨了。
这时候 P 就变成了假,而 Q 依然是真(出于你带了)。 `(假) AND (真)` 的结局就是假,故此整个公式不可知足。再换一种情况,要是你根本没带伞,也没下雨。
那 `(真) AND (假)` 还是假。
看来在这个组合里,没有一种情况能让两个条件与此同时成立。
这就是不可知足。 有时候你会发现,一个看似复杂的公式,拆开看实际上挺好办。
比如 $A lor neg A$,这在逻辑学里是个经典模型。
不管 A 是啥,要么是一堆乱七八糟的复杂逻辑串,只要把它的值代入进去,你会发现总能凑出个非零的解。
这种公式一般被称为重言式,就是一辈子不崩塌的。
哪怕你把它写得像加密算法那样,只要逻辑基础没变,它一辈子不死。 反过来想想,要是一个公式是永假的,那它就像个死循环,不管如何转都出不来结局。
比如 $(neg P) land P$,这里 P 和它自己互相对立。P 为真时,第一个假,第二个真,整体假;P 为假时,第一个真,第二个假,整体也假。甭管你如何取值,结局都是零。
这种公式在自动化求解器里会被一眼识破,直接转身就跑,出于根本不需求费劲去试。 在实际应用中,这种判断对开发者忒关键了。你在写一个 AI 的决策树,要是某个分支的死胡同判断错了,整个机器可能就瘫痪。
这时候你就需求花工夫去检查这个公式的可知足性。
要是它不可知足,说明你的逻辑设计有 Bug,需求删掉一根不必要的线。
要是它可知足,那就有无数种路径可选,你能够随意选一个来跑通测试。 还有呢,有些公式是用来证明数学定理的。
比如康托尔对角论证法,要么皮亚诺公理系统的构建。
这些高阶的数学证明,往往就是靠不断构造一个“可知足”的子系统等式来起头的。他们通过递归地添加新句子,直到发现一个矛盾,要么找到一个知足所有条件的模型。
这个过程就像搭积木,一块接一块,直到搭出一个整个的塔。一旦塔搭好了,就能够得出结论了。 自然,这类难题在处理大数据量时会变得棘手。
要是公式里有成千上万个变量,变量之间错综复杂的关系,就需求更多的算力。
这时候可能需求用到 SAT 求解器,它运行得贼快,有时候秒级就能给出答案。但要是是超大规模的难题,可能需求用到启发式算法,它们不保证找到第一个解,但能找到那个“最好”的解。 有时候你会认定,逻辑公式就是死板的,只有真和假之分。
实际上不然。在自然语言里,逻辑是有语气的。一个“要是……那么……",有时候是确定性的,有时候是推测性的。逻辑学家在搞弄的时候,要注意语境。有的公式在特定语境下是弱可知足的,有的却是强可知足的。强可知足意味着存有一种情况让所有局部都成立,而弱可知足则只是存有一种情况让其中一局部成立。 还有一点要注意的是,某些公式在特定理论体系下是可知足的,换到另一个体系里可能就不中了。
比如一个基于公理体系 A 的证明,在体系 B 里可能推不出。
这说明逻辑是相通的,但也分块。就像不同地图上的城市,形状可能类似,但大小和位置不同。 总而言之,理解命题可知足公式,就是理解这个世界如何可能。它不是虚无缥缈的东西,而是实实在在的计算和构造。当你看到那些复杂的符号时,不妨试着把它还原成原始的意思,看看里面藏着的各种可能性。
有时候,最复杂的公式,最启动的版本实际上就挺好办。