我只讨论练习2.15和2.16,前面的较简单。
2.15和2.16不能孤立的看,首先我们想想这个所谓区间运算的实质是什么?
没错,集合
我们重新定义加法:
对于集合
A
,
定义
C=A+B
为一切
x+y
构成的集合(其中
x∈A
和
y∈B
)
减法,乘法,除法类似
也容易定义
C=f(A,B)
为一切
f(x,y)
构成的集合(其中
x∈A
和
y∈B
)
考察
R=11/R1+1/R2
,可以认为
R=f(R1,R2)
,而
f(x,y)=1x−1+y−1
自然对于
R=R1R2R1+R2
,可认为
R=g(R1,R2)
,而
g(x,y)=xyx+y
当然因为电阻都是正数所以
f
和
这时再回头看看Alyssa P.Hacker定义的区间运算,发现对于后一种运算,她是分开算的,即先算
R1R2
,再算
R1+R2
,最后将两个相除。
在看看其对于区间的运算,容易发现,在分开算的过程中,算
R1R2
时的变量和算
R1+R2
时的变量不同
也就是说Alyssa
P.Hacker的程序在算
R=R1R2R1+R2
的时候不是
R=g(R1,R2)
,而是
R=g1(R1,R2)g2(R1,R2)
,其中
g1(R1,R2)=R1R2
,
g2(R1,R2)=R1+R2
如此若定义
h=g1g2
,则h就只能是:
h(x,y,z,w)=g1(x,y)g2(z,w)(x,z∈R1,y,w∈R2)
这样算出来的R当然是不真确的了,故而可以回答2.15,正确
至于2.16,第一问已经由上面解答
第二问可以回答:即使可以做到算术闭包,也必须使用户将要算的东西写成表达式,之后程序在对表达式求结果(简单地说就是不能像windows自带的计算器那样可以先按5/2得2.5在2.5*3,只能一次给出表达式然后直接得到一个联系于这个表达式的结果)