“密码算法处理字节串,而应用处理“版本、身份、消息类型”等有意义的字段。先固定一个合法元组集合 $D$,定义编码 $E:D\to{0,1}^ $ 和从字节串到合法元组的部分解析函数 $P$;$…”
形式陈述
设
直觉
部分函数的相等同时比较定义域和取值。设
部分函数把“输入没有对应输出”纳入定义本身,而不是额外发明一个普通值,适合描述尚未终止、前置条件不满足或搜索失败的程序,只接受部分输入的解析器,以及未必存在的代数运算。它与返回 null 的全函数不同:null 仍是陪域中的一个值,而部分函数在该点根本没有函数值。把定义域显式写成
例子与边界
实数上的
列表取首元素函数 None,就得到一个不同的全函数;这说明“未定义”与“返回失败值”是两种建模选择。
复合时必须检查中间结果。令
部分函数仍要求每个定义域内输入最多对应一个输出;一个输入可产生两个或更多合法结果的是关系或多值函数,不能仅靠“部分”二字表达。把未定义点随意补成默认值会改变等式、复合与可计算性问题,必须明确这种全化选择。
推论与应用
函数 的通常定义可视为定义域等于整个源集合的特例,部分函数则常与 关系 区分使用,并由此连接函数论、可计算性与程序语义。在可计算性中,部分可计算函数 用不终止或“发散”表示未定义,连接到可识别语言;偏代数用它表达只在满足前提时存在的运算,数据库与 API 规范也借它区分缺失、失败和正常值,而程序语义可用它刻画可能发散的程序含义。
参考资料
- Andrew M. Pitts, Lecture Notes on Computation Theory, University of Cambridge, 2011 修订版,Lecture 2,幻灯片 28–31(PDF 第 20–22 页):部分函数的关系定义、全函数条件与寄存器机可计算性。