《编程原本 》一2.1 变换

2.1 变换

虽然从任意一组类型到任意类型的函数都存在,但是有些具有特殊签名的函数类更为常用.本书中经常用的是两类函数:同源谓词和同源运算.同源谓词在形式上都是Tו••× T → bool;同源运算都是形如Tו••× T → T的函数.一般而言存在着任意的n元谓词和n元运算,但实际中遇到最多的还是一元和二元的同源谓词,一元和二元的同源运算.
谓词是返回真值的函数:

Predicate(P).FunctionalProcedure(P)∧Codomain(P)=bool

同源谓词也是同源函数:

HomogeneousPredicate(P).
Predicate(P)∧HomogeneousFunction(P)

一元谓词只有一个参数:

UnaryPredicate(P).Predicate(P)∧UnaryFunction(P)

运算是同源函数,其值域与作用域相同:

Operation(Op).HomogeneousFunction(Op)∧Codomain(Op)=Domain(Op)

下面是几个同源运算的实例:

int abs(int x) {
if (x < 0) return -x; else return x;
} //一元运算
double euclidean norm(double x, double y) {
return sqrt(x * x + y * y);
} //二元运算
double euclidean norm(double x, double y, double z) {
return sqrt(x * x + y * y + z * z);
} //三元运算

引理2.1euclidean_norm(x,y,z)=euclidean_norm(euclidean_norm(x,y),z)
这一引理说明上面的三元运算可以从相应的二元版本得到.但是,由于效率,表达方便,或者准确性等原因,这样的三元运算也可以纳入处理三维空间的程序的计算基.

如果一个过程的定义空间是其输入类型的直积的子集,就称该过程为部分的(partial);如果其定义空间等于其输入类型的直积,则说它是全的.按标准的

数学习惯,我们也认为部分过程包括全过程,并称那些不是全的部分过程为非全的(nontotal).由于计算机表示的有穷性,有些全函数在计算机里的实现却是非全的.例如,有符号的32位整数加法就是非全的.

一个非全过程需要有一个描述其定义空间的前条件.要验证对这个过程的一个调用是正确的,必须确定所给的实参满足这一前条件.有时我们会把部分过程作为参数传给一个算法,因此需要在运行时确定这种过程参数的定义空间问题.为了处理这类情况,我们将定义一个定义空间谓词(de.nitionspacepredicate),它与这一过程参数的输入相同,当且仅当实际输入在这个过程的定义空间里时,让这个谓词返回真.在调用一个非全过程之前,或者其前条件必须满足,或者该调用是用这个过程的定义空间谓词保护的.

练习2.1请为32位有符号整数的加法实现一个定义空间谓词.
本章研究一元运算,我们称其为变换(transformation):

Transformation(F).
Operation(F)
∧UnaryFunction(F)
∧DistanceType:TransformationInteger
→

这里的DistanceType将在下一节讨论.
变换可以自组合(selfcomposable),例如可以写f(x),f(f(x)),f(f(f(x))),等等.f(f(x))的定义空间是f的定义空间和结果空间的交.这种自组合能力和检查相等能力的结合,使我们可以定义许多有趣的算法.
设f是一个变换,它的幂(power)定义如下:

.
.x if n = 0, fn(x)=.
.fn.1(f(x))ifn>0
.

要实现计算fn(x)的算法,就要描述对一个整数类型的需求.第5章将研究描述与整数有关的一些概念,现在我们暂时依靠对整数的一些直观理解.有符号和无符号的整数类型都是整数的模型,还有任意精度的整数等,它们都包含下面的运算和文字量:
18 第2 章变换及其轨道

其中的I是一个整数类型.
这样就可以写出下面算法:

template requires(Transformation(F) && Integer(N)) Domain(F) power unary(Domain(F) x, N n, F f)
{
// 前条件: n . 0 ∧ (.i ∈ N) 0 while (n != N(0)) {n = n -N(1);x = f(x);
}
return x;
}

时间: 2024-10-07 13:54:03

《编程原本 》一2.1 变换的相关文章

《编程原本 》一第2章 变换及其轨道

第2章 变换及其轨道 本章把变换定义为从一个类型到它自身的规范函数.从一个初始值开始连续应用一个变换,就得到了这个值的轨道.我们要实现一个能确定轨道结构的算法,它只依赖于变换的规范性和轨道的有穷性.这个算法可以应用到不同的领域.例如,可以用它检查一个链接表是否为循环的,或用于分析一个伪随机数生成器.我们将为这一算法推导出一套接口,形式上是一集过程及其参数和结果的定义.对轨道结构算法的分析,使我们可以用最简单的方式介绍自己的编程方法.

《编程原本 》一第3章 可结合运算

第3章 可结合运算 本章讨论可结合的二元运算.可结合性使人可以重组相邻的运算,基于这种重组能力可以得到一个计算二元运算的幂的有效算法.规范性使我们可以用许多程序变换来优化这一算法.我们随后要利用该算法在对数时间里计算各种线性递归,例如计算斐波那契数.

《编程原本 》一3.1 可结合性

3.1 可结合性 二元运算是有两个参数的运算: 二元的加法和乘法是数学的核心概念,常用的这类东西很多,如求较小或较大的值,合取和析取,集合的交与并等.这些运算都是可结合的(associative): 当然,也存在不可结合的二元运算,例如除法和减法. 如果根据上下文完全可以看清所用的可结合二元运算op,我们常用隐式的乘法记法将其写成ab而不是op(a,b).由于可结合性,在涉及两次或多次应用op的表达式里不需要括号,因为所有分组方式都等价:((a0a1))an.1= •••••• =a0((an.

《编程原本 》一第1 章 基础

第1 章 基础 本章从相关思想的一个简洁分类开始介绍一些术语:值.对象.类型.过程和概念,它们表示了与计算机有关的许多不同的理念范畴.这里还要详细讨论本书的中心观点:规范性.对一个过程,规范性意味着它对相等的参数总返回相等的结果.对一个类型,规范性意味着它应该有相等运算符,以及保证相等关系的拷贝构造函数和赋值.规范性使我们能应用等值推理(使用等值替换)去变换和优化程序.

《编程原本 》一2.2 轨道

2.2 轨道 要理解一个变换的全局行为,可以考察其轨道(orbit)的结构.所谓变换的轨道,就是从一个开始元素出发,通过反复应用这一变换能到达的所有元素.如果对某个n.0有y=fn(x),就说y是从x出发在变换f下可达的(reachable).如果有某个n.1使x=fn(x),就说x在f下是环路的(cyclic).如果x不在f的定义空间里,称x在f下是终止点(terminal).x在变换f下的轨道(orbit)就是x 在f 下可达的所有元素的集合. 引理2.2 一条轨道不会同时包含环路元素和终止

《编程原本 》一2.5 动作

2.5 动作 在算法里,变换f经常被用在如下形式的语句中x = f(x); 应用变换去改变对象的状态,就定义了相应对象上的一个动作(action).变换和动作之间有直接的对偶关系,可以基于变换来定义动作,反之亦然:void a(T& x) { x = f(x); } //从变换定义动作以及T f(T x) { a(x); return x; } //从动作定义变换 虽然存在这种对偶关系,但有时独立的实现效率更高,这种情况下就应该分别提供动作和变换.举例说,如果在很大的对象上定义变换,但是只修改整

《编程原本 》一导读

前 言 本书将演绎方法应用于程序设计,讨论程序与保证它们能正确工作的抽象数学理论之间的联系.书中把反映这些理论的规程(speci.cation),基于这些理论写出的算法,以及描述算法性质的引理和定理一起呈现给读者.这些算法在一种实际程序设计语言里的实现是本书的中心.虽然规程主要是供人阅读,但它们也应该(或者说必须)严格地与非形式化的.供机器使用的代码相结合,必须在通用的同时又是抽象而且精确的.与在其他科学和工程领域里的情况一样,适合作为程序设计的基础的同样是演绎方法.演绎方法能帮助我们将复杂系统

《编程原本 》一1.3 对象

1.3 对象 一个存储(memory)就是一集存储字(word),其中每个字有一个地址(address)和一项内容(content).地址是一种固定大小的值,这个大小称为地址长度.而内容是另一固定大小的值,其长度称为字长.通过装载(load)操作可以取得一个地址的内容.通过保存(store)操作改变一个地址所关联的内容.存储的实例如计算机主存里的一组字节,或磁盘驱动器里的一组区块. 一个对象(object)就是一个具体实体的表示,并且是作为某个存储里一个值.对象有状态(state),其状态就是某

《编程原本 》一1.1 理念范畴: 实体, 类别, 类属

1.1 理念范畴: 实体, 类别, 类属 为了解释什么是对象.类型,以及其他基本的计算机概念,概述一下与这些概念对应的理念范畴是很有帮助的.抽象实体(abstractentity)指永存的不变的事物,而具体实体(concreteentity)指具体的个别的事物,其出现和存在与时间和空间有关.一个属性(attribute)是具体实体与抽象实体之间的一种对应关系,它描述了该具体实体的某种性质.度量或者品质.标识(identity)是我们感知实在世界的一种基本概念,它确定一个事物在随着时间变化中的不变