多少是二?
- 2005年5月16日
- 安德烈·鲍尔
-
建构主义数学,逻辑,辅导的
在构造数学中,即使是非常小的集合也可能比在经典数学中更有趣。既然你不会相信我说的,至多有一个元素的集合是非常有趣的,那么让我们看看真值集合,它有“两个”元素。
A类真值由一个句子表示,例如`2+3=5`或`forall x in R exists n in n。x<n `。(回想一下,句子中没有自由参数;当我们允许自由参数时,我们说的是命题,所以“x^2+y^2=z^2”并且“在R中存在x。x^2=y`是命题,不是句子)。如果句子`p`和`q`在逻辑上等价,则表示相同的真值。所有真值的集合通常用“Omega”表示。
“Omega”有多少元素?常数`TT`和`_|_`分别表示真和假,是真值。所以我们在Omega中有`TT`,在Omega`中有`_|_。这是两个要素。在经典逻辑中,这是唯一的两个,我们的意思是Omega`中的每个“p”都等于“TT”或“_|_`”(因为“p”或“not p”)。然而,在建设性逻辑中,情况并非如此。但这并不意味着存在第三个真值,它与`TT`和`_|_`都不同!怎么会这样?为了正确地解释这一点,我们必须小心集合具有“两个元素”意味着什么:对于集合“a”,这样说:
- `A已经 强意义上的两个要素如果A`中有`x,y,那么`x!=y`和,对于A`中的所有`z,可以是`z=x`或`z=y`。
- `A`有 弱意义上的两个要素如果A`中有`x,y,那么`x!=而且,对于A`中的所有`z,`z`与`x`和`y`都不同的情况并非如此。
对于一个受过古典训练的人来说,拥有两种元素的两种感觉没有区别。然而,从计算上讲,两者存在差异:
- `如果我们可以计算A`中的`x和A`的`y,那么A`在强意义上有两个元素,即`x!=y`,并且有一个算法可以确定,给定A`中的任何`z,无论`z=x`还是`z=y`。
- `如果我们可以计算A`中的`x和A`中`y,那么A`在弱意义上有两个元素,即`x!=y`,A`中没有与`x`和`y`都不同的`z(但如果A`中的`z等于`x`或`y`,则可能没有判定它是否等于`y`的算法)。
显然,拥有强意义上的两个要素比拥有弱意义上的二个要素需要更多(决策程序)。在经典逻辑中,“Omega”有两个强意义的元素。在构造逻辑中,它有两个弱意义的元素,我们可以证明如下。取`x=TT`和`y=_|_`。给定欧米茄中的任何`z,我们必须证明`not(z!=x和z!=y)`,它在逻辑上等价于`not,(not z and not z)`,这是正确的(练习,请有人发布解决方案)。
这是否意味着建设性逻辑否认“Omega”有两个强烈意义上的元素?不,这让问题没有答案,因为构造逻辑与经典逻辑“向后兼容”。
你可能一直在想,‘Omega’和类型是一样的布尔
许多编程语言都有。事实并非如此。首先,除非你的编程语言非常有限,布尔
有__三个元素:真的
,假
和“未定义”,由发散表达式表示,如虽然真的做了;真的
但即使我们对udefined值进行折扣,布尔
只是“Omega”的子集,即可判定的真值,通常用`2`表示:
`2={欧米茄中的p;p或不是p}`。
`2`的元素是什么?由于`TT或not TT=TT或_|_=TT`和`_|_或not _|_=_|_或者TT=TT`,我们在2`中有`TT,在2`里有`_|_。如果给定任何“2中的p”,我们就知道“p或不p”。如果`p`那么`p=TT`,如果`not p`那么` p=_|_`。我们已经证明,`2`在强意义上有两个元素。
更令人困惑的是,还有一组经典的真值,
`Omega_c={p在Omega中;p iff不在p中}`。
它由那些满足“反证法”(矛盾证明)规则的真理值组成。
由于`not not TT=not_|_=TT`和`not _t|_=not TT=_|_`,我们可以在Omega_c`中看到`TT,在Omega _c`中可以看到`_|_。因此,我们有一个包含链
`2 sube Omega_c sube Ometa`。
有三个可能不同的集合,所有这些集合都有“两个元素”,这样安排似乎毫无用处,也不必要复杂。但实际上,这真的很有用。最小的`2`是数据类型布尔
我们都从编程中知道。中间的“Omega_c”是“结构逻辑中的经典逻辑”。所以,即使我们可能不接受经典逻辑,我们仍然可以使用它。最大的“Omega”很有用,因为它是一组真值。
你的大脑可能仍然会反对这一切。在古典数学中,`2=Omega_c=Omega `是故事的结尾。虽然你在学校里被教导过这种情况,但这并不是你个人所相信的,至少如果你是一名程序员的话。记住`2`是数据类型布尔
,假设`2=Omega`意味着“我们可以用真值进行计算”。如果真的是这样,我们应该能够编写程序来计算“Omega”上的基本逻辑操作,是吗?因此,逻辑析取、合取和否定通常很容易在典型的编程语言中用作操作。但我们不要忘记,“所有”和“存在”也是逻辑运算。为什么它们在典型的编程语言中不可用?如果您认为`2=Omega`是正确的,那么您应该能够编写一个程序,将布尔函数`f:NN->2`作为输入,并输出真值`forall n in n.f(n)`。你能做到吗?