约翰·麦卡锡(John McCarthy,1927年9月4日-2011年10月24日),生于美国马萨诸塞州波士顿,计算机科学家。他因在人工智能领域的贡献而在1971年获得图灵奖。实际上,正是他在1955年的达特矛斯会议上提出了“人工智能”这个概念。
麦卡锡发明了LISP并于1960年将其设计发表在《美国计算机学会通讯》(en:Communications of the ACM)上。他帮助推动了麻省理工学院的MAC项目(en:Project MAC)。
然而,他在1962年了离开麻省理工学院,前往斯坦福大学并在那里协助建立了斯坦福人工智能实验室(en:Stanford Artificial Intelligence Laboratory),成为MAC项目多年来的一个友好的竞争对手。
他于1948年获得加州理工学院数学学士学位,1951年获得普林斯顿大学数学博士学位。分别短暂地为普林斯顿大学、斯坦福大学、达特茅斯学院和麻省理工学院供职后,麦卡锡于1962年-2000年底在斯坦福担任教授,退休后成为名誉教授。
约翰·麦卡锡时常在网络论坛上对时事作出右翼倾向的评论。
北京时间2011年10月25日早间消息,据资讯网站Gamasutra报道,人工智能之父、Lisp语言发明者约翰·麦卡锡(John McCarthy)周一去世,享年84岁。
作为备受尊敬的计算机科学家、认知科学家,麦卡锡在1955年提出了“人工智能”一词,并被誉为人工智能之父,并将数学逻辑应用到了人工智能的早期形成中。
麦卡锡在1958年发明了Lisp编程语言,该语言至今仍在人工智能领域广泛使用。
麦卡锡在1971年获得了计算机界的最高奖项图灵奖,并在1991年获得了美国国家科学奖章(National Medal of Science Award),2003年获得富兰克林学院奖章。
麦卡锡从1962年开始担任斯坦福大学教授,并在2000年底退休。
个人资料 编辑本段回目录
1948年,加州理工,数学学士
1951年,普林斯顿大学,数学博士
1956年Dartmouth会议的发起人(该会议被视为AI作为一门学科诞生的标志),1955年在为该会议写的建议书(与Minsky,Rochester和Shannon一同撰写)中提出Artificial Intelligence一词,从而被视为“人工智能之父”。
1958,发明Lisp编程语言(该语言至今仍在人工智能领域广泛使用)
1960左右,提出计算机分时(time-sharing)概念
1962~2000(退休),斯坦福大学计算机系教授,后期工作主要关注常识和非单调推理。
1965~1980,斯坦福AI实验室主任
1971因对AI的贡献获图灵奖。
1985获得IJCAI(the International Joint Conference on Artificial Intelligence)颁发的第一届"Research Excellence Award"(可看作是AI的终身成就奖)
1990年获得“美国国家科学奖(National Medal of Science Award)”
出版书籍:
《Formalizing Common Sense》,1990
参考:
维基页面 http://en.wikipedia.org/wiki/John_McCarthy_(computer_scientist)
个人主页 http://www-formal.stanford.edu/jmc/ (其主要论文都可以从该主页下载)
其中:“WHAT IS AI(什么是人工智能)”(http://www-formal.stanford.edu/jmc/whatisai.html)是一篇很好的AI入门读物
约翰·麦卡锡:“人工智能之父”和LISP语言的发明人 编辑本段回目录
1971年的图灵奖授予提出“人工智能”这一术语并使之成为一个重要的学科领域的斯坦福大学教授约翰·麦卡锡(John McCarthy)。
麦卡锡1927年9月4日生于波士顿。他的父亲是一个爱尔兰移民,做过木匠和渔夫,同时也是一个发明家和工会积极分子,拥有捻船缝机和桔汁冷冻机两项专利。麦卡锡的母亲是来自立陶宛的犹太人,热心于女权运动,当过记者。夫妻两人在20世纪30年代都曾参加美国共产党。受父母的影响,麦卡锡对社会问题也比较关注,参与过在加州的Palo Alto创办自由大学的活动,倡仪过修改“人权法案”(the Bill of Rights,这是美国于1789年通过的对美国宪法的第一次修正案)。但与他在计算机科学上所做的工作和贡献相比,麦卡锡主要还是一个科学家而非社会活动家。此外,麦卡锡还喜欢攀岩、跳伞、驾驶滑翔机等有刺激性和危险性的运动,曾和他的第二任妻子维拉·沃特森(Vera Watson)一起攀登过世界上不少大山高峰。沃特森是一位程序员,也是世界知名的女登山运动员,是第一位独自攀上西半球第一高峰、位于阿根廷和智利边界的安第斯山脉的阿空加瓜山(海拔6960米)的女性,后来在一次攀登位于尼泊尔中部的阿那波尔那峰(海拔8075米)的妇女探险活动中不幸遇难牺牲。
麦卡锡是一个天赋很高的人,还在上初中时,他就弄了一份加州理工大学的课程目录,按目录自学了大学低年级的高等数学教材,做了教材上的所有练习题。这使他1944年进入加州理工学院以后可以免修头两年的数学,并使他虽因战时环境(第二次世界大战当时正在进行之中,美国也在珍珠港事件后宣布参战)要在军队中充任一个小职员,占去了部分时间,仍得以·在1948年按时完成学业。然后到普林斯顿大学研究生院深造,于1951年取得数学博士学位。麦卡锡留校工作两年以后转至斯坦福大学,也只呆了两年就去达特茅斯学院任教(达特茅斯学院位于新罕布什尔州的汉诺威)。在那里,他发起了并成功举办了成为人工智能起点的有历史意义的“达特茅斯会议”。1958年麦卡锡到MIT任职,与明斯基(L.Minsky,1969年图灵奖获得者)一起组建了世界上第一个人工智能实验室,并第一个提出了将计算机的批处理方式改造成为能同时允许数十甚至上百用户使用的分时方式(6me-sharing)的建议,并推动MIT成立组织开展研究。其结果就是实现了世界上最早的分时系统——基于IBM 7094的CTSS和其后的MULTICS。麦卡锡虽因与主持该课题的负责人产生矛盾而于1962年离开MIT重返斯坦福,未能将此项目坚持到底,但学术界仍公认他是分时概念的创始人。麦卡锡到斯坦福后参加了一个基于DECPDP—1的分时系统的开发,并在那里组建了第二个人工智能实验室。
麦卡锡对人工智能的兴趣始于他当研究生的时候。1948年9月,他参加了一个“脑行为机制”的专题讨论会,会上,冯·诺伊曼发表了一篇关于自复制自动机的论文,提出了可以复制自身的机器的设想,这激起了麦卡锡的极大兴趣和好奇心,自此就开始尝试在计算机上模拟人的智能。1949年他向冯·诺伊曼谈了自己的想法,后者极表赞成和支持,鼓励他搞下去。在达特茅斯会议前后,麦卡锡的主要研究方向是计算机下棋。下棋程序的关键之一是如何减少计算机需要考虑的棋步。麦卡锡经过艰苦探索,终于发明了著名的α-β搜索法,使搜索能有效进行。在。-p搜索法中,麦卡锡将结点的产生与求评价函数值(或称返上值或倒推值)两者巧妙地结合起来,从而使某些子树结点根本不必产生与搜索(这谓之“修剪"--pruning或cutoff)。之所以称为。—p搜索法,是因为将处于取最大值级的结点的返上值或候选返上值PBV(Provisional Back-up Value)称为该结点的α值,而将处于取最小值级的结点的候选返上值或返上值称为该结点的p值。这样,在求得某结点的。值时,就可与其先辈结点的p值相比较,若。≥p,则可终止该结点以下的搜索,即从该结点处加以修剪,这叫p修剪;而在求得某结点的p值时,就可与其先辈结点的α值相比较,若p≤。,则可终止该结点以下的搜索,即从该结点处加以修剪,这叫。修剪。为了说明。-p修剪,我们举一个最简单的例子。设在取火柴棍的游戏中,A、B两人轮流从N根火柴中取1根或2根,不得多取,也不能不取。取走最后一根火柴者胜。用A(n)、B(n)表示轮到A或B时有n根火柴的状态,当n:5时轮到A取,则如下图所示,A有两种可能,一是取2根火柴进入B(3),另一是取1根火柴进入B(4)。显然,进入B(3)后,不管B取几根,A必胜,故A必走这一步,余下的分支不必再搜索了。。-p搜索法至今仍是解决人工智能问题中一种常用的高效方法。
至于达特茅斯会议,当东道主的麦卡锡是主要发起人,另外3个发起人是当时在哈佛大学的明斯基(1969年图灵奖获得者),IBM公司的罗杰斯特(N.Rochster),信息论的创始人香农。麦卡锡发起这个会议时的目标非常宏伟,是想通过10来个人2个月的共同努力设计出一台具有真正智能的机器。会议的经费是洛克菲勒基金会资助的,包括每个代表1 200美元加上外地代表的往返车票。会议的原始目标虽然由于不切实际而不可能实现,但由于麦卡锡在下棋程序尤其是α—β搜索法上所取得的成功,以及卡内基—梅隆大学的西蒙(H.A.Simon)和纽厄尔(A.Newell,这两人是1975年图灵奖获得者)带来了已能证明数学名著《数学原理》一书第二章52个定理中的38个定理的启发式程序“逻辑理论家”LT(10sicTheorist),明斯基带来的名为Snarc的学习机的雏形(主要学习如何通过迷宫),这使会议参加者仍能充满信心地宣布“人工智能”这一崭新学科的诞生。
1959年,麦卡锡基于阿隆索·邱奇(Alonzo Church)的l-演算和西蒙、纽厄尔首创的“表结构”,开发了著名的LISP语言(List Processing language),成为人工智能界第一个最广泛流行的语言。LISP是一种函数式的符号处理语言,其程序由一些函数子程序组成。在函数的构造上,和数学上递归函数的构造方法十分类似,即从几个基本函数出发,通过一定的手段构成新的函数。LISP语言还具有自编译能力。具体说来,LISP有以下几个主要特点:
1. 计算用的是符号表达式而不是数;
2.具有表处理能力,即用链表形式表示所有的数据;
3.控制结构基于函数的复合,以形成更复杂的函数;
4.用递归作为描述问题和过程的方法;
5.用LISP语言书写的EVAL函数既可作为LISP语言的解释程序,又可以作为语言本身的形式定义;
6.程序本身也同所有其他数据一样用表结构形式表示。
已经证明,LISP的这些特点是解决人工智能核心问题的关键。此外,精巧的表机制也是进一步简化LISP程序设计的方便而有力的工具,因此,LISP自发明以来,已经被广泛用于数学中的符号微积分计算,定理证明,谓词演算,博奕论等领域。它和后来由英国伦敦大学的青年学生柯瓦连斯基(R.Kowaliski)提出、由法国马赛大学的考尔麦劳厄(A.Colmerauer)所领导的研究小组于1973年首先实现的逻辑式语言PROLOG(PROgramming in LOGic)并称为人工智能的两大语言,对人工智能的发展起了十分深远的影响。LISP所蕴含的丰富的思想和深刻的意义也吸引了负责设计Algol语言的国际委员会,麦卡锡因此而被吸收为该委员会的成员。Algol中后来采纳了LISP关于递归和条件表达式这些思想。
麦卡锡在20世纪50年代末研究的另一个课题是如何使程序能接受劝告从而改善其自身的性能。为此他提出过一个名为Advice Taker的系统的设想。有资料说,这是世界上第一个体现知识获取工具思想的系统,1968年建成。实际上,这个系统并未最后完成,只是完成了一部分,用LISP语言建立起了一个具有常识(common sense)的软件,能理解告诉它的是什么,并能评估其行动的后果。但正是在Advice Taker的开发过程中,启发麦卡锡提出了用“分时系统”代替“批处理系统”的建议,使计算机的使用方式引发了一场革命。
除了人工智能方面的研究和贡献之外,麦卡锡也是最早对程序逻辑进行研究并取得成果的学者之一。1963年他发表的论文“计算的数学理论的一个基础”一文(收录于P.Braffort和D.Hirschberg编辑的《计算机程序设计和形式系统》——Computer Programming and Formal Systems,North Holland,33-70页)集中反映了他这方面的成果。麦卡锡在这篇论文中系统地论述了程序设计语言语义形式化的重要性,以及它同程序正确性、语言的正确实现等问题的关系,并提出在形式语义研究中使用抽象语法和状态向量等方法,开创了“程序逻辑”(10gicsofprograms)研究的先河。程序逻辑就是一种“语言”,用这种语言可以无二义地表达程序的各种性质,其语义规定了该语言中各种表达式的意义,而它的一组规则则用同意义相关的方式去操作这些表达式以计算该语言中的各种断言(assertation)的真值。研究程序的逻辑对于帮助人们了解软件是否合理十分重要,它可以用于程序验证(program verification),自动程序设计,为优化和审计而进行的程序分析等方面。麦卡锡在上述论文中提出的方法是用递归函数作为程序的模型。他以两个链表(1ist)的“附加”(append)操作为例说明可以用递归的方法定义这个函数,并可以用形式化的方法证明链表的附加操作是满足结合律的(associative law),即x@(y@z)二(x@y)@z。麦卡锡进而证明了用一系列递归定义的函数就完全可能建造大型的软件系统,并用归纳法证明这些系统所具有的性质。麦卡锡所提出的方法是有关程序逻辑研究中第一个比较系统而成熟的方法,曾被广泛地采用。
20世纪70年代以后,麦卡锡又开始研究非单调逻辑。在经典逻辑中,由已知事实推出的结论,决不会在已知事实增加时反而丧失其有效性,因此是“单调的”(monotonic)。但在人类思维过程中,由于信息的不完全和认识的局限性,常常有随着事物的发展变化,原有结论被否定和取消的情况,这就导致了所谓“非单调逻辑”(non monotonic logic)。非单调逻辑中有一类是基于最小化语义的最小化非单调逻辑。1980年,麦卡锡在一篇论文中提出了“限制逻辑”或称“限界逻辑”,成为这类非单调逻辑中比较成功的一个体系(见J.McCarthy:Circumscription a form Of non monotonic reasoning·Artificial Intelligence,V01.13,1980,27—39页)。限制逻辑的基本思想是:“限制”某个谓词P也就是排除以P的原有事实为基础所建立的大部分模型,而只保留有关P的最小模型。这与人类思考问题时总是在某些条件限制下考虑,也就是只考虑所涉及的个体或关系,而决不去涉及其他个体或关系,是比较相符的。1986年,麦卡锡在AI杂志上就限制逻辑的应用发表了进一步的研究论文:“限制逻辑在常识知识形式化中的应用”(Applications Of Circumscription tO Formalizing Common Sense Knowledge,AI,V01.28,1986,89—116页),对倡导常识推理和常识研究起了十分重要的作用。
麦卡锡的主要著作有:
《自动机研究》(Automata Studies,Princeton Uni.Pr.,1956,与香农合编)
《信息学:科学美国人之书》(1nformation:A Scientific American Book,Freeman,1966)
《形式化的常识:麦卡锡论文选集》(Formalizing Common Sense:Papersby John McCarthy,Ablex Pub.Co.,1990,由V.Lifschitz编辑)
除了获得图灵奖以外,麦卡锡在1988年获得由日本INAMORI基金会所设立的KYOTO奖,这个奖主要奖励在高科技方面作出杰出贡献的科学家,麦卡锡是这个奖的第5位获得者。1990年麦卡锡获得美国全国科学奖章(National Medal of Science)。
麦卡锡的图灵奖演说题为“人工智能研究的现状”(The Present State of Research on Artificial Intelligence)。但不知什么原因,这篇演说没有发表。在《前20年的图灵奖演说集》(ACM Turing Award Lectures The First 20 Years:1966—1985,ACM h.)中,则以“附录”(postscript)的形式约请麦卡锡另写了一篇“人工智能的一般原理”(Generality in Artificial Intelligence),刊于该书257—268页。
麦卡锡现仍在斯坦福大学计算机科学系任教,其电子信箱为: jmc@cS.stanford.edu
人工智能:让机器像人一般思考 编辑本段回目录
(中国科学技术信息研究所加工整理)
CNET科技资讯网2006年7月17日报道:在1956年时,有一群电脑科学家聚集在Dartmouth大学一同讨论在当时全新的研究主题:“人工智能”。
这一个在新罕布夏州,康乃迪克河谷汉诺瓦镇的夏季聚会,可以说是未来“机器要如何模拟人类的认知观点,如机器如何了解人类语言?机器能否自我改良?乱数是否是创意思考与逻辑思考的不同之处”等等重要问题的研究开端。
然而这些讨论都基于一个隐含的假设,就是理论上人类的智能是可以被完整描述,让机器可以用程序来加以模拟。
那时的Dartmouth讨论会有许许多多的有名人物参加,如哈佛大学的Marvin Minsky,贝尔实验室的Claude Shannon,IBM公司Nathaniel Rochester以及Dartmouth的John McCarthy。
然而,在研讨会的开头提出“人工智能”这个名词的,却是McCarthy本人。这个月(7月),Darthmouth在举办人工智能会议50周年的庆祝活动,而如今是斯坦福大学荣誉教授的McCathy也谈到过去早期对人工智能的预期、目前已经完成的进度以及尚待完成的研究。
问:你是在1956的讨论会上,第一个使用“人工智能”这个字汇的人。当时你是单纯为一个已经存在的想法取上名字,还是导入一个新的概念?
答:这个名称是我在向洛克菲勒基金会撰写企划书,申请研究补助时所想到的。老实跟你说,之所以取这个名字是因为参加者的关系,而不是赞助者。我认为,能让从既有知识中,思考出新的想法,是一个十分重要的研究。
Claude Sannon与我那时已经写了一本叫“Automata Studies”的书,那个时候我总觉得那本书尚不足以完整描述那时我所有登载的研究论文所指涉的概念,所以就想要创造一个新的名字来为描述这些新的观念。
现在回过头来看,你认为那是一个正确的字汇?虽然目前看起来它是一个相当适切的用语,但会不会有更好的字眼来描述这个领域的研究?
的确有些人认为“计算机智能”这个字眼比较好。但大家不用这个字眼的原因是因为每个人都知道计算机会是人工智能的核心。然而事实上,当时这样子想的人还算是少数呢。
当时在企划书中,关于用电脑来模拟人脑的高度功能,你写到“真正的障碍,并不是机器的功能不足,而是我们无法写出程序,来彻底利用我们拥要的资源。”所以我们可以说,人工智能的设备并不是问题,真正难以克服的是撰写程序的技巧吗?
这并不是所谓“技巧”的问题,这是关于基本概念的问题,而且这个问题至今依旧存在。你可以看看现在的电脑在下西洋棋的时候多么厉害,然而不管投入多少的努力,电脑下围棋的时候却还是如此笨拙。这是因为在下围棋的时候,你必须要思考棋局现在的状况,各颗棋子的位置,同时还要能辨别各部分的死活--然而人类如何思考这些事情,就算到现在,仍然不是十分清楚。
那时,在1956年参加讨论会的人士里,对于将来人工智能的进展,如1970年代的电脑能够下棋与为古典音乐谱曲,语音识别等等,是否十分乐观呢?(我相信你是的)我们在这五十年内到底有了多少进展?一开始的预期是否也有些过度乐观呢?
老实说是有一点。然而我也记得当初也有一些学者对人工智能的研究十分的悲观。
他们悲观的原因为何?
我想,你可以把目前所知的所有障碍都算进去,因为随着研究的进展,我们所遭遇的困难愈多。
在这五十年的研究中,有没有一些足以决定整个人工智能领域的重要演进?
我想其中一个重要的演进,就是电脑必须要使用多重推论。
你可以解释一下何谓“多重推论”吗?
在传统的逻辑推论中,假设你可以从一组逻辑陈述,比方A的里面,推论出一个叫P的逻辑陈述。如此在另个包含A所有陈述的组合B中,也可以用同样的方法导出P这个陈述为真。然而人类并不是用这个方法思考的。比方我说“我在11点回到家,但是我无法接你的电话”。在第一句话:“我会在11点回到家”中,你会缺省我可以接你的电话,但如果我加上了“但是”这个字汇,你就知道那个结论无法成立。
所以所谓的“多重推论”就是让电脑知道这个结论可能存在,但并不保证这个结论一定会成立,这是因为一些新加入的陈述可能可以消去既有的结论。在1980年代(或略早)左右,公式化的多重推论领域开始诞生,现在已经发展成一个很大的研究领域。
在过去五十年来最重要的研究成果是什么?或着说,一开始大家缺省的研究目标中,达成了多少?
我想我们还没有完成一个人类等级的人工智能。然而我会说,一个可以把一台车连续驾驶128英英里的人工智能可以说是长足的进展。(编注:在去年秋天DARPA杯大满贯赛中,获胜的车辆-斯坦福大学的机器车“Stanley”自动驾驶了131.6英英里,横跨了摩哈维沙漠。)
你会预期将来有什么重大发现呢?
我会很高兴看到将来在人类的一般知识与推论上的公式化,分析文章的逻辑脉络。这是DARPA、其他人与我都长时间持续研究的领域。但我认为目前我们所有的知识并不足以到达人类的智能等级。
人工智能的目标似乎不太是要让机器变得像人,或是拥有人类的能力,但却是类似人类能力的东西,是这样吗?换句话说,我们并不是要重新制造一个人,而是创造一个思考的方式与人类类似或是超过人类的东西吗?
我个人是这样想的。有一些人对模拟人类的智能,或是部分的智能十分有兴趣。事实上Allen Newell与Herbert Simon等等科学家应该也是如此认为。
在未来,其他人工智能领域里的重要目标是否能完成,似乎都与在与试着把人类的原创性加到机械思考中有关。
没错,这些都需要相当的努力才能完成。我在1963年内的研究中让电脑可以为问题提供有创意的解决方案,这个解决方案甚至与原来不在问题内的元素或是问题本身有关。不过我认为这个研究只是开端。
所谓电脑的创见--这个东西是否就像是在程序里加入一些乱数那么简单呢,或是一个完全不同难度的东西呢?
理论上,在一个逻辑系统中,你可以系统化地或是乱数化地制造出一些解答,不管如何,最后都会产生所需的答案,但是这个“最后”也可能是很久很久以后。所以不管是否使用乱数并不是最重要的事,真正重要的是,电脑如何从既有的概念中创造出新的想法。
让我们回到机器性能与程序技巧何者才重要这个问题上--今天我们已经有了五十年前所没有的计算能力。今日电脑芯片与内存的发展,是否造成什么差别?
我会说,在五十年前电脑的性能还十分受限,然而在三十年前,机器的性能便已经不是什么重点了。
所以问题仍旧是在人工智能的基本概念上吗
是的。
机器人这个元素在人工智能中扮演何种角色?我猜想在一般大众的形象里(比方电影里看起来像人类的角色),人们似乎都倾向看到人工智能有接近人类智能的等级。然而机器人真的是一个重要的要素吗?或着它只是机器不同的外型罢了?
的确,机器人领域有一些其他的问题。因为他们必须要在人类的环境中运作,有时候甚至面对一些尚未解决的问题--比方像人类一样举起两腿,而不是拖着脚的方式行走,或是要能了解物体的三度空间视觉等等。这些问题已经被分别研究,但机器人目前仍旧无法在混乱的房间里行走或是上下楼梯,更不要说爬树了。
在电影里描述机器人的时候,往往会让他们有一些人类的动机或个性之类的,所以机器人才会在电影里变成一个有个性的角色。要假设这些机器人像人类一样的十分容易的,比方电影AI里的机器人,会陪伴人还会觉得孤单。
他们假设机器人可以模仿十岁的小孩,然而他们甚至没有想到,电影里收养机器人的女主人会变老--当她七十岁或八十岁时,他的机器人小孩还是十岁大。在电影的观点里,甚至不需要思考这个问题,这只是人们很容易被电影误导的例证之一。
你对于Ray Kurzweil所提的“融合”概念有什么看法(该作者预期在2045年之间,人类跟机器会融合成一体) ?
我认为那是胡扯。我完全不认为Kurzweil的可能方案中有任何可能性。也许融合会在2045发生,但它不会用任何Kurzweil所提的方式。我想一般来说,下一代的进步都是由一些年轻人,而不是由我们这些老家伙所完成,而我认为Kurzweil也是个老家伙。
我六月在以色列曾遇到一个年轻人,他喜欢我写过的一些用机械方式去描述心智的论文,虽然我只有几分钟与他谈话,但我认为他至少还比一些长时间待在我们这个领域的许多人还来得有希望。
至于目前对于人脑的研究,是否导致人工智能的新想法呢?
的确,我们现在已经对人脑的运作了解许多。然而我不认为至今这些研究与人工智能的进展有什么密切的关协。让我举个例子。正子放射断层扫描(PET)发现脑部的一小部区域在人类做心算时使用大量的能量。这是一个很棒的研究,但是人类到底在做心算的时候到底是怎么想这个问题,仍旧不是现在的神经医学可以解释的。
我目前读到了一些你持续的专栏写作。你似乎对未来十分乐观--认为物质文明会持续发展。然而我们却活在一个很悲观的时代。
那是因为大众与新闻媒体的态度都很容易快速转变。我们可以预期在十分短的时间内,大众运输就能使用液态氢来做为推进动力,而液态氢可以由核子反应器来有效产生。这是十分有可能发生的事情。我想只要一般大众、国会与记者可以快速意识到除非我们尽快研究新科技,我们可能很快就无法使用现在的汽车,这样的话只要很短时间,大家的努力就会集中,Samuel Johnson就是这样说的。
所以一个重要的问题只要我们真的想要解决它,我们就能解决它?
是的,我是这样认为。我不认为在有解决方案的情况下,人类会坐视灾难的发生。你可以看看美国与其他的国家在战争时的反应速度,这就是大家的转变的效率在需要的时候就变得十分快速的例子之一。
你同时写道,你认为气候暖化最后若变成严重问题,那时暖化可以避免,甚至可以被逆转。在几年前你是这样写的,在近期的研究结果之下,你还认为是这样吗?
似乎已经有许多证据显示暖化的确发生。我想在成因方面依旧众说纷纭。但若需要,我想暖化也是可以被逆转的。不过我们还不知道暖化是否有害。
甚至在科学家的主流中,思考的方式往往也是毁灭导向。虽然不是每人,却也是大多数如此。他们往往思考要如何破坏一个东西,而不是要如何修复一个东西。我的意思是,科学家也有同样的倾向,就是态度容易被大众所影响。
Lisp语言的发展 编辑本段回目录
国家智能计算机研究开发中心 刘晓华
一、引言
Lisp是一个优美的高级语言,它的发展经历了漫长的复杂的历程。在Lisp作为高级语言出现以前,大约经过了两年的酝酿(1956~1958),形成了Lisp的许多基本设计思想。1958年 秋进入Lisp的实现与初步应用时期,这一时期(1958~1962),Lisp的发展基本上是单线的。1962年以后Lisp的发展变成多线,在这一段时期(1962~1984),不同的机构团体提出许多不 同的思想,形成了"百家争鸣"的局面。直到Common Lisp(1984)出现以后,Lisp的发展才进入标准化时代。不同寻常的发展过程使得Lisp成为继Fortran语言之后第二个历史最长使用最广泛的语言。
二、Lisp前期和早期(1956~1962)
Lisp前期(1956~1958)始于John McCarthy的一种愿望:为IBM 704计算机提供一个代数表处理语言,以便适用于人工智能(AI)的研究。这种愿望是1956年夏在Dartmouth举行的AI研究计划讨论会上他受到Newell,Shaw和Simon描述的IPL2——表处理语言的启发而萌发的。但他并不想直接采用IPL2,原因有两个:①IPL2是用来实现逻辑定理证明的,而且依赖于Rand公司的JOHNNIAC机器;②Fortran语言结构用来进行表处理也是很有吸引力的(后面我们将会谈到)。这种愿望最终变成现实:IBM公司慷慨承担了在MIT成立New England Computation Center和开发一个证明平面几何定理的程序,当时John McCarthy是这个项目的顾问。 John McCarthy选择表作为程序句子的基本表示单位。表结构不仅能表示符号信息,而且适合逻辑推理,即适合进行符号处理。尽管有其他一些采用传统表示方法的符号处理系统,但McCarthy放弃了传统的中缀表示方法而采用了前缀形式,因而能很快地决定机器下一步应该采取的动作。这个特征可能是Lisp在和其他语言的竞争中取得成功的原因。但是如何在机器上存储表结构和对表结构进行操作,这是一个技术问题,而且和具体的机器有关,如机器字及其bit数。
最初,提出了对表结构进行操作的基本操作。这些操作都是针对寄存器的字或地址进行的。cwr表示取寄存器中字的内容,car表示取寄存器中地址的内容,还定义了cdr、cpr和ctr三个类似的函数,cons最初是定义为一个例程而不是一个函数。这些思想几乎都是在Dartmonth的New England Computation Center形成的,但是没有在机器上实现。
同时进行的另一部分工作,是在Fortran中实现一个表处理语言,当时IBM有一个平面几何证明的项目。在McCarthy的建议下,N.Rochester和H.Gelerneter等决定在Fortran中增加关于表处理的功能,提出了FLPL语言(Fortran表处理语言),把cons处理为一个函数。尽管FLPL能容易地处理表达式和编写平面几何证明程序,但缺少条件表达式和递归功能。McCarthy在1957~1958年间提出了条件表达式,并首先用于Fortran程序。到1958年夏天,这些思想基本成熟,并且超过了FLPL:(1)用条件表达式定义递归函数,把各种情形组合在一个公式中;(2)引入church的入概念,函数可以作为表的参数。通过修补Fortran来进行表处理,无论从技术上还是策略上都很困难,因此需要一个崭新的表处理语言。Lisp语言终于诞生。1985年秋天,MIT的McCarthy(电子工程系)和Marvin Minsky(数学系)领导的小组着手实现一个Lisp编译器,以便为Lisp程序提供一个运行环境。Lisp程序是用一个类似于Fortran的M表达式编写的,通过手工方式将各种各样的函数汇编成汇编语言,在Lisp"环境"下运行。这时的Lisp除了提供一些基本功能外还实现了输入(READ)和输出(PRINT)Lisp表结构。
刚出世的Lisp实际上是一个很脆弱的婴儿,需要不断吸取氧分才能茁壮成长。Lisp虽然提供递归函数计算,但它不是一个通用图灵机,应该更加简朴巧致地描述可计算函数,便于实现。出于Lisp设计的初衷(用于人工智能、包括定理证明、符合数学法则、函数可能作为变量、表达式可以替换)。引入了Lisp表达式计值的函数eval和LABEL符号(表示一个函数作为表的参数)。至此,Lisp的核心已经较为完备。Lisp作为一个高级编程语言(称作Lisp1.5),也显示了其他语言所不具备的特征:Lisp程序可以作为Lisp数据被eval解释和用语言本身来编写自己的编译器。
Lisp早期也出现了几个Lisp的版本。最早是在IBM 704机上实现的。John McCarthy和Steve Russell在Stanford大学的PDP-1上实现了PDP-1Lisp。T.R.Hart和T.G.Evans在Univac M 460实现了Lisp1.5,它的最低层是用机器语言代码写的。后来,R.Saunders等人又在IBM的Q-32机器上实现了Lisp1.5。
三、Lisp中期(1962~1984):百家争鸣
这一段时期,Lisp的发展呈现多样化,形成了许多Lisp方言,支持Lisp的机器也越来越多。不同的机构团体在开发Lisp方言的时候,或多或少对Lisp的发展做出了自己的贡献。
1.从Lisp1.5到PDP-6Lisp
在1963年,还是高中生的L.Peter Deutsh在PDP-1上实现了一个与Lisp1.5相似的Lisp,称作基本PDP-1 Lisp。1964年,Lisp1.5运行在MIT的兼容的分时系统IBM 7094机上。这两个 Lisp对PDP-6 Lisp的发展产生了主要的影响。PDP-6 Lisp是由DEC和MIT在1964年在PDP-6上联合开发的。至此形成了Lisp的两支主流。PDP-6 Lisp最后发展成为Maclisp。基本PDP-1 sp发展成为Interlisp。Maclisp和Interlisp成为60年代后期至80年代早期两个最主要的Lisp方言。
2.Maclisp
Maclisp是MIT AI实验室主要的Lisp方言。它是在PDP-10上开发的,也能用于Honeywell 6180(操作系统是Multics)。它采用纯表(lisp)风格,注重产生式质量(production quali ty),扩展了Lisp1.5的功能:引入LEXPR,计算如(A+B+C)之类的操作数个数不定的函数,增加了数组的处理,引入了简单谓词操作(如MEMBER和出错函数ERR),允许用户发出错信号(sign al)。
Maclisp的另一个重要发展是由MIT的MAC计划促成的,这时不再强调语言设计而是注重满足用户的需要。在这期间,Maclisp吸取了其他Lisp方言和其他编程语言的特征。在70年 代初期,Maclisp的主要开发者John L.White把快速数学编译器LISCOM中的技术应用到Lisp编译器中,产生了一个新的Maclisp编译器NCOMPLR,成为一个比较的标准(衡量其他Lisp编译器 生成的执行代码的运行速度快慢的尺度)。由于MIT AI实验室的视觉和机器人需要进行大量的数值计算,Maclisp改变了Lisp1.5数值计算效率低的问题,使得编译Maclisp的数值性能几 乎能和Fortran编译器相媲美,也增加了对任意精度及其整数的处理。
Maclisp引入了读表(read table)概念。读表为程序和数据提供了一个可编程的输入语法。它的文法分析器也可由用户重新编程,大大改善了Lisp1.5的输入功能。
Maclisp从其他Lisp方言吸收的东西并不多,主要借用了Interlisp NIL的处理方法:(CAR NIL)→NIL和(CDR NIL)→NIL。
Maclisp的发展到70年代中期开始受阻。目标机PDP-10的1M内存限制了Lisp程序的大小。Maclisp经过几年较有力的发展后,它的用户到1980年开始减少,资金短缺使MIT的人材流 向一些新的机构。
3.Interlisp
Interlisp是由基本PDP-1 Lisp演变而成的。在Bolt Beranek and Newman(BBN),在PDP-1上实现了一个向上兼容的Lisp版本,即基本PDP-1 Lisp的后继。最后又由A.Hartley和M urphy在PDP-10上实现了这个Lisp(称为BBN Lisp),由BBN和Xerox Palo Alto研究中心共同维护,并将其更名为Interlisp。
Interlisp把许多基本思想引入到Lisp编程风范和方法当中。这些思想都体现在编程工具里,如拼写校正器、文件包、DWIM、CLISP、结构编辑器和MASTERSCOPE。Warren Teitel man的1966年的博士论文首先提出了这些思想。
拼写校正器和DWIM(Do What I Mean)能够弥补人的缺陷,自动或交互式正用户拼写和配对符号不匹配的错误。CLISP(Comersational Lisp)是InterLisp的类似ALgol的英语自然风 格的文法。程序员可以像Algol一样编写Lisp程序或定义函数。结构编辑器编辑的源文件是一个驻于内存的Lisp数据结构,对该文件的任何修改,包括自动修改部分,都会被保存起来, 文件仅仅是一个后援拷贝。MASTERSCOPE能够确定大系统中函数的相关信息(如调用关系)建立一个数据库。这些工具相互之间能协调工作,构成了InterLisp的集成开发环境。Interl isp的块编辑(多个函数定义在一个块区)提高了函数调用的速度。这些思想在现在使用的Lisp环境中也得到了充分体现。
尽管Interlisp沿袭了Lisp1.5文法,但也提出了自己的处理方法。像Maclisp一样,它修改了lisp1.5的函数调用机制,允许函数参数个数可变,函数参数什么时候计值也由LAMBDA和 NLAMBDA以及它们的确定辐度(spread函数参数数目固定)和不确定辐度(mospread函数参数数目不定)属性来决定。MacLisp和Interlisp关于函数参数处理除了在文法形式上存在差别 外,Maclisp坚持参数数目必须严格一致,而Interlisp却采取一种灵活机制:多余的参数被抛弃,缺少的参数补全并以NIL作为它们的值。
Interlisp对lisp的另一个重要贡献是栈的处理方法,它引入Spaghettie栈,把栈组织成一个树结构,解决了变量作用域和动态定义函数的生命期问题。
Interlisp和Maclisp共生于同一时期。尽管相互之间有取长补短之处,但两个团体之间由于编程哲学(philosophy)上的分歧,使得他们没有能在MacLisp和Interlisp之间达成共识 。MacLisp本身的缺陷致使它到 1980年时开始衰退,而InterLisp能运行于PDP-10系列、VAX系列和Dmachines等多种机器,且具有良好的集成环境而受到Lisp用户的青睐。
4.Lisp 机:1973~1980
Lisp机提供了Lisp运行的硬件支撑环境。其思想源于L.P.Deutsch。1973年,Xerox公司开发了基于Interlisp的Lisp机:Alto。这个机器不能够充分发挥Interlisp的优势。1976年 ,Xerox生产的Dorado取代了Alto,具有向上兼容性,其速度很快,但没有进入计算机市场。70年代后期在Dolphin机上运行Interlisp,其性能比Alto好,但不能够成为一台真正的Lisp机 。到1980年,Xerox生产了另一台Lisp机:Dandelion,其速度比Dolphin快,但比Dorado慢。1974年,R.Greenblatt负责MIT的Lisp机计划,研制一台基于MacLisp能向上兼容的Lisp 机CONS(其改进型机器叫CADR)。它的目的是提高Lisp程序运行性能,提供类型检查和grabage收集(遗憾的是没有实现)的硬件支持,能够运行大规模Lisp程序(突破MacLisp的缺陷)。 虽然MIT的Lisp机基于MacLisp,但也突破了MacLisp的限制,在一定程度上受到InterLisp的影响,如它也提供了一个正文编辑器(后来成为EMACS)调试和一个驻内存编译器。
Lisp机似乎并没有受到足够的注意。大多数用户并不看重Lisp机的硬件技术而是注重它的软件。Lisp机公司也没有发现这一事实,导致Lisp机陷入了困境。
5.其他的Lisp方言尽管MacLisp和InterLisp成为70年代Lisp的主导潮流,仍然有一些大学研究机构和公司先后开发了各种Lisp方言。其中使用最广泛的是Standard Lisp和Porta ble Standard Lisp。前者是A.Hern和他的同事们共同开发的,是Lisp 1.5的子集,试图融合其他一些Lisp方言的特征。这了提高性能,又开发一个Portable Standard Lisp(PSL)。它 是Lisp全新的实现。编译器是可重定对象的(regargetable)。这主要归功于它具有开创意义的编译技术:①用一个系统实现语言SYSLISP对无类型的Lisp表示进行编码;②采用了一个参 数化的汇编级翻译宏c-macro。PSL编译器将Lisp翻译成一个抽象的汇编语言,然后通过c-macro把其转换成机器相关的格式。在PSL程序开发环境方面,70年代后期和80年代初期也开 发了一些工具,如类似Emacs的多窗口编辑器等。到80年代中期,HP公司推出了PSL的商业版本。
PDP-10的地址空间问题使Lisp的发展受到阻碍,被后来问世的VAX系列取而代之。70年代后期在VAX机上开发了一系列Lisp方言:VAX InterLisp、Franz Lisp、NIL和移植到VAX上 的PSL。Franz Lisp是在Berkeley开发的,用于符号代数运算,几乎全部是用C语言写的。NIL是Jon L White等人设计的,它承袭了MacLisp,但受到了MIT的Lisp机的影响。1979年,在 Lawrrnce Livermere国家实验室制造的超计算机S-1 Mark ⅡA上实现,但不能实用,最终也没有被广泛采用。
IBM推出了两个Lisp方言:Lisp360和Lisp370。虽然最初Lisp是在IBM/7090上实现的,但IBM并没有成为领导Lisp的主流。主要原因是60年代早期,IBM和MIT在Lisp专利上产生了争 执,IBM寸步不让,导致MIT拒绝再用IBM机器开发Lisp而和DEC公司建立了良好的合作关系。这使IBM的Lisp开发受到影响。
Lisp360是在IBM360机上实现的,被广泛应用于大学教学。Lisp370是在IBM370上开发的,它有一个类似于InterLisp的开发环境。后来Lisp370称作Lisp/VM。Common Lisp出现以后 ,IBM不再支持Lisp370,转向支持Common Lisp在IBM370机上的实现。
还有其他一些Lisp方言。1975年,G.J.Sussman等人受到C.Hewitt的Actor理论的影响,设计了一个Lisp方言Scheme。在70年代中期,法国也开发了一个基于解释的Lisp方言VLisp 。这些Lisp方言几乎都没有产生过大的影响。
一直到80年代初期,开发Lisp的组织都是各唱各的戏。Lisp的发展没有形成一个统一的标准。1981年4月,ARPA召集了一个Lisp团体会议,讨论Lisp未来的发展方向,意在阻止Lisp 方言各自为政的纷呈现局面。InterLisp组织提出提供一个标准语言和标准环境,使未来的Lisp能运行在不同的计算机平台上;MacLisp组织要消除MacLisp的子孙Lisp方言之间的差别, 寻求技术上的统一。Common Lisp这一名字的提出也费了一番周折。因为它既不能偏袒任何一个Lisp方言,又要能表达对Lisp技术统一的愿望。关于Common Lisp技术的讲座是通过一 种奇特的方式进行的。Common Lisp的技术来自于许多Lisp方言设计者的共同努力,他们分布在美国不同地方的AI实验室和一些Lisp机器公司,频繁的技术交流是通过E-mail来完成的 。
虽然大家把主要的精力都集中Common Lisp但在Common Lisp1984年正式颁布以前,一些Lisp方言仍然在不断发展。Portable Standard Lisp被移植到VAX、DECsystem-20、MC680 00系列机和Cray-1上。Franz Lisp也被移植到许多系统上。Zetalisp是在Lisp机上发展的。在CMU,Scott Fahlman和他的同事设计并实现了一个类似MacLisp的Lisp方言SPICE Lisp 。不过这时Lisp方言的发展,不再是以前那样的纷繁复杂的Lisp方言的世界了。在所有这些Lisp方言中,更多地类似于MacLisp而不是InterLisp。
四、Common Lisp和Lisp的标准化时期(1984~1992)
Common Lisp的形成经历了大约四年的历程。Common Lisp是以"Common Lisp:The Language"(1984)的发布为其诞生标志的。在此之前进行了很多Lisp语言文本和技术上的努力 。1981年夏天,B.K.Steele开始编写Common Lisp手册(基于SPICELisp手册)。30多人的Common Lisp小组,一直在讨论Common Lisp的技术细节。直到1983年初,所有的技术细节才最后确定,Common Lisp语言也大抵达到了Common Lisp小组原定的目标:①公用性:成为一种公用的Lisp方言;②可移植性;③一致性:解释器和编译器应保证语义相同;④丰富的表达能力:吸取各种方言的优点;⑤兼容性:与Zetalisp、MacLisp和Interlisp兼容;⑥效率:提供一个优化编译器;⑦Common Lisp应是一个系统构造语言;⑧稳定性。
Common Lisp的出现表明Lisp世界第一次有了一个认同的标准,尽管它还不完美,却在计算机界产生了较大的影响。AI和Lisp相互推动,Common Lisp的逐渐流行伴随着AI研究的逐 步兴起。许多公司,包括DEC、HP、IBM、Sun、Apollo等一些著名的大公司和以前一些从事Lisp方言的公司,迅速成为Common Lisp的有力支持者。欧洲和日本一些公司 也加入了这一 行列。Lucid公司(Gabriel等创建),不依赖于任何其他Lisp方言,实现了Common Lisp。DEC和HP最后也选择了Common Lisp。
Common Lisp并不是一个国际标准,其本身也不完美。1985年DARPA(ARPA)要求其标准化,并提供面向对象、多任务、窗口系统、图形、外部函数接口和迭代支持。于是ANSI成立了 Common Lisp技术委员会X3J13讨论标准化问题。促成X3J13的主要原因是欧洲正在讨论它自已的Lisp(Eulisp)在ISO下的标准化。X3J13在讨论标准化期间,Common Lisp技术也有了很 大发展。1986年提出了Common Lisp Object System(CLOS),即支持面向对象的处理,1988年12月被X3J13毫无修改地接受了。其他的技术发展有迭代、条件系统(例外处理)、计值语义 的完善等。到1992年4月,X3J13提出了Common Lisp草案。
1987年,ISO成立了一个工作小组WG16,讨论Lisp的标准化、国际化。其目标是未来的Lisp方言应该具有商业价值的分层的Lisp,其内部是一个Kernel Lisp。在1992年ISO也草拟了 一个Kernet Lisp草案。
五、结束语
Lisp具有其他高级语言不可比拟的特征。它具有坚固的理论基础,丰富的表达能力,较强的可塑性,也提供了操作系统的许多设施,如命令解释器、文件管理、多任务等。所有这 些特征为符号计算和人工智能研究提供了一个方便的工具。Lisp也成为一个最主要的AI语言。
Lisp的发展不是直线的。很多人都被吸引到Lisp语言的研究与实现上,形成了许多Lisp方言。本文我们介绍了Lisp的进化过程,但不能够一一介绍所有的Lisp方言和它们的发展 历程。我们希望这篇文章能有助于对Lisp更广泛的认识和了解,并引起我们对Lisp语言的关注。(计算机世界报 1995年 第8期)
John McCarthy病逝编辑本段回目录
又一位大牛离我们而去。图灵奖获得者,Lisp语言的发明者,人工智能的奠基者之一,计算机科学家John McCarthy昨日病逝。John McCarthy生于美国马萨诸塞州波士顿,计算机科学家。他因在人工智能领域的贡献而在1971年获得图灵奖。实际上,正是他在1955年的达特矛斯会议上提出了“人工智能”这个概念。
麦卡锡发明了LISP并于1960年将其设计发表在《美国计算机学会通讯》(en:Communications of the ACM)上。他帮助推动了麻省理工学院的MAC项目(en:Project MAC)。然而,他在1962年了离开麻省理工学院,前往斯坦福大学并在那里协助建立了斯坦福人工智能实验室(en:Stanford Artificial Intelligence Laboratory),成为MAC项目多年来的一个友好的竞争对手。
他于1948年获得加州理工学院数学学士学位,1951年获得普林斯顿大学数学博士学位。分别短暂地为普林斯顿大学、斯坦福大学、达特茅斯学院和麻省理工学院供职后,麦卡锡于1962年-2000年底在斯坦福担任教授,退休后成为名誉教授。
访问:R.I.P. John McCarthy, father of AI, inventor of Lisp, suddenly at home last night.约翰·麦卡锡更多资料编辑本段回目录
John McCarthy ( 09/04/1927–)
图灵奖获得时间:1971年。 第六位图灵奖获得者 。
图灵奖引用(Turing Award Citation) :
Dr. McCarthy’s lecture “The Present State of Research on Artificial Intelligence” is a topic that covers the area in which he has achieved considerable recognition for his work.
“ ( 授 予 John MacCarthy图 灵 奖 ) MacCarthy博士的”人工智能研究的现状“一文充分体现了其在人工智能领域有目共睹的杰出的贡献。”
关于人工智能的一些介绍可参见:
Artificial Intelligence: http://en.wikipedia.org/wiki/Artificial_intelligence
Brief History of Artificial Intelligence:
http://www.aaai.org/AITopics/bbhist.html
http://www.answers.com/topic/history-of-artificial-intelligence
例外,McCarthy也是著名人工智能语言Lisp的发明者。关于Lisp的一些基本介绍可参见:
Lisp语言的主站: http://www.lisp.org/
Lisp的历史介绍(Brief History of the Lisp Language):
http://www.lisp.org/table/Lisp-History.html
Lisp的人们及其他一些教育资料:
http://www.lisp.org/alu/res-lisp-education
http://www.engin.umd.umich.edu/CIS/course.des/cis400/lisp/lisp.html
Turing Award Lecture (图灵奖演讲文章):
Generality in Artificial Intelligence. Commun. ACM 30(12): 1029-1035(1987)
此文直到1987年才被收集发表。
McCarthy在其Stanford大学的网页上,发布了其原文的修改稿。
http://www-formal.stanford.edu/jmc/generality/generality.html
http://www-formal.stanford.edu/jmc/generality.html
John McCarthy 简介:
McCarthy1927年9月出身于美国波士顿。1948年在加州理工大学(California Institute of Technology) 获得其数学学士位。 1951年资普林斯顿(Princeton University) 获得其数学博士学位。然后,McCarthy分别就职与普林斯顿,斯坦福(http://www.stanford.edu/ ), Dartmouth (http://www.dartmouth.edu/ )和MIT(http://www.mit.edu/ ) 。AI(人工智能)一词通常认为是McCarthy 1955年在DartMouth期间的一个会议上提出来的(http://en.wikipedia.org/wiki/Dartmouth_Conference )。 1962年,McCarthy加入坦福大学,并创建了斯坦福人工智能实验室,并一直领导着这方面的工作直到2000年退休。 McCarthy也是MIT 人工智能实验室的发起人之一。也是人工智能语言LISP的发明者。McCarthy 是Standford AI Lab 创办人。
John McCarthy Wiki: http://en.wikipedia.org/wiki/John_McCarthy_(computer_scientist)
参考文献编辑本段回目录
1 http://www.kexuejia.com/news/News_View.asp?NewsID=678
2 http://wiki.mbalib.com/wiki/äooå·¥æ™o能
3 http://www.douban.com/group/topic/5421388/
4 http://www.askmore.net/zh-tw/ço|翰·éo|å¡é”¡.htm
http://en.wikipedia.org/wiki/John_McCarthy_(computer_scientist)
http://www.tektalk.cn/
http://202.121.124.150/ec/C152/mjcad/LISP%20function/Lisp-dvl.htm