Skip to content

定义Definition

部分函数

施工中 · 内容逐步修订

Partial function

在声明的源集合的一部分上赋值,实际定义域由已有函数值的输入组成。

形式陈述 ​

设 A,B 为集合。部分函数 f:A⇀B 的数据包括声明的源集 A、陪域 B、实际定义域 dom(f)⊆A,以及一个普通函数 dom(f)→B。等价地,它是从 A 到 B 的有类型二元关系,其图 Gf⊆A×B 满足每个 a∈A 至多对应一个 b∈B。当 dom(f)=A 时它就是全函数。若 f:A⇀B、g:B⇀C,则按复合规则,g∘f 只在那些 a∈dom(f) 且 f(a)∈dom(g) 的点上有定义。

直觉

部分函数的相等同时比较定义域和取值。设 f,g:A⇀B,只有当 dom(f)=dom(g),且在这个共同域上逐点相等,才写 f=g。如果只要求双方都有值的地方相同,处处无定义的函数就会与任意函数“相同”,显然丢掉了大部分语义。

部分函数把“输入没有对应输出”纳入定义本身,而不是额外发明一个普通值,适合描述尚未终止、前置条件不满足或搜索失败的程序,只接受部分输入的解析器,以及未必存在的代数运算。它与返回 null 的全函数不同:null 仍是陪域中的一个值,而部分函数在该点根本没有函数值。把定义域显式写成 D⊆X,可以分离“计算结果是什么”和“哪些输入上有结果”两个问题。

例子与边界

实数上的 x↦1/x 可视为 R⇀R,定义域为 R∖{0};数组查找也可建模为从键到元素的部分函数。把未定义统一编码为 ⊥ 可得到 A→B∪{⊥},但只有在 ⊥ 不与合法输出混淆并保留相应语义时才等价。

列表取首元素函数 head 只在非空列表上有值:head([a1,…,an])=a1,但 head([]) 未定义。若把返回类型改为 option 并令空列表返回 None,就得到一个不同的全函数;这说明“未定义”与“返回失败值”是两种建模选择。

复合时必须检查中间结果。令 f(x)=1/x,g(y)=y,均视为实数到实数的部分函数,则 g∘f 的定义域是 x>0:x=0 在第一步失败,x<0 虽通过第一步,却不在 g 的定义域。这个例子中,复合定义域恰好也等于两个原定义域的交;一般情况却不能这样取交,因为第二项条件作用于 f(x),不是原输入 x。例如改取 f(x)=x−1、g(y)=y,仍声明源集与陪域为实数,则 dom(f)=R、dom(g)=[0,∞),而 dom(g∘f)=[1,∞)。直接取原定义域的交会错误地得到 [0,∞);其中 x=0 通过第一步后变成 −1,无法再取实平方根。

部分函数仍要求每个定义域内输入最多对应一个输出;一个输入可产生两个或更多合法结果的是关系或多值函数,不能仅靠“部分”二字表达。把未定义点随意补成默认值会改变等式、复合与可计算性问题,必须明确这种全化选择。

推论与应用

函数 的通常定义可视为定义域等于整个源集合的特例,部分函数则常与 关系 区分使用,并由此连接函数论、可计算性与程序语义。在可计算性中,部分可计算函数 用不终止或“发散”表示未定义,连接到可识别语言;偏代数用它表达只在满足前提时存在的运算,数据库与 API 规范也借它区分缺失、失败和正常值,而程序语义可用它刻画可能发散的程序含义。

参考资料
  • Andrew M. Pitts, Lecture Notes on Computation Theory, University of Cambridge, 2011 修订版,Lecture 2,幻灯片 28–31(PDF 第 20–22 页):部分函数的关系定义、全函数条件与寄存器机可计算性。
关系图谱64 个相邻概念 · 4 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组
分类位置
类型化关系

使用的工具

并列辨析