设为首页收藏本站

LUPA开源社区

 找回密码
 注册
文章 帖子 博客
LUPA开源社区 首页 业界资讯 技术文摘 查看内容

函数式编程和J编程语言

2014-6-3 14:07| 发布者: joejoe0332| 查看: 8170| 评论: 0|原作者: 白文, LeoXu, zhych, 海王, 中奖啦, 无若|来自: oschina

摘要: 这里是一个使用J编程语言作为例子对函数式编程所做的一个简要介绍. 用几个示例来向您展示函数式语言令人影响深刻的能力,以及它们在数学领域的应用. 讨论了使用J语言作为数学符号替代品. ...


  为易于表示高抽象级函数,可以考虑使用元素是多项式的矩阵。我们称这个为 boxed table。例如, 

[ m =: 2 2 $ 1 2 ; 1 2 1 ; 1 3 3 1 ; 1 4 6 4 1
+-------+---------+
|1 2    |1 2 1    |
+-------+---------+
|1 3 3 1|1 4 6 4 1|
+-------+---------+
   [ n =: 2 3 $ 1 2 3 ; 3 2 1 ; 1 0 1 ; 3 3 3 3 ; _1 _2 3; 3 4 5
+-------+-------+-----+
|1 2 3  |3 2 1  |1 0 1|
+-------+-------+-----+
|3 3 3 3|_1 _2 3|3 4 5|
+-------+-------+-----+

下一步,我们将定义一个新版本的psum, pdif和pprod,假设它们的参数是boxed polynomials。 

   psumb =: psum &. >
   pdifb =: pdif &. >
   pprodb =: pprod &. >

之后我们可以为了这些元素是多项式的矩阵定义一个矩阵乘积: 

pmp =:  psumb / . pprodb
      m pmp n
+---------------------+---------------+------------------+
|4 13 19 18 9 3       |2 4 3 6 3      |4 12 17 16 5      |
+---------------------+---------------+------------------+
|4 20 45 61 56 36 15 3|2 5 5 8 14 11 3|4 19 43 60 52 25 5|
+---------------------+---------------+------------------+
   m pmp m
+--------------------+-----------------------+
|2 9 14 10 5 1       |2 10 20 22 15 6 1      |
+--------------------+-----------------------+
|2 12 30 42 37 21 7 1|2 13 38 66 75 57 28 8 1|
+--------------------+-----------------------+
   m pmp^:0 m
+-------+---------+
|1 2    |1 2 1    |
+-------+---------+
|1 3 3 1|1 4 6 4 1|
+-------+---------+
   m pmp^:1 m
+--------------------+-----------------------+
|2 9 14 10 5 1       |2 10 20 22 15 6 1      |
+--------------------+-----------------------+
|2 12 30 42 37 21 7 1|2 13 38 66 75 57 28 8 1|
+--------------------+-----------------------+
   m pmp^:2 m
+----------------------------------------+----------------------------------------------+
|4 29 88 152 176 148 88 36 9 1           |4 31 106 217 304 309 230 123 45 10 1          |
+----------------------------------------+----------------------------------------------+
|4 35 137 323 521 613 539 353 168 55 11 1|4 37 158 418 772 1055 1094 864 513 222 66 12 1|
+----------------------------------------+----------------------------------------------+
   m pmp^:10  x: &. > m
+-------------------------------------------------...
|1024 29952 424704 3899184 26124316 136500501 5803...
+-------------------------------------------------...
|1024 31488 471040 4577232 32551980 180983051 8205...
+-------------------------------------------------...

5.6 证明

Iverson和其它的作者已经使用J语言写了数本关于数学计算的书。其中一个[Ive 1995]在[Gra 1989]使用J语言描述算法和证明。下面的例子是从[Ive 1995]摘录的。

在定理声明中,一个表达式I和另外一个r相等。我们可以在J语言中使用如下方式表示两者关系:

t=: l -: r

这是我必须匹配r,t必须是常函数1所有输入。t有时叫做 同义反复。例如,

l =: +/ @ i.     NB. Sum of integers
r =: (] * ] - 1:) % 2:

如果我们定义n= : ],右边是一个恒等函数,我们可以转化最后一个等式: 

r =: (n * n - 1:) % 2:

下一步, 

t =: l -: r

注意实验上呈现的, 不管输入参数为何,t总是1.

  t 1 2 3 4 5 6 7 8 9
1 1 1 1 1 1 1 1 1

定理证明是从l到r的一系列恒等表达式有序组合。

l
+/ @ i.                            Definition of l
+/ @ |. i.                         Sum is associative and commutative
                                   (|. is reverse)
((+/ @ i.) + (+/ @ |. @ i.)) % 2:  Half sum of equal values
+/ @ (i. + |. @ i.) % 2:           Summation distributes over addition
+/ @ (n # n - 1:) % 2:             Each term is n -1; there are n terms
(n * n - 1:) % 2:                  Definition of multiplication
r                                  Definition of r

当然,上述证明每个表达式是都是一个简单的程序,而证明是一系列有序验证可以将一个表达式转化成另一个。


5.7 J可以作为一种数学符号

Iverson讨论了数学符号在数学计算中的作用。在这篇文章他引用了

A. N. Whitehead

通过减轻大脑不必要的工作负担,一种好的数学符号可以把精力集中在更高级的问题上,事实上增加了脑力劳动的强度。

F. Cajori

一些诸如  $a^n$$\sqrt{n}$$log$ $n$的数学符号仅适用于正整数,如果应用于浮点数、负数和复数,则可能导致致命错误。 

A. de Morgan

数学符号,就像语言一样,并没有严格的限制而得到广泛使用,它的便利性和规定得到了大多数人的认同。

其它著名的引用是与J语言的特性有关:

Friedrich Engels

在科学中,每一种新的术语都会引发革命性的改变

Bertrand Russell

好的符号有一种一种微妙和暗示性的作用,就像一位活生生的老师一般

A. N. Whitehead, 数学的序言作者

这里有一个众所周知的错误,重复已出版的书籍和那些名人的演讲,我们应该富有创新精神并且思考我们可以做什么。事实的情况可能与我们想象的不同,文明的进步提升了数学运算的重要性,但我们却没有深入的思考他们

当然,J语言符号正变得流行,让大脑从繁琐的计算中解放出来,集中精力思考运算背后的事情。它也移除了数学计算的多义性,不要被_3(十减三)和应用程序中的-3混淆。 

一种好的数学符号扩展的例子可以在Cajori的外部乘积的引用中(spelled .)找到。+/ . *(矩阵乘积)被表达成一种外部的乘积推导出其它有用的外部乘积诸如+./ . *。 

很遗憾,J语言并没有被计算机科学广泛接受,在数学上接受就更少了。 

参考文献: 


酷毙

雷人

鲜花

鸡蛋

漂亮
  • 快毕业了,没工作经验,
    找份工作好难啊?
    赶紧去人才芯片公司磨练吧!!

最新评论

关于LUPA|人才芯片工程|人才招聘|LUPA认证|LUPA教育|LUPA开源社区 ( 浙B2-20090187 浙公网安备 33010602006705号   

返回顶部