形式语义02 Math

1 minute read

Published:

\newcommand\norm[1]{\left\lVert#1\right\rVert} \newcommand\abs[1]{\left\lvert#1\right\rvert}

Basic Set Theory

没啥好讲的

$\bigcap S=\left{\;x\;\; \forall T\in S,x\in T \;\right}$

记 $R=\bigcap\emptyset$,则 $\forall x. \forall T\in\emptyset\wedge x\in T\rightarrow x\in R$

注意到命题的前件为假,因此 $R$ 是”a set of everything”

根据幂集公理这是不成立的,因此我们规定它无意义。

Relations

没啥好讲的

Functions

$f\subseteq D(f)\times R(f)$,且 $\forall x,y,y’$,$(x,y)\in f\wedge (x,y’)\in f\Rightarrow y=y’$

Total Functions $f$ on $A\times B$

$A=D(f)$

Partial Functions $f$ on $A\times B$

$D(f)\subseteq A$

$\lambda$-Expression

$\lambda x\in D. f(x)$ 和 $\left{\;(x,f(x))\;\;x\in D\;\right}$ 是等价的

Function Variant

我们用 $f\left{x\leadsto y\right}$ 记号表示 $f\cup (x,y)$ 这个新的函数,此处的 $x\in D(f)$ 不一定成立

显然 $D(f\left{x\leadsto y\right})=D(f)\cup\left{\;x\;\right}$

Function Type

我们用 $A\rightarrow B$ 表示 $A\mapsto B$ 的所有函数,且规定 $\rightarrow$ 右结合

即 $A\rightarrow B\rightarrow C=A\rightarrow (B\rightarrow C)$ ,表明这是一个 $A\times B\mapsto C$ 的函数,或者 $A\mapsto (B\mapsto C)$ 的函数

这里给出的 Function Type 默认是对应集合的 Total Function.

很显然 $A_1\mapsto A_2\mapsto \cdots\mapsto A_n\mapsto R$ 的表达能力要强于 $A_1\times A_2\times\cdots\times A_n\mapsto R$,即我们可以先后给出参数

表达能力的弱化无需额外做什么,而强化则需要currying操作

Tuples as Functions

二元组 $(x,y),\, x,y\in D$ 可以看成是 $\left{\;0,1\;\right}\mapsto D$ 的一个函数,即 $f(0)=x,f(1)=y$,$D\times D$ 就可以看成是 $\left{\;0,1\;\right}\mapsto D$ 的所有函数

形式化地写出来就是 $A\times B=\left{\;f\;|\;D(f)=\left{\;0,1\;\right}\wedge f(0)\in A\wedge f(1)\in B\;\right}$

于是自然,$A_0\times A_1\times\cdots\times A_{n-1}$ 就可以看成是 $\left{\;0,1,2\ldots n-1\;\right}\mapsto D$ 的所有函数,其中 $D=\bigcup\limits_{i=0}^{n-1} A_i$

写出来就是 $\prod\limits_{i=0}^{n-1} A_i=\left{\;f\;|\;D(f)=[0..n-1]\wedge\forall i\in[0..n-1].f(i)\in A_i\;\right}$

再进一步就是 $\prod\limits_{i\in I}S_i=\left{\;f\;|\;D(f)=I\wedge\forall i\in I.f(i)\in S_i\;\right}$

Product of Functions

现在,我们令 $\theta: \alpha\mapsto \left{\;S_\alpha\;\right}$,即是以 $\alpha$ 为指标集的一个集合族,$\theta$ 将一个下标映射到集合族里对应下标的某个集合

我们同样可以定义 $\theta$ 上的乘积(product)

即 $\sqcap\theta=\left{\;f\;|\;D(f)=\alpha\wedge \forall x\in\alpha.f(x)\in\theta(x)\;\right}$,其中 $\alpha=D(\theta),\;\theta(x)=S_x$

当 $\theta$ 是常函数时,$\forall x. \theta(x)=S$,那么 $\sqcup\theta=\left{\;f\;|\;D(f)=\alpha\wedge\forall x\in\alpha. f(x)\in S\;\right}=\prod\limits_{i\in\alpha}S=S^\alpha=\left{\;f\;|\;f:\alpha\mapsto S\;\right}$

大概的意思是说,我们有一个定义域 $\alpha$ 到若干集合的映射 $\theta$,现在把每个 $\alpha$ 中的元素 $x$ 的像限制到 $\theta(x)$ 里的一个具体元素,就可以得到一个具体的 $D(\theta)\rightarrow \bigcup R(\theta)$ 函数。如果我们取遍所有可能的像,那么就恰好遍历完了所有这样的函数。

具体到程序设计语言,就是若干个 Type 经过这样的操作,就可以得到一个 Product Type. 即我们把一个 Type 看成是一个单点函数的集合,那么就可以通过简单的 Product 操作复合得到新的 Type.

Sum of Functions

对于任意集合 $A,B$,规定

$A+B=\left{\;0\;\right}\times A\cup\left{\;1\;\right}\times B$

称 $A+B$ 为 $A,B$ 的不交并。

自然就有 $\sum\limits_{i\in \alpha} S(i)=\left{\;(i,x)\;|\;i\in\alpha\wedge x\in S(i)\;\right}$

同样的,如果我们把 $\theta$ 看作是 $\alpha\rightarrow \bigcup\limits_{i\in\alpha}S(i)$,那么就有 $\Sigma\theta=\left{\;(i,x)\;|\;i\in\alpha\wedge x\in S(i)\;\right}$

当 $\theta$ 是常函数 $\theta(i)=S$ 的时候,$\Sigma\theta=\sum\limits_{x\in\alpha}S=\left{\;(x,y)\;|\;x\in\alpha\wedge y\in S\;\right}=\alpha\times S=\alpha\rightarrow S$

这个的意思是,我们可以通过若干 Type 得到 Sum Type,新的 Sum Type 中的变量只能是组成它的若干 Type 中的某一个。

感想

写着写着就突然悟了,注意到一个编程语言中的类型可以看成是值域 $R$ 构成的集合

而带类型的变量可以看成是单点函数的集合 $\left{\;f\;|\;f:\left{\;var\;\right}\rightarrow R\;\right}$,变量的一个具体取值则对应一个具体的单点函数。需要说明的是,我们这里不妨规定变量两两不重名(否则可以很容易用自然数命名而不改变程序的行为)

那么上面说的 Sum 和 Product 实际上就是通过简单类型构造出复杂类型的两类方法

而我们知道,一个程序的所有状态由所有变量的取值组成,那么一个程序的特定状态就可以表达成一个具体的函数 $P:\left{\;\;|\;x\text{ is variable}\;\right}$