【计算复杂性理论】证明复杂性(九):命题鸽巢原理的指数级归结下界——更简短的证明

往期文章:

  • 【计算复杂性理论】证明复杂性(Proof Complexity)(一):简介
  • 【计算复杂性理论】证明复杂性(二):归结(Resolution)与扩展归结(Extended Resolution)证明系统
  • 【计算复杂性理论】证明复杂性(三):弗雷格(Frege)与扩展弗雷格(Extended Frege)证明系统
  • 【计算复杂性理论】证明复杂性(四):相继式演算(Sequent Calculus)
  • 【计算复杂性理论】证明复杂性(五):量化命题演算(Quantified Propositional Calculus)
  • 【计算复杂性理论】证明复杂性(六):其他证明系统简介
  • 【计算复杂性理论】证明复杂性(七):有界算术(Bounded Arithmetic)与IΔ₀理论
  • 【计算复杂性理论】证明复杂性(八):命题鸽巢原理(Propositional Pigeonhole Principle)的指数级归结下界

文章目录

  • 一、整体框架
  • 二、宽子句消除
    • 1. 关键赋值(Critical Truth Assignments)、关于关键赋值的等价性和可靠性
    • 2. 消去否定连接词
    • 3. 宽子句的定义
    • 4. 消除宽子句
  • 三、宽度下界
  • 四、总结
  • 五、可以不消去否定连接词吗?
  • 六、关于深度受限弗雷格系统的指数级下界

看完上期文章的小伙伴们恐怕都觉得:这么长的证明,谁能看懂啊?确实,那篇文章是证明这个下界的第一篇文章,其方法的确很繁杂。不过,这个问题有很简短(其实可能也不算简短,但比上一个要简短的)的证明。这个证明出自Paul Beame和Toniann Pitassi 1996年的论文Simplified and Improved Resolution Lower Bounds,他也被收录进了《计算复杂性:现代方法》中。它给出的证明步数下界, Ω ( 2 n 20 ) \Omega\left(2^{\frac{n}{20}}\right) Ω(220n),比Haken的论文还要好。

对于鸽巢原理等术语的定义,请参阅往期文章。

一、整体框架

首先我们定义一个概念:关键赋值(和上期文章的定义一样),就是舍弃一只鸽子、为其他所有鸽子安排好住处的赋值。还是一样,设 n n n为鸽子的个数, n − 1 n-1 n1为巢的个数,共有 n ( n − 1 ) n(n-1) n(n1)个变量,关键赋值使得其中 n − 1 n-1 n1个变量为 1 1 1,其余变量都为 0 0 0。我们将会在关键赋值上讨论问题。

我们将会重点关系证明的宽度,也就是证明中一个子句最多包含了多少个文字。对于一个证明,我们想办法把它的宽子句都消除,具体方法是找到一个能消除宽子句最多的文字使其赋值为 1 1 1,就可以成比例地消除宽子句,消除之多 O ( log ⁡ S ) O(\log S) O(logS)次后就没有宽子句了( S S S是证明的步数,它大于等于宽子句的个数)。如果 S S S很小的话,消除的步数很少, n n n就没有消掉多少,只消了一部分,这样我们最后就得到了一个对 P H P n ′ n ′ − 1 \mathrm{PHP}_{n'}^{n'-1} PHPnn1的窄证明( n ′ n' n是消除了这么多次之后还剩多少个鸽子)。随后我们还会论证,窄证明根本证明不了 P H P n ′ n ′ − 1 \mathrm{PHP}_{n'}^{n'-1} PHPnn1,产生矛盾,这就说明宽子句有指数个,进而说明 S S S是指数级的。

接下来我们会严谨的论述上面的证明过程。

二、宽子句消除

首先我们明确一下我们有 n ( n − 1 ) n(n-1) n(n1)个变量 P i j ( i = 1 , 2 , ⋯ , n ; j = 1 , 2 , ⋯ , n − 1 ) P_{ij}\ (i=1,2,\cdots,n;j=1,2,\cdots,n-1) Pij (i=1,2,,n;j=1,2,,n1),表示是否给第 i i i个鸽子安排第 j j j个巢。

1. 关键赋值(Critical Truth Assignments)、关于关键赋值的等价性和可靠性

一个对 { P i j ∣ i = 1 , 2 , ⋯ , n ; j = 1 , 2 , ⋯ , n − 1 } \{P_{ij}|i=1,2,\cdots,n;j=1,2,\cdots,n-1\} {Piji=1,2,,n;j=1,2,,n1}的赋值是关键赋值,就是说它定义了 n − 1 n-1 n1只鸽子到 n − 1 n-1 n1个巢的一一映射。

如图,这种分配方式就是一个关键赋值,其中变量 P 12 , P 31 , P 43 P_{12},P_{31},P_{43} P12,P31,P43为真,其余变量为假。在一个关键赋值中,如果第 i i i只鸽子是无家可归的,我们就称它是一个“落下 i i i的赋值”(原文是i-critical,不过我这里翻译得更形象了一些)

我们接下来的语境都是在关键赋值上说的。我们定义两个子句 c 1 , c 2 c_1,c_2 c1,c2关于关键赋值等价为:对于任何关键赋值 α \alpha α c 1 c_1 c1 α \alpha α上的值都等于 c 2 c_2 c2 α \alpha α上的值。两个并不完全等价的子句可能关于关键赋值等价。同样,我们还有推理关于关键赋值可靠的定义:两个子句 c 1 , c 2 c_1,c_2 c1,c2推出 c 3 c_3 c3的这步推理关于关键赋值可靠,就是说对于每个使 c 1 = c 2 = 1 c_1=c_2=1 c1=c2=1的关键赋值也使 c 3 = 1 c_3=1 c3=1

2. 消去否定连接词

接下来我们会利用关于关键赋值等价这个概念。我们知道, P H P n n − 1 \mathrm{PHP}_n^{n-1} PHPnn1里含有很多形如 ¬ P i k ∨ ¬ P j k \neg P_{ik}\lor\neg P_{jk} ¬Pik¬Pjk的子句,我们想把 ¬ \neg ¬消掉(这一步不是关键步骤,不过会使我们的证明更简洁)。我们接下来证明这样一个事实:

引理1 P i k ‾ = P 1 k ∨ P 2 k ∨ ⋯ ∨ P i − 1 , k ∨ P i + 1 , k ∨ ⋯ ∨ P n k \overline{P_{ik}}=P_{1k}\lor P_{2k}\lor\cdots\lor P_{i-1,k}\lor P_{i+1,k}\lor\cdots\lor P_{nk} Pik=P1kP2kPi1,kPi+1,kPnk。则 ¬ P i k \neg P_{ik} ¬Pik P i k ‾ \overline{P_{ik}} Pik关于关键赋值等价。

证明:核心的东西就是注意到关键赋值是一个一一映射,第 k k k个巢一定是住了鸽子的;要么第 i i i只鸽子占据该巢,要么其他某个鸽子占据该巢。

  • 如果 P i k = 1 P_{ik}=1 Pik=1,即 ¬ P i k = 0 \neg P_{ik}=0 ¬Pik=0,则鸽子 i i i占据了巢 k k k,那么其他鸽子都不能占据巢 k k k,即 ¬ P 1 k ∧ ¬ P 2 k ∧ ⋯ ∧ ¬ P i − 1 , k ∧ ¬ P i + 1 , k ∧ ⋯ ∧ ¬ P n k \neg P_{1k}\land\neg P_{2k}\land\cdots\land\neg P_{i-1,k}\land\neg P_{i+1,k}\land\cdots\land\neg P_{nk} ¬P1k¬P2k¬Pi1,k¬Pi+1,k¬Pnk成立;
  • 如果 P i k = 0 P_{ik}=0 Pik=0,即 ¬ P i k = 1 \neg P_{ik}=1 ¬Pik=1,则鸽子 i i i没有占据巢 k k k,那么一定有其他某个鸽子占据了巢 k k k,即 P 1 k ∨ P 2 k ∨ ⋯ ∨ P i − 1 , k ∨ P i + 1 , k ∨ ⋯ ∨ P n k P_{1k}\lor P_{2k}\lor\cdots\lor P_{i-1,k}\lor P_{i+1,k}\lor\cdots\lor P_{nk} P1kP2kPi1,kPi+1,kPnk成立。∎

所以我们就把每个 ¬ P i k \neg P_{ik} ¬Pik转化为了一个不含 ¬ \neg ¬的子句 P i k ‾ \overline{P_{ik}} Pik。我们不仅要处理掉原 P H P n n − 1 \mathrm{PHP}_n^{n-1} PHPnn1公式中的 ¬ \neg ¬,还要处理推理过程中的 ¬ \neg ¬。每一步归结 a ∨ b , ¬ a ∨ c ⟹ b ∨ c a\lor b,\neg a\lor c\implies b\lor c ab,¬acbc现在变成了 a ∨ b , a ‾ ∨ c ⟹ b ∨ c a\lor b,\overline a\lor c\implies b\lor c ab,acbc这列推理是关于关键赋值可靠的,可以这么理解:在关键赋值下, a a a a ‾ \overline a a中有且仅有一个成立; a ∨ b a\lor b ab就是说若 a ‾ \overline a a成立,则 b b b成立; a ‾ ∨ c \overline a\lor c ac就是说如果 a a a成立,则 c c c成立。因此 b b b c c c必至少有一个成立。

处理完之后,我们证明就不含任何否定连接词了。

3. 宽子句的定义

定义宽子句为含有至少 n 2 10 \cfrac{n^2}{10} 10n2个文字(即变量)的子句,也就是包含了至少总变量个数的(大约) 1 10 \cfrac{1}{10} 101的子句。例如,当 n = 5 n=5 n=5时,子句 P 12 ∨ P 13 ∨ P 14 P_{12}\lor P_{13}\lor P_{14} P12P13P14就是包含了 3 > 5 2 10 3>\cfrac{5^2}{10} 3>1052个变量的宽子句。为什么选择分母为 10 10 10呢?我们待会会看到其原因。

4. 消除宽子句

回忆我们在整体框架中提到的,我们采用反证法,先假设证明步数 S < 2 n 20 S<2^{\frac{n}{20}} S<220n,然后推出矛盾。设宽子句的个数为 W W W。注意,每个宽子句包含了至少 n 2 10 \cfrac{n^2}{10} 10n2个变量,而一个子句只包含了一个变量,所以这 W W W个宽子句一共有 W n 2 10 W\cfrac{n^2}{10} W10n2个变量。而变量总共只有 n ( n − 1 ) n(n-1) n(n1)个,所以其中一个变量(设为 P i j P_{ij} Pij)一定在超过 W 10 \cfrac{W}{10} 10W个宽子句中出现了(否则,如果所有变量都只在不超过 W 10 \cfrac{W}{10} 10W个宽子句中出现,则它们的出现次数加起来至多为 W 10 n ( n − 1 ) < W n 2 10 \cfrac{W}{10}n(n-1)<W\cfrac{n^2}{10} 10Wn(n1)<W10n2)。那么,如果在证明的所以步数中令 P i j = 1 P_{ij}=1 Pij=1,就可以消去所有含 P i j P_{ij} Pij的子句,也就是消除了至少 W 10 \cfrac{W}{10} 10W个宽子句。换言之,我们让宽子句的数量减少了 1 10 \cfrac{1}{10} 101。这一步也相当于是将第 i i i只鸽子与第 j j j个巢配对了。当然,不要忘记,我们是在关键赋值下讨论问题的,所以我们还要让其他所有的 P i l ( l ≠ j ) P_{il}\ (l\ne j) Pil (l=j) P u j ( u ≠ i ) P_{uj}\ (u\ne i) Puj (u=i)等于 0 0 0,这样才能让鸽子 i i i不与另一个巢配对、且其他鸽子也不能与第 j j j个巢配对了。至此,变量还剩下 ( n − 1 ) ( n − 2 ) (n-1)(n-2) (n1)(n2)个,证明被转化为了“除第 i i i只外的其他 n − 1 n-1 n1只鸽子不能与除第 j j j个以外的其他 n − 2 n-2 n2个巢配对”,即我们得到了一个 P H P n − 1 n − 2 \mathrm{PHP}_{n-1}^{n-2} PHPn1n2的证明。

以此类推,如法炮制,每增加一个新的配对就可以让宽子句的个数减少至少 1 10 \cfrac{1}{10} 101,最多只需要 log ⁡ 10 9 W \log_{\frac{10}{9}} W log910W次宽子句就消完了。

此时,我们得到的是一个对于 P H P n ′ n ′ − 1 \mathrm{PHP}_{n'}^{n'-1} PHPnn1的证明,其中 n − n ′ n-n' nn就是确定配对的个数,所以 n − n ′ ≤ log ⁡ 10 9 W n-n'\le \log_{\frac{10}{9}} W nnlog910W n ′ ≥ n − log ⁡ 10 9 W ≥ n − log ⁡ 10 9 S > n − log ⁡ 10 9 2 n 20 = ( 1 − 1 20 log ⁡ 10 9 2 ) n ≈ 0.67106 n n'\ge n-\log_{\frac{10}{9}} W\ge n-\log_{\frac{10}{9}} S>n-\log_{\frac{10}{9}} 2^{\frac{n}{20}}=\left(1-\frac{1}{20}\log_{\frac{10}{9}} 2\right)n\approx 0.67106 n nnlog910Wnlog910S>nlog910220n=(1201log9102)n0.67106n也就是说,我们证明了:如果 S < 2 n 20 S<2^{\frac{n}{20}} S<220n,则存在一个对 P H P n ′ n ′ − 1 \mathrm{PHP}_{n'}^{n'-1} PHPnn1的不含宽子句的证明。接下来,我们将证明一个引理与这个结论矛盾。

三、宽度下界

引理2 任何对于 P H P n n − 1 \mathrm{PHP}_{n}^{n-1} PHPnn1的归结证明都存在一个宽度至少为 2 9 n 2 \cfrac{2}{9}n^2 92n2的子句。

证明
(1) 子句的复杂性 H H H是一个子句集,定义 H H H对于所有关键赋值蕴含子句 C C C为:所有满足 H H H中全部子句的关键赋值 α \alpha α都能满足 C C C。设 C C C的复杂度 complexity ⁡ ( C ) \operatorname{complexity}(C) complexity(C)为:在 P H P n n − 1 \mathrm{PHP}_n^{n-1} PHPnn1的所有子句中能蕴含 C C C的最少子句个数。有些结论是一个子句蕴含不了的,需要多各子句蕴含,比如我们用 a ∨ b a\lor b ab ¬ a ∨ c \neg a\lor c ¬ac推出 b ∨ c b\lor c bc a ∨ b a\lor b ab一个子句是蕴含不了 b ∨ c b\lor c bc的,需要配合 ¬ a ∨ c \neg a\lor c ¬ac才能蕴含出来,因此 b ∨ c b\lor c bc的复杂性至少是 2 2 2

对于关键赋值而言,前提中描述两只鸽子不能飞进同一个巢的子句是自动被满足的,所以我们只考虑描述一只鸽子必须至少占一个巢的子句(称为“鸽子有家子句”)。每个“鸽子有家子句”的复杂度为 1 1 1(因为它自己就可以蕴含自己),证明中最后一个子句 0 0 0的复杂度为 n n n(前提一个都不能少)。那么归结能干什么呢?设子句 C 1 , C 2 C_1,C_2 C1,C2被归结成 C 3 C_3 C3 C i C_i Ci是由包含一些“鸽子有家子句”的初始子句集 T ( C i ) T(C_i) T(Ci)蕴含得来的,则 T ( C 3 ) = T ( C 1 ) ∪ T ( C 2 ) T(C_3)=T(C_1)\cup T(C_2) T(C3)=T(C1)T(C2) complexity ⁡ ( C 3 ) = ∣ T ( C 3 ) ∣ ≤ complexity ⁡ ( C 1 ) + complexity ⁡ ( C 2 ) \operatorname{complexity}(C_3)=|T(C_3)|\le\operatorname{complexity}(C_1)+\operatorname{complexity}(C_2) complexity(C3)=T(C3)complexity(C1)+complexity(C2)

我们断言:证明过程中一定存在一个“中等”复杂度子句,其复杂度介于 1 3 n \cfrac{1}{3}n 31n 2 3 n \cfrac{2}{3}n 32n之间。原因在于,我们从复杂度为 n n n 0 0 0子句开始向上回溯,每次选择那个复杂度较大的前提,则我们观察的子句的复杂度在一点一点地减少(可能不变,但因为“鸽子有家子句”的复杂度为 1 1 1所以一定有一些时刻是减少的)。我们要证明其复杂度不可能一下子从 > 2 3 n >\cfrac{2}{3}n >32n跳到 < 1 3 n <\cfrac{1}{3}n <31n。因为如果这种情况存在,设复杂度 > 2 3 n >\cfrac{2}{3}n >32n的子句为 L L L,其复杂度较高、较低的前提分别为 J , K J,K J,K,因为 J J J的复杂度 < 1 3 n <\cfrac{1}{3}n <31n所以 K K K的复杂度也 < 1 3 n <\cfrac{1}{3}n <31n;这与绿色不等式矛盾。这样我们就证明了“中等”复杂度的子句的存在性。

(2) 中等复杂度子句一定含有很多个变量 C C C是那个中等复杂度子句, H H H是能蕴含 C C C的最小的“鸽子有家子句”的集合, ∣ H ∣ = m |H|=m H=m。我们将证明 C C C至少有 ( n − m ) m ≥ 2 9 n 2 (n-m)m\ge\cfrac{2}{9}n^2 (nm)m92n2个变量。这个不等式成立的原因是一个二次函数极值问题,可以用下图简要地理解。

证明一个子句中含有某个变量的方法就是证明该变量的赋值发生改变可以改变该子句的赋值。

注意到不满足子句 Q i Q_i Qi=“第 i i i只鸽子必须飞进某个巢”的关键赋值就是“落下 i i i的赋值”。因为 H H H是“鸽子有家子句”的集合,所以 H H H包含了一些 Q i Q_i Qi。任选一个 i i i使得 Q i ∈ H Q_i\in H QiH。我们断言:存在一个“落下 i i i的赋值” β \beta β不仅不满足 Q i Q_i Qi,还不满足 C C C。这是因为如果所有“落下 i i i的赋值”都满足 C C C,那么 Q i Q_i Qi就可以从 H H H中移除了,这与 H H H的最小性矛盾。你问我为什么 Q i Q_i Qi可以从 H H H中移除?设 H ∖ { Q i } H\setminus\{Q_i\} H{Qi}的合取为 R R R,我们有 R ∧ Q i → C R\land Q_i\to C RQiC,即 ∀ \forall 关键赋值 α \alpha α,若 α \alpha α同时满足 R R R Q i Q_i Qi α \alpha α满足 C C C。现在又有: ∀ \forall 关键赋值 α \alpha α,若 α \alpha α不满足 Q i Q_i Qi α \alpha α满足 C C C,这也意味着满足 R R R且不满足 Q i Q_i Qi α \alpha α都满足 C C C。结合起来就得到 α \alpha α只要满足 R R R就可以满足 C C C,即 R → C R\to C RC因为 β \beta β是关键赋值,所以 β \beta β一定给除了 i i i以外的每只鸽子 j j j都单独安排了住处。现在任取鸽子 j j j使得 j ∉ H j\notin H j/H,把 β \beta β j j j的住处分配给 i i i,我们就得到了一个与 β \beta β只有一些细微差别的“落下 j j j的赋值” β ′ \beta' β β ′ \beta' β满足所有 H H H中的子句,因为这些子句描述的鸽子都有住处,没住处的鸽子对应的“鸽子有家子句”在 H H H外面。设 β \beta β给鸽子 j j j分配的巢是 l l l,则 β \beta β β ′ \beta' β的差别在于两个地方: β \beta β P j l P_{jl} Pjl分配 1 1 1 β ′ \beta' β分配 0 0 0 β \beta β P i l P_{il} Pil分配 0 0 0 β ′ \beta' β分配 1 1 1。由于 C C C是一个不含否定连接词的子句,如果 C C C不含 P i l P_{il} Pil P j l P_{jl} Pjl 1 1 1 0 0 0不可能让 C C C 0 0 0 1 1 1;因此 C C C一定含 P i l P_{il} Pil。让 i i i取遍 H H H中“鸽子有家子句”描述的鸽子,让 j j j取遍所有与 H H H无关的鸽子并让 l l l β \beta β j j j分配的住处,则这样的 P i l P_{il} Pil共有 m ( n − m ) m(n-m) m(nm)个,即 C C C的宽度至少为 m ( n − m ) ≥ 2 9 n 2 m(n-m)\ge\cfrac{2}{9}n^2 m(nm)92n2。∎

回顾第二节结束时我们提到的:如果 S < 2 n 20 S<2^{\frac{n}{20}} S<220n,则存在一个对 P H P n ′ n ′ − 1 \mathrm{PHP}_{n'}^{n'-1} PHPnn1的不含宽子句的证明,其中 n ′ ≥ 0.67106 n n'\ge 0.67106n n0.67106n。而引理 2 2 2意味着对 P H P n ′ n ′ − 1 \mathrm{PHP}_{n'}^{n'-1} PHPnn1的任何一个归结证明都包含了一个宽度至少为 2 9 n ′ 2 = 0.10007 n > 1 10 n 2 \cfrac{2}{9}n'^2=0.10007n>\cfrac{1}{10}n^2 92n′2=0.10007n>101n2的子句,与证明不含宽子句矛盾,因此 S ≥ 2 n 20 S\ge 2^{\frac{n}{20}} S220n。证毕。

四、总结

最后,我们就证明了:

定理 对于充分大的 n n n,任何对 P H P n n − 1 \mathrm{PHP}_n^{n-1} PHPnn1的归结证明的大小都至少为 2 n 20 2^{\frac{n}{20}} 220n

这里我还想提一句:为什么把宽子句定义为包含了至少 n 2 10 \cfrac{n^2}{10} 10n2个变量?为什么分母是 10 10 10而不是 9 9 9 11 11 11?以及 2 n 20 2^{\frac{n}{20}} 220n是最好上界吗?首先我们需要知道:引理2的 2 9 n 2 \cfrac{2}{9}n^2 92n2已经是最优的结果了,根据二次函数的性质, m n \cfrac{m}{n} nm的上界是下界的两倍时只有它们关于 1 2 \cfrac{1}{2} 21对称才能让 min ⁡ ( n − m ) m \min (n-m)m min(nm)m最大;此时上下界分别为 1 3 \cfrac{1}{3} 31 2 3 \cfrac{2}{3} 32 min ⁡ ( n − m ) m = 2 9 n 2 \min (n-m)m=\cfrac{2}{9}n^2 min(nm)m=92n2。我们再设我们能得到的最好上界为 2 x n 2^{xn} 2xn,宽子句的定义是含有至少 μ n 2 \mu n^2 μn2个变量的子句,那么 n ′ n' n的计算公式为 n ′ ≥ ( 1 − x log ⁡ 1 1 − μ 2 ) n n'\ge(1-x\log_{\frac{1}{1-\mu}} 2)n n(1xlog1μ12)n而引理2意味着对 P H P n ′ n ′ − 1 \mathrm{PHP}_{n'}^{n'-1} PHPnn1的任何一个归结证明都包含了一个宽度至少为 2 9 n ′ 2 \cfrac{2}{9}n'^2 92n′2的子句,我们要控制 2 9 n ′ 2 ≥ μ n 2 \cfrac{2}{9}n'^2\ge\mu n^2 92n′2μn2,同时使 x x x最大。即 max ⁡ x , s.t.  ∃ μ , 2 9 ( 1 − x log ⁡ 1 1 − μ 2 ) 2 ≥ μ \max x,\text{ s.t. }\exists\mu,\ \cfrac{2}{9}(1-x\log_{\frac{1}{1-\mu}} 2)^2\ge\mu maxx, s.t. μ, 92(1xlog1μ12)2μ这个问题非常奇怪,我算出来 x x x可以高达 0.278 0.278 0.278左右,不过 1 20 \cfrac{1}{20} 201的确是一个解,有兴趣的童鞋们可以自己算一下~

五、可以不消去否定连接词吗?

可以,方法详见Eli Ben-Sasson和Avi Wigderson与1999年发表的论文Short Proofs Are Narrow - Resolution Made Simple的第 5 5 5节与第 6.2 6.2 6.2节。

六、关于深度受限弗雷格系统的指数级下界

证明深度不超过 d d d的弗雷格系统下界的方法大概是:假设证明的步数不超过一个预定值 S S S,对整个弗雷格证明施加随即约束,证明有很大的概率深度会减少 1 1 1,但问题的复杂度并没有太大的变化。施加 d − 2 d-2 d2次后,证明的深度变为 2 2 2(也就是变成了一个带弱化规则的归结证明),其步数并没有发生显著变化,也就意味着用 S S S步归结就可以证明一个 n n n相当大的 P H P \mathrm{PHP} PHP,然后再用这篇文章的内容反驳这一点即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/504765.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

什么是VR数字文化遗产保护|元宇宙文旅

VR数字文化遗产保护是指利用虚拟现实&#xff08;VR&#xff09;技术来保护和传承文化遗产。在数字化时代&#xff0c;许多珍贵的文化遗产面临着自然衰退、人为破坏或其他因素造成的威胁。通过应用VR技术&#xff0c;可以以全新的方式记录、保存和展示文化遗产&#xff0c;从而…

鸿蒙Harmony应用开发—ArkTS声明式开发(通用属性:栅格设置)

说明&#xff1a; 从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 栅格布局的列宽、列间距由距离最近的GridContainer父组件决定。使用栅格属性的组件树上至少需要有1个GridContainer容器组件。 gridSpan、gridOffset属性…

Python列表中添加删除元素不走弯路

1.append() 向列表中添加单个元素&#xff0c;一般用于尾部追加 list1 ["香妃", "乾隆", "贾南风", "赵飞燕", "汉武帝"]list1.append("周瑜") print(list1) # [香妃, 乾隆, 贾南风, 赵飞燕, 汉武帝, 周瑜]…

猫头虎分享已解决Bug || AttributeError: ‘str‘ object has no attribute ‘decode‘

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

Vue3_2024_1天【Vue3创建和响应式,对比Vue2】

前言&#xff1a; Vue3对比Vue2版本&#xff0c;它在性能、功能、易用性和可维护性方面都有显著的提升和改进。 性能优化&#xff1a;模板编译器的优化、对Proxy的支持以及使用了更加高效的Virtual DOM算法等。这使得Vue3的打包大小减少了41%&#xff0c;初次渲染提速55%&#…

SSH教程

ssh 是远程连接的利器, 可以说凡是涉及到 linux 服务器, ssh 就是一个绕不开的话题. 本文作为一个教程, 尽可能详细的帮助读者设置 ssh, 并给出一些常用的 ssh 配置方法 (主要用于 linux 系统的远程登录和文件传输). 1. 简介 ssh 分为两个部分, sshd 服务端和 ssh 客户端. ssh…

ROS2从入门到精通:理论与实战

ROS是什么&#xff1f; 随着人工智能技术的飞速发展与进步&#xff0c;机器人的智能化已经成为现代机器人发展的终极目标。机器人发展的速度在不断提升&#xff0c;应用范围也在不断拓展&#xff0c;例如自动驾驶、移动机器人、操作机器人、信息机器人等。机器人系统是很多复杂…

mac 安装hbuilderx

下载 HBuilderX下载地址: 下载地址 选额mac版本点击下载 安装 如图&#xff0c;将HBuilderX拖到Applications&#xff0c;才是正确的安装姿势。 MacOSX&#xff0c;软件必须安装到/Applications目录&#xff0c;如未安装到此目录&#xff0c;可能会出现插件安装失败、项目创建…

【C++】类的转换函数

使用场景 C中当你创建了一个类&#xff0c;你想把这个类对象转换成基本类型的函数。类对象->基本类型对象 原理 如下实例&#xff0c;设计一个分数类&#xff0c;实现分数转换成double 浮点数的转换函数。并在mian函数隐式调用。 #include<iostream> class Fractio…

[Linux]如何理解kernel、shell、bash

文章目录 概念总览kernelshell&bash 概念总览 内核(kernel) &#xff0c;外壳(shell) &#xff0c;bash kernel kernel是指操作系统中的核心部分&#xff0c;用户一般是不能直接使用kernel的。它主要负责管理硬件资源和提供系统服务&#xff0c;如内存管理、进程管理、文件…

跨域的出现以及解决

1,跨域的产生 跨域&#xff1a; 指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的&#xff0c;是 浏览器对 javascript 施加的安全限制 。 • 同源策略 &#xff1a;是指协议&#xff0c;域名&#xff0c;端口都要相同&#xff0c;其中有一个不同都会产生…

【真机Bug】异步加载资源未完成访问单例导致资源创建失败

1.错误表现描述 抽卡时&#xff0c;10抽展示界面为A。抽取内容可能是整卡或者碎片&#xff0c;抽到整卡&#xff0c;会有立绘展示和点击详情的按钮。点击详情后出现详情页B。【此时界面A预制体被销毁&#xff0c;卡片数据进入数据缓存池】点击页面B的返回按钮&#xff0c;单例…