<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>冒号空间 &#187; 逻辑</title>
	<atom:link href="http://blog.zhenghui.org/tag/logic/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.zhenghui.org</link>
	<description>自然、人类、机器</description>
	<lastBuildDate>Fri, 30 Dec 2011 03:14:59 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>论思维的刚性与柔性（科学的迷信-3）</title>
		<link>http://blog.zhenghui.org/2010/09/20/hard-thinking-and-soft-thinking-3/</link>
		<comments>http://blog.zhenghui.org/2010/09/20/hard-thinking-and-soft-thinking-3/#comments</comments>
		<pubDate>Mon, 20 Sep 2010 13:45:18 +0000</pubDate>
		<dc:creator>hui</dc:creator>
				<category><![CDATA[思维]]></category>
		<category><![CDATA[刚性思维]]></category>
		<category><![CDATA[哲学]]></category>
		<category><![CDATA[数学]]></category>
		<category><![CDATA[数学哲学]]></category>
		<category><![CDATA[柔性思维]]></category>
		<category><![CDATA[混沌学]]></category>
		<category><![CDATA[科学]]></category>
		<category><![CDATA[科学哲学]]></category>
		<category><![CDATA[系统论]]></category>
		<category><![CDATA[逻辑]]></category>
		<category><![CDATA[量子力学]]></category>

		<guid isPermaLink="false">http://blog.zhenghui.org/?p=775</guid>
		<description><![CDATA[<b>论思维的刚性与柔性</b>——科学的迷信（3）<br/> • 科学是有局限的<br/> • 理性是有局限的 [...]]]></description>
			<content:encoded><![CDATA[<h1 style="text-align: center"><span style="font-family: 宋体">论思维的刚性与柔性（科学的迷信-3）</span></h1>

<head><link rel="stylesheet" href="http://blog.zhenghui.org/css/article.css" type="text/css"></head>
<!-- below comes from generated html -->   
<div lang="zh-CN" class="article" title="论思维的刚性与柔性"><div class="titlepage"><div><div><div class="author"><h3 class="author">郑晖</h3></div></div></div><hr /></div><div class="section" title="正文"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="content"></a>科学的迷信（3）</h2></div></div></div><p>
        </p><p>
            <span class="strong"><strong>五、科学是有局限的</strong></span>
        </p><p>
            18世纪末19世纪初，在科学的疾风劲吹之下，笼罩在大自然周围的迷雾渐渐散去，神学的绝对统治地位摇摇欲坠。值此科学盛景，拉普拉斯（Pierre-Simon Laplace）一语点睛：“宇宙现状是过去之果、未来之因。假如一位智者（后人称之为‘拉普拉斯妖’）知晓某一时刻所有导致自然运动的力和构成自然的所有物体的位置，那么他用一个公式就能描述所有物体（无论巨细）的运动。对他而言，万事皆定，将来如同过去一般历历在目”当被拿破仑问起为何在其科学著作中只字不提上帝时，这位在政治上一贯柔顺的人物表现出哲学上的刚强，再出豪言：“陛下，我不需要那个假设”
        </p><p>
            拉普拉斯道出了那个时代绝大部分科学家的心声，表达了用科学法则代替上帝法则作为宇宙主宰的信念和豪情。美中不足的是：虽然他拒绝上帝的假设，却也无法解释被牛顿归功于上帝的第一推动力。即便抛开这一点不说，他对科学力量的估计也是过于乐观了。您可能会说：这只能说明时代的局限，不能说明科学的局限。随着时代的发展，现代物理学不是弥补了经典物理学的不足吗？即使现代科学仍不够完善，以后还会继续发展的，科学仍具有无限的可能。此言颇为在理，不过我们在此要质疑的不是拉普拉斯时代的理论本身——现代人去苛责两个世纪前的理论，未免有失公允——而是理论背后的科学观，包括<span class="term">因果律</span>（causality）、<span class="term">决定论</span>（determinism）、<span class="term">还原论</span>（reductionism）、<span class="term">机械论</span>（mechanism）、<span class="term">实在论</span>（realism）、<span class="term">唯物论</span>（materialism），等等。以下我们将会看到，这些思想一方面在不同程度上受到现代科学的挑战，另一方面又在相当程度上为现代科学所倚重，正是这种刚性的需求和内蕴的矛盾折射出科学固有的局限性。
        </p><p>
            <span class="strong"><strong>1. 因果律与决定论</strong></span>            
        </p><p>
            因果律描述的是两个相继发生的事件之间的关系，前者为因（cause），后者为果（effect），并笃信凡事皆有因。决定论通常指<span class="term">因果决定论</span>（causal determinism），不仅主张“有果必有因”的反推，也主张“有因必有果”的正推，因而当前的一切可以决定今后的一切。（若用函数关系来刻画决定论，则可以抛弃因果概念——已知A得到B，不代表A是B的原因）<span class="term">强决定论者</span>（hard determinist）甚至把这一观点延伸到意识领域，从而否定<span class="term">自由意志</span>（free will）的存在。
        </p><p>
            为客观世界建立严格的、完整的因果链不仅是科学的基本原则，也是科学的永恒信念与终极目标。借助正反双向的因果链条，科学得以展现其巨大的魅力和威力，不仅能完美地解释过去，更能准确地预测未来，极大地提高了人类认识世界和改造世界的能力。实际上这正是拉普拉斯所推崇的思想，当然他的表述更加极端——所有的因果律甚至可归结为单个关于时间的微分方程。无奈越来越多的证据表明，这个宏大而诱人的理想很可能只是人类的一厢情愿。根据广义相对论，存在着一些<span class="term">时空奇点</span>（spacetime singularity），如宇宙大爆炸之初或黑洞中心，因果律将被无情破坏，现有的科学理论均告失效。除了这类极端情形外，<span class="term">放射性衰变</span>（radioactive decay）现象也令因果决定论者感到十分尴尬。人们发现放射性同位素的衰变速率丝毫不受外界因素的影响，其衰变过程也无法精确预测，具有完全的随机性（这种特性甚至被用来实现计算机上的随机数生成器）。待到量子力学的浪潮来袭之时，因果决定论更是受到前所未有的猛烈冲击。其中，最重要的两股力量分别来自<span class="term">哥本哈根解释</span>（Copenhagen interpretation）<a class="link" href="#note1"><sup>[1]</sup></a>中的<span class="emphasis"><em>玻恩定则</em></span>（Born rule）和不确定性原理<a class="link" href="#note2"><sup>[2]</sup></a>。前者通过对描述微观粒子状态的<span class="term">波函数</span>（wave function）的概率诠释，正面向决定论宣战：即使人们能准确地测量电子的一切初始状态，依然不能准确地预测其将来的位置。后者则干脆从理论上断绝了绝对准确测量的可能性，从而让拉普拉斯的理想彻底化为泡影。量子力学的巨大成功迫使许多决定论者退而求其次，不再坚持严格意义上的因果决定论，转而支持概率意义上的因果决定论。还有人试图在宏观领域坚守决定论的阵地，理由是量子力学仅仅描述了微观领域的规律。然而薛定谔（Erwin Schrödinger）为对付哥本哈根派而放出的一只猫（Schrödinger’s cat）<a class="link" href="#note3"><sup>[3]</sup></a>——尽管只是思想实验——在半死不活的呻吟中，把不确定性的幽灵从微观世界放逐到了宏观世界。
        </p><p>
            量子力学从理论上否定了因果决定论，而混沌学进一步从实践上否定了因果决定论。前者虽然在哲学意义上更深刻，但毕竟不是终极理论,不少人依然心存侥幸，指望有朝一日出现更完备的理论，如<span class="term">隐变量理论</span>（hidden variable theory），足以把一切不确定性从科学的领域中驱除。曾为量子力学奠基人之一的爱因斯坦便是其中的一员，他用“上帝不是在掷骰子”来表达对决定论坚定不移的信念。从实用的角度看，混沌学的破坏力更大，因为它获得了无可置疑的数学支持。混沌系统有一个显著的特点，即系统对初始条件具有敏感依赖性。一个通俗的比喻是：一只蝴蝶在巴西扇动翅膀，有可能在北美引发一场飓风。这未免有些艺术夸张了，与此有关的更现实的一个说法是：长期的天气预报是不可能的。混沌现象最令人惊奇之处在于，不确定性竟可产生于一个确定性系统，这与量子世界内禀的不确定性大相异趣。以著名的<span class="term">三体问题</span>（three-body problem）为例：假设宇宙仅由太阳、地球和月亮三个物体组成，它们遵循牛顿运动定律和万有引力定律。在已知三体各自的质量、初始位置和速度的情况下，求解它们的运动规律。很明显，这是拉普拉斯的决定论系统的一个极简版本。可就是这样一个貌似简单的系统，不仅没有显式解析解，而且运动轨道异常复杂，既不是周期的，也不是稳定的<a class="link" href="#note4"><sup>[4]</sup></a>。任何偶然的外界干扰、微小的测量误差或计算精度的损失，都可能对结果产生重大影响，真可谓“差之毫厘，谬以千里”。更何况，真实的宇宙中天体多如恒河沙数，怎一个“混沌”了得？由此可见，混沌系统即使在理论上遵循因果律，也能造成因果链条事实上的扭曲或断裂，最终削弱科学引以为傲的预测力。
        </p><p>
            <span class="strong"><strong>2. 还原论与机械论</strong></span>            
        </p><p>
            如果说因果律是科学研究的基本信念，那么还原论（或简化论）便是科学研究的基本方法<a class="link" href="#note5"><sup>[5]</sup></a>。为了研究一个复杂的现象或系统，还原论的方法是：将其分解为多个组成部分，通过对部分的研究获得对原先整体的认识。如果把该方法从广度上应用于整个宇宙，从深度上应用于基本粒子，那么世界上的一切现象均可归结为基本粒子的运动。哪怕是高级的生命运动，最终也不过是一些低级的机械运动的组合。这正是拉普拉斯的预设，它直接导致了机械论，即世界无非是一架机器，或者是一座精密而准确的时钟。上帝如果还有存在的价值，那就是为这座钟事先上好发条。反过来，机械论也让还原论有了逻辑的基础——神秘存在于细节之中，只要孜孜不倦地解析每个现象，一切神秘将无所遁形。
        </p><p>
            还原论和机械论一直以来都是科学发展中的主导思想，前者为科学提供方法，后者为科学提供目标。可以说，科学的每一次进步都离不开还原论——观察、实验、分析、抽象无不渗透着还原思想的精髓；科学的每一次进步又坚定了机械论——那些曾神秘莫测的现象在科学的解剖之下显现出机器的骨骼。
        </p><p>
            就在还原论和机械论合力把科学推向巅峰之时，渐现力有未逮的迹象。考察一个简单的事实：一滴水中的分子数超过10<sup>21</sup>个<a class="link" href="#note6"><sup>[6]</sup></a> 。即使世间所有现象真的可以还原为基本粒子的机械运动，谁又会指望通过计算每个粒子的行为来获取宇宙的规律呢？正是考虑到这一点，玻尔兹曼（Ludwig Boltzmann）在研究气体分子运动时，首次把代表不确定性的概率统计引入号称严密的物理学。尽管宏观的热力学被成功地还原为微观的统计力学，但却付出了确定性的代价，让机械论变得可望而不可即。在此，还原论还遇到一个实质性的困难，即<span class="term">可逆性佯谬</span>（reversibility paradox）：宏观的热力学过程是<span class="term">不可逆的</span>（irreversible）（比如高温物体向低温物体传热的过程），而微观的粒子运动却是<span class="term">可逆的</span>（reversible）。
        </p><p>
            量子力学依旧扮演着颠覆者的角色。统计力学和混沌学中的随机性尚可归于主观因素（例如研究者的计算能力不足），而量子力学中的随机性则完全是客观的，这是对机械论更为致命的打击。另外，存在于量子过程以及测量过程中的整体性（wholeness）或不可分性（individuality）也与还原论的局部分割思想格格不入。
        </p><p>
            还原论的方法包含分解与整合两个基本步骤。先看分解过程，它依赖于一个隐性假设：事物分解到一定层次后，问题将变得足够简单。如若不然，分解岂非无休无止？可当人们把纷繁芜杂的宏观世界还原到微观世界，才惊讶地发现那里的随机性和复杂性似乎不减反增。分形（fractal）中具有<span class="term">自相似性</span>（self-similarity）的几何图形更绝，无论把它分割成多少份，局部的复杂度与整体的复杂度完全相同！可见，分解层次的深入并不能保证复杂性的消减。此外，分解过程还有一个要求，即分解的各部分之间尽可能互不干扰，以便各个击破，此谓<span class="emphasis"><em>分而治之</em></span>（divide and conquer）。但由于事物的普遍联系性，该要求不可能完全满足（例如三体问题就不可能简单地还原为二体问题）。为了贯彻还原论的方法，必然会有意忽略组成部分之间的一些关联，而这种忽略产生的偏差在某些情况下是无法忽略的（比如在一个混沌系统中）。
        </p><p>
            整合过程同样并非易事。一种情形是分解过细而造成整合困难，比如刚才提到的热力学问题。另一种情形是分解过程中丢失了部分组成要素或关系信息，导致完整性的缺失而无法忠实地反映原有的整体特性。退一步说，即使分解后毫发无损，还原也未必有效。还原论的核心思想是“整体等于部分之和”，这在整体是部分的简单线性叠加的情形下无疑是正确的。但在非线性系统中，整体有可能大于部分之和。比如，一个极为简单的非线性迭代函数也可能产生整体上的混沌。再如<span class="term">系统论</span>（systems theory）中的<span class="term">复杂系统</span>（complex system）<a class="link" href="#note7"><sup>[7]</sup></a>，其特点是：在组成个体之间、系统与外界环境之间动态的相互作用之下，系统通过<span class="term">自组织</span>（self-organization）能产生个体所不具备的、全新的整体性特征，即术语所称的<span class="term">涌现</span>（emergence）。一个有趣的例子来自蚁群。研究发现，尽管蚁后并不统一发号施令，每个蚂蚁的行为均是自发的，相互的交流也是局部的，但整体蚁群却表现出惊人的宏观智能，比如发现运送食物的最短路径、处置尸体的最佳位置等。其他常见的复杂系统还有：神经系统、生态系统、社会系统、股票市场，等等。值得一提的是，宇宙飞船、超级计算机等系统尽管复杂，却不属于复杂系统，只能称为<span class="emphasis"><em>复合</em></span>（complicated）系统。因为从它们的个体中便能获得系统的完整描述，换言之，它们是可还原的。
        </p><p>
            在学科层面上，还原论主张：政治学还原为社会学，社会学还原为心理学，心理学还原为生物学，生物学还原为化学，化学还原为物理学。但事实上，每门学科在自身所在的层次上皆有其独有的特性、概念、法则和方法，将其还原为更底层学科经常是徒劳无益——除了滋长还原论者、机械论者以及物理学家们的优越感以外。
        </p><p>
            人们终于认识到还原论失效的症结所在：它在灵巧地挥舞着解剖刀时，常常会不经意地斩断整体的联络经脉，从而阉割了整体原有的有机特质。庖丁的手再巧、刀再利，也不可能把肢解的牛体拼回原样。于是作为与还原论相对的<span class="term">整体论</span>（holism）开始获得重视，一批以整体论为主体思想的系统理论随之兴起，如“老三论”（一般系统论、控制论和信息论）、“新三论”（耗散结构论、协同论、突变论）等。尽管如此，科学追本溯源的本性和对定量、精确的内在需求决定了还原论始终会占主导地位。无论人们多么不情愿将血肉之躯等同于冰冷无情的机器，也无论机械论在诠释生命现象中如何屡屡碰壁，科学也不会放弃把灵感、冲动、自由意志乃至社会现象还原为基本粒子碰撞的努力。
        </p><p>
            <span class="strong"><strong>3. 实在论与唯物论</strong></span>
        </p><p>
            现代科学与实证科学几乎是同义词，实证对于科学的重要性不言而喻。实证基于一个前提：科学研究的对象是不依赖观察或测量的。从哲学上说，这是一种实在论的体现，即相信客观世界是完全不依赖于主观而独立存在的。与其说实在论是科学的一种信念，不如说是一种方便的假设。试想，假若实验对象的本来性质因观测而改变，甚至压根不存在所谓的本来性质，那么以实验为基石的科学还能真实地反映客观规律吗？这可绝非庸人自扰。不确定性原理已经表明，观察行为的确会对观察对象产生影响。不仅如此，玻尔（Niels Bohr）用<span class="term">互补原理</span>（complementary principle）来解释<span class="term">波粒二象性</span>（wave-particle duality）时指出：电子是波还是粒子完全取决于观察方式。一时间古典的幻梦被打碎，科学一直执着追寻的世界“本来”面目陡然间失去了意义。不仅传统<span class="term">认识论</span>中的主客体分离模式被打破，而且贝克莱（George Berkeley）主教那句曾被无数唯物主义者嘲笑的“存在即被感知”的名言竟然隐隐散发出真理的光辉，<span class="term">本体论</span>（ontology）中的唯物论因此受到灼伤，这让机械还原论者情何以堪？他们可是主张把包括精神在内的一切现象都还原为物质形式的啊。如果再考虑那只薛定谔的猫和从中引申出的<span class="term">魏格纳的朋友</span>（Wigner&#8217;s friend）<a class="link" href="#note8"><sup>[8]</sup></a>，主观与客观、物质与意识、实在与虚无之间的界限就更加模糊了。
        </p><p>
            量子力学尽管理论优美且久经考验，但它对科学所信赖和依靠的因果律、还原论和实在论的挑战超出了常人的直觉和底线。出于对量子理论完备性的怀疑，爱因斯坦等人提出了<span class="term">EPR佯谬</span>（EPR paradox）<a class="link" href="#note9"><sup>[9]</sup></a>。遗憾的是，阿斯派克特（Alain Aspect）等人设计出违反<span class="term">贝尔不等式</span>（Bell&#8217;s inequality）的实验，最终化解了EPR的责难。结果，<span class="term">定域实在论</span>（local realism）被否定，定域性和实在性鱼与熊掌不可兼得。假如一定要坚持实在论，便不能阻止类似心灵感应的超距作用幽灵般地出现，而这对现有科学框架的威胁也不遑多让。
        </p><p>
            <span class="strong"><strong>六、理性是有局限的</strong></span>
        </p><p>
            科学的局限一方面归因于客观世界的复杂多变，另一方面则归因于人类理性的先天贫弱。须知整个太阳系在宇宙中也不过是沧海一粟，一个人需要何等的无知和狂妄才喊得出“人定胜天” <a class="link" href="#note10"><sup>[10]</sup></a>口号啊。诚如帕斯卡（Blaise Pascal）所说：“理性所走的最后一步就是承认有无穷多的事物超出了其认识范围”康德在《纯粹理性批判》里曾系统地揭示了理性的局限，尤其书中四个<span class="term">二律背反</span>（antinomy）反映了人类在时空观、还原论、因果律等方面的认识困境，绝不是单纯的辩证法所能消解的。
        </p><p>
            最能体现理性局限的是数学和逻辑学。虽然二者名义上被划归<span class="term">形式科学</span>（formal science）的范畴，但如果用可证伪性来衡量，它们并不属于科学。尽管如此，由于数学和逻辑学是所有<span class="term">经验科学</span>（empirical science）的基石，它们的局限必然也是科学的终极局限。更关键的是，作为纯粹心智的产物，所有的数学结论和逻辑推理均是先验的，与经验事实无关（但可能受经验事实的启示），没有被未来实验推翻的可能<a class="link" href="#note11"><sup>[11]</sup></a>，因而它们的局限将是理性无法逾越的终极局限。
        </p><p>
            历史上，数学家们几乎在同样的时刻犯了与物理学家们同样的错误。1900年开尔文勋爵（本名William Thomson）在英国皇家学会的新年致辞中宣称物理的主体建设已毕，只剩下修修补补的工作了<a class="link" href="#note12"><sup>[12]</sup></a>。虽然他观察到晴空万里的物理世界有两朵不和谐的乌云，却不曾想它们竟让这门学科陷于风雨飘摇之中。无独有偶，同年庞加莱在国际数学大会上自豪地宣称数学上绝对的严密已经实现，再次把大厦将竣的宣言变成了大厦将倾的预言。不久，<span class="term">罗素悖论</span>（Russell&#8217;s paradox）<a class="link" href="#note13"><sup>[13]</sup></a>撼动了数学的根基——集合论，引发了数学史上的第三次危机。人们沮丧地发现，理性的精确性和确定性不仅在物理中丧失了，甚至在数学上也不能幸免。更令科学家们感到困窘的是，他们的争论最后都不可避免地超出了科学或数学的范畴，进入到哲学领域。物理上的哲学分歧此前已有涉及，下面简单介绍一下二十世纪初的三大数学哲学流派：<span class="term">逻辑主义</span>（logicism）、<span class="term">直觉主义</span>（intuitionism）和<span class="term">形式主义</span>（formalism）。
        </p><p>
            逻辑主义认为数学可还原为逻辑，故而只是逻辑的扩展。然而，逻辑派所依赖的一些公理如<span class="term">无穷公理</span>（axiom of infinity)、<span class="term">选择公理</span>（axiom of choice）、<span class="term">可约性公理</span>（axiom of reducibility）等却备受争议。它们的逻辑性、合理性乃至真理性并非都是自明的，它们的选定更非逻辑的产物。尤其是，逻辑主义将数学完全归结于逻辑，不仅抹煞了二者之间的界限，而且无法解释一个根本性的问题：一个纯粹靠逻辑演绎的学科为何能广泛而有效地应用到自然科学？或者说，在思维完全从自然脱离之后，思维规律何以与自然规律保持一致？此外，逻辑主义把整数建立在逻辑之上，但在此之前实质上已涉及了整数概念，涉嫌循环论证。
        </p><p>
            与逻辑主义针锋相对的是直觉主义。前者竭力依赖逻辑，后者竭力摆脱逻辑而诉诸直觉。直觉派虽不否认逻辑的必要性，但反对把逻辑作为真理的来源。他们认为逻辑推导并不比直接感悟更可靠，与其遵守外在的形式化的逻辑规则，不如遵从来自内心的理性约束。由于坚持数学对象是智力构造的产物，直觉主义只承认<span class="emphasis"><em>构造性</em></span>（constructive）的陈述和证明，因而拒绝<span class="term">实无穷</span>（actual infinity），排斥选择公理，反对在无穷集合中使用排中律（即任何命题非真即假）。但如此一来，雄伟的数学宫殿虽不至土崩瓦解，也只剩断壁残垣了。难怪希尔伯特（David Hilbert）抗议道，限制数学家使用排中律正如限制天文学家使用望远镜。除了实用性上的局限，直觉主义在理论上也存在不足：人类的直觉很难清晰地界定，更不能保证绝对的正确。
        </p><p>
            如果要考问何处方能寻得严密可靠的数学，逻辑主义会回答：在逻辑里，直觉主义会回答：在头脑中，而形式主义会回答：在纸面上。以希尔伯特为首的形式派主张抽去数学的一切实际意义，将之彻底形式化为符号操作的游戏。形式主义面临与逻辑主义相似的诘难：毫无意义、脱离实际的符号为何能与经验世界相契合？再者，既然一切都是同样空洞的符号，那么选择某些特定公理系统的理由是什么呢？对此形式派虽不十分坦然，但仍着力打造一套完备而相容的<span class="term">形式系统</span>（formal system），以将所有数学尽囊其中。可惜，哥德尔（Kurt_Gödel）的两个<span class="term">不完备定理</span>（Gödel&#8217;s incompleteness theorems）如同两盆冷水把他们从美梦中浇醒。原来，任何一个包含初等数论的形式系统，如果是相容的——不包含任何矛盾，则必是不完备的——存在既不能证明又不能否证的命题；事实上，该系统自身的相容性就是无法（在系统内部）证明的。素以绝对精确、永远正确著称的数学居然无法摆脱不确定的阴影，人类的理性受到空前的质疑，这无疑是值得惋惜的。可是，充满灵性和创造力的数学思维没能沦为符号化的机械程序，人类的理性受到应有的尊重，无疑又是值得庆幸的。
        </p><p>
            哥德尔定理不仅暗示人类不可能一劳永逸地获取所有的数学真理，同样也为基于形式系统的计算机科学<a class="link" href="#note14"><sup>[14]</sup></a>设置了天花板（数学家们松了口气，尊严和饭碗同时保住了）。例如，<span class="term">图灵停机问题</span>（Turing’s halting problem）堪称计算机科学版的哥德尔定理。让人难以置信的是，这类<span class="emphasis"><em>不可计算</em></span>（incomputable）或<span class="emphasis"><em>不可判定</em></span>（unsolvable）的问题非但不是孤例，而且远远多于可计算或可判定的。用数学语言来说，前者是<span class="term">不可数的</span>（uncountable），后者是<span class="term">可数的</span>（countable）。从这个意义上说，电脑虽是人脑的延伸，但延伸的范围非常有限，可以当拐杖却不能当翅膀。
        </p><p>
            独立于经验的理性（即康德所谓的“纯粹理性”）可贵之处在于，它超越了人类肉身的物理局限，能析天地之理，察万物之变。但理性有一个最大的障碍：<span class="term">无穷</span>（infinity）。 从芝诺（Zeno of Elea）关于运动的一系列悖论（阿基里斯与龟、二分法、飞矢不动等），到康德关于时间与空间、复合与单纯、原因与结果等一系列的二律背反，从贝克莱的无穷小悖论，到康托（Georg Cantor）的最大<span class="term">基数</span>（cardinal number）悖论，无穷总如巨大的黑洞，一再吞噬着理性的光辉。数学家们对无穷的态度完全可以用爱恨交加来形容。一方面，无论从研究对象还是研究手段的角度看，数学都离不开无穷；另一方面，无穷又是滋生悖论和争议的温床，这从数学史上的三次危机以及三大数学流派之间的分歧即可看出。以选择公理为例，它可通俗地描述为：任给若干装球的盒子，总能从每个盒中各选出一只球来。如果盒子数量有限，选择自然不成问题，但如果盒子数量是无限的呢？大多数数学家承认此公理，事实上他们总在有意无意地使用它。不过包括直觉主义在内的<span class="term">构造主义</span>（constructivism）却认为这种所谓的选择过于抽象，不具备可构造性，故拒不接受。特别当他们发现选择公理会导出一些违背直觉的结论时，反对的声音就更大了。比如基于选择公理的<span class="term">分球怪论</span>（Banach-Tarski paradox）<a class="link" href="#note15"><sup>[15]</sup></a>听起来就十分荒诞：可以把一个三维实心球拆成有限块，经过旋转和平移后拼出与原球大小相同的两个球！<a class="link" href="#note16"><sup>[16]</sup></a>很显然，在无穷的问题上，存储容量和计算速度均为有限的电脑照旧不能给人脑提供实质性的帮助。
        </p><p>
            理性的另一个常见障碍是<span class="term">自指</span>（self-reference）。从逻辑上的说谎者悖论（“我在说谎”），到数学上的罗素悖论、哥德尔定理，到计算机科学上的停机问题，乃至哲学上康德的二律背反（用理性来研究理性本身），自指屡屡让理性陷入“狗咬尾巴”的怪圈。人们开始意识到，理性必须适当舍弃过于宏大的“叙事风格”，谨慎地对待原先惯用的“所有”、“一切”等字眼。但这就意味着，理性要想打开自指的死结，须先打开自身的缺口（颇有点“欲练神功，必先自宫”的味道）。
        </p></div><div class="section" title="注释"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="note"></a>注释</h2></div></div></div><div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem"><p><a name="note1"></a>
                    可参见<a class="link" href="http://en.wikipedia.org/wiki/Copenhagen_interpretation" target="_top">http://en.wikipedia.org/wiki/Copenhagen_interpretation</a>。
                </p></li><li class="listitem"><p><a name="note2"></a>
                    原来的译法（“测不准原理”）有些不妥，会让人误以为物理量本身是确定的，只是测不准而已。
                </p></li><li class="listitem"><p><a name="note3"></a>
                    可参见<a class="link" href="http://en.wikipedia.org/wiki/Schr%C3%B6dinger%27s_cat" target="_top">http://en.wikipedia.org/wiki/Schr%C3%B6dinger%27s_cat</a>。
                </p></li><li class="listitem"><p><a name="note4"></a>
                    人们如此关心三体问题的稳定周期解还有一个重要原因：如果微小的扰动就会导致太阳离地球而去，或月球与地球相撞，那人类该多么没有安全感啊。
                </p></li><li class="listitem"><p><a name="note5"></a>
                    还原论既可作为一种哲学观点，也可作为一种研究方法。此处采用后者之意。
                </p></li><li class="listitem"><p><a name="note6"></a>
                    假设一滴水是0.05毫升，则含水分子个数为0.05/18×阿伏加德罗常数≈1.67×10<sup>21</sup>。
                </p></li><li class="listitem"><p><a name="note7"></a>
                    请勿将复杂系统与混沌系统混为一谈。二者尽管都具有非线性、不可预测性和复杂性，但后者对初始条件极度敏感，而前者虽然具有活跃性，但也具有一定的稳定性，以维持系统自身的生存。
                </p></li><li class="listitem"><p><a name="note8"></a>
                    可参见<a class="link" href="http://en.wikipedia.org/wiki/Wigner%27s_friend" target="_top">http://en.wikipedia.org/wiki/Wigner%27s_friend</a>。
                </p></li><li class="listitem"><p><a name="note9"></a>
                    可参见<a class="link" href="http://en.wikipedia.org/wiki/EPR_paradox" target="_top">http://en.wikipedia.org/wiki/EPR_paradox</a>。
                </p></li><li class="listitem"><p><a name="note10"></a>
                    “人定胜天”一词可能有不同的解读，这里采用最常见的词义。
                </p></li><li class="listitem"><p><a name="note11"></a>
                    由于数学证明越来越复杂，或许某个数学定理会被错误地证明并接受，但这不也说明了理性的局限吗？
                </p></li><li class="listitem"><p><a name="note12"></a>
                    原话是：There is nothing new to be discovered in physics now. All that remains is more and more precise measurement。
                </p></li><li class="listitem"><p><a name="note13"></a>
                    罗素悖论的一个通俗版本是理发师悖论：一位理发师声称他给且只给任何不给自己刮脸的人刮脸，请问他该不该给自己刮脸？
                </p></li><li class="listitem"><p><a name="note14"></a>
                    计算机科学也属于形式科学。
                </p></li><li class="listitem"><p><a name="note15"></a>
                    严格说来，应称为“分球定理”。只是因为它有悖常识，才被称为“怪论”或“悖论”。
                </p></li><li class="listitem"><p><a name="note16"></a>
                    该定理更强的形式可让一个乒乓球大小的球体组合成地球大小的球体。
                </p></li></ol></div></div></div>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.zhenghui.org%2F2010%2F09%2F20%2Fhard-thinking-and-soft-thinking-3%2F&amp;title=%E8%AE%BA%E6%80%9D%E7%BB%B4%E7%9A%84%E5%88%9A%E6%80%A7%E4%B8%8E%E6%9F%94%E6%80%A7%EF%BC%88%E7%A7%91%E5%AD%A6%E7%9A%84%E8%BF%B7%E4%BF%A1-3%EF%BC%89" id="wpa2a_2">分享/保存</a></p><h3  class="related_post_title">相关文章</h3><ul class="related_post"><li>2011年07月12日 -- <a href="http://blog.zhenghui.org/2011/07/12/hard-thinking-and-soft-thinking-4/" title="论思维的刚性与柔性（科学的迷信-4）">论思维的刚性与柔性（科学的迷信-4）</a> (0)</li><li>2010年04月22日 -- <a href="http://blog.zhenghui.org/2010/04/22/hard-thinking-and-soft-thinking-2/" title="论思维的刚性与柔性（科学的迷信-2）">论思维的刚性与柔性（科学的迷信-2）</a> (0)</li><li>2010年04月19日 -- <a href="http://blog.zhenghui.org/2010/04/19/hard-thinking-and-soft-thinking-1/" title="论思维的刚性与柔性（科学的迷信-1）">论思维的刚性与柔性（科学的迷信-1）</a> (0)</li><li>2010年04月2日 -- <a href="http://blog.zhenghui.org/2010/04/02/hard-thinking-and-soft-thinking-0/" title="论思维的刚性与柔性（前言）">论思维的刚性与柔性（前言）</a> (44)</li><li>2010年06月3日 -- <a href="http://blog.zhenghui.org/2010/06/03/advice-on-programmer/" title="答读者问(1)——对程序员的一些个人建议">答读者问(1)——对程序员的一些个人建议</a> (6)</li><li>2009年10月16日 -- <a href="http://blog.zhenghui.org/2009/10/16/preface-of-colonclass/" title="《冒号课堂》自序">《冒号课堂》自序</a> (7)</li><li>2009年09月15日 -- <a href="http://blog.zhenghui.org/2009/09/15/colon-class-4_2/" title="冒号课堂§4.2：逻辑范式">冒号课堂§4.2：逻辑范式</a> (0)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://blog.zhenghui.org/2010/09/20/hard-thinking-and-soft-thinking-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>冒号课堂§4.2：逻辑范式</title>
		<link>http://blog.zhenghui.org/2009/09/15/colon-class-4_2/</link>
		<comments>http://blog.zhenghui.org/2009/09/15/colon-class-4_2/#comments</comments>
		<pubDate>Tue, 15 Sep 2009 05:00:43 +0000</pubDate>
		<dc:creator>hui</dc:creator>
				<category><![CDATA[冒号课堂]]></category>
		<category><![CDATA[Prolog]]></category>
		<category><![CDATA[控制]]></category>
		<category><![CDATA[算法]]></category>
		<category><![CDATA[编程范式]]></category>
		<category><![CDATA[逻辑]]></category>
		<category><![CDATA[逻辑式编程]]></category>

		<guid isPermaLink="false">http://blog.zhenghui.org/?p=421</guid>
		<description><![CDATA[<b>逻辑范式</b>——当算法失去了控制（<em>再谈逻辑式编程</em>）<br/> • 评价代码的复杂度，长短只是一个因素。程序员不是打字员，花在思考上的时间和精力远远超过花在键盘上<br/> • 算法=逻辑+控制。其中逻辑是算法的核心，控制主要用于改进算法的效率 [...]]]></description>
			<content:encoded><![CDATA[<h1 style="text-align: center"><span style="font-family: 宋体">冒号课堂</span></h1>
<strong><span style="font-size: 13pt; font-family: 宋体">第四课 重温范式(2)</span></strong>

<!-- below comes from generated html -->
<head><link rel="stylesheet" href="http://blog.zhenghui.org/css/colonclass.css" type="text/css"></head>

<div lang="zh-CN" class="article" title="逻辑范式"><div class="titlepage"><div><div><h1 class="title"><a name="id599676"></a>4.2 逻辑范式——当算法失去了控制</h1></div><div><div class="author"><h3 class="author">郑晖</h3></div></div><div><div class="abstract" title="摘要"><p class="title"><b>摘要</b></p><p>再谈逻辑式编程</p></div></div></div><hr /></div><div class="toc"><p><b>目录</b></p><dl><dt><span class="section"><a href="#preview">！预览</a></span></dt><dt><span class="section"><a href="#question">？提问</a></span></dt><dt><span class="section"><a href="#explaination">：讲解</a></span></dt><dt><span class="section"><a href="#note">，插语</a></span></dt><dt><span class="section"><a href="#summary">。总结</a></span></dt><dt><span class="section"><a href="#reference">“”参考</a></span></dt></dl></div><div class="epigraph"><div class="literallayout"><p>道常无为而无不为</p></div><div class="attribution"><span>—<span class="attribution">《老子•道经》</span></span></div></div><div class="section" title="！预览"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="preview"></a>！预览</h2></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>
                    评价代码的复杂度，长短只是一个因素。程序员不是打字员，花在思考上的时间和精力远远超过花在键盘上
                </p></li><li class="listitem"><p>
                    算法=逻辑+控制。其中逻辑是算法的核心，控制主要用于改进算法的效率
                </p></li></ul></div></div><div class="section" title="？提问"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="question"></a>？提问</h2></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>衡量软件复杂度是由代码的长度决定的吗？</p></li><li class="listitem"><p>为什么逻辑式的编码一般比过程式的更简洁？</p></li><li class="listitem"><p>逻辑式编程相比命令式编程有哪些优势和劣势？</p></li></ul></div></div><div class="section" title="：讲解"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="explaination"></a>：讲解</h2></div></div></div><p>
            问号提出：“逻辑式编程不是也很特别吗？前面似乎介绍得也不多。”
        </p><p>
            “那我们就用逻辑式语言Prolog再实现一次quicksort吧。”冒号说着将幻灯片翻页——
        </p><div class="informalexample"><pre class="programlisting">
/*快速排序法的Prolog实现 */
/* 定义划分法 */
partition(_,[],[],[]).                             /* 划分递归终点 */
partition(Pivot,[X|Rest],[X|Small],Big) :- 
X &lt; Pivot, partition(Pivot,Rest,Small,Big).        /* 比基准小的归入Small */
partition(Pivot,[X|Rest],Small,[X|Big]) :- 
X &gt;= Pivot, partition(Pivot,Rest,Small,Big).       /* 比基准大的归入Big */

/* 定义排序法 */
qsort([],[]).                                      /* 排序递归终点 */
qsort([Pivot|Rest],Sorted) :- 
partition(Pivot,Rest,Small,Big),                   /* 按基准划分子列 */
      qsort(Small,SortedSmall),                    /* 对前面的子列递归 */
      qsort(Big,SortedBig),                        /* 对后面的子列递归 */
      append(SortedSmall,[Pivot|SortedBig],Sorted)./* 子列合并 */ </pre></div><p>
            逗号挠挠头：“看不太懂哦，好在我记住了您的一句话：容忍无知。我忍了！”
        </p><p>
            大伙都乐了。
        </p><p>
            “本节课的焦点不是语言而是范式，因此对Prolog代码不详加解说。我只简单地说三点：首先，Prolog代码是由一系列事实（fact）、规则（rule）和查询（query）语句组成的<a class="link" href="#note1"><sup>[1]</sup></a>。其次，与大多数语言不同的是，大写字母或下划线开头的标识符是变量，其他的是常量或函数。请注意，这不是约定俗成，而是语法规定。最后，符号‘:-’等价于if；逗号‘,’等价于and。比如，我们可以用Prolog来表达一个断言：如果一个人未婚且为男士，那么他就是一光棍。”冒号转身在黑板上写下——
        </p><div class="informalexample"><pre class="programlisting">
/* X is bachelor if X is unmarried and male*/
bachelor (X) :- unmarried(X) , male(X). </pre></div><p>
            听见下面一阵嘀咕声，冒号忽地闪过一个念头：这个例子该不会触动了满足条件的某位同学的心事吧？顿了一会，继续说道：“逻辑式实现的排序虽不比函数式更简洁，但比起过程式来还是绰绰有余的。毕竟同属声明式，省去了不少有关变量赋值、迭代和流程控制方面的代码。我们再看一个更加典型的范例。”
        </p><p>
            黑板上出现了一幅树状图形——
        </p><div class="figure"><a name="id597056"></a><p class="title"><b>图4-1. 家谱</b></p><div class="figure-contents"><div class="mediaobject"><img src="http://blog.zhenghui.org/img/colonclass/figure4-1.jpg" alt="家谱"></div></div></div><br class="figure-break"><p>
             冒号简作说明：“这是一个三代家谱图。已知每人的性别和父辈，要求判断任意两人之间的关系。我们先用Java来试一试——”
        </p><div class="informalexample"><pre class="programlisting">
class Person
{
    private Person parent;
    private boolean isMale;

    public Person(Person parent, boolean isMale)
    {
        this.isMale = isMale;
        this.parent = parent;
    }

    private boolean isSibling(Person other)
    {
        return parent == other.parent &amp;&amp; parent != null &amp;&amp; this != other;
    }

    public String getRelation(Person other)
    {
        if (other == null || this == other) return null;

        if (parent == other) return isMale ? "son" : "daughter";

        if (other.parent == this) return isMale ? "father" : "mother";

        if (parent == null) // this是老祖宗
        {
            if (other.parent == null) return null;

            if (other.parent.parent == this) return isMale ? "grandfather" : "grandmother";

            return null;
        }

        if (other.parent == null) // other是老祖宗
        {
            if (parent.parent == other) return isMale ? "grandson" : "granddaughter";

            return null;
        }

        // 非直系
        if (isSibling(other)) return isMale ? "brother" : "sister";

        if (parent.isSibling(other.parent)) return "cousin";

        if (parent.isSibling(other)) return isMale ? "nephew" : "niece";

        if (isSibling(other.parent)) return isMale ? "uncle" : "aunt";

        return null;
    }

    public static void main(String[] args)
    {
        Person a = new Person(null, true);
        Person b = new Person(a, true);
        Person c = new Person(a, true);
        Person d = new Person(a, false);
        Person e = new Person(b, false);
        Person f = new Person(b, true);
        Person g = new Person(c, false);
        Person h = new Person(d, true);
        Person i = new Person(d, false);
        Person j = new Person(d, true);
        // 以下省略。。。
     }
}</pre></div><p>
            “这段代码很平凡，毋需多言。再来看看逻辑式语言的做法。”冒号不愿过多地纠缠于细节，随即又换成了Prolog代码——
        </p><div class="informalexample"><pre class="programlisting">
/* 规则 */
/* 上下两代直系关系 */
father(X,Y)        :- parent(X,Y), male(X).
mother(X,Y)        :- parent(X,Y), female(X).
child(X,Y)         :- parent(Y,X).
son(X,Y)           :- parent(Y,X), male(X).
daughter(X,Y)      :- parent(Y,X), female(X).

/* 祖孙关系 */
grandparent(X,Y)   :- parent(X,Z), parent(Z,Y).
grandfather(X,Y)   :- grandparent(X,Y), male(X).
grandmother(X,Y)   :- grandparent(X,Y), female(X).
grandchild(X,Y)    :- grandparent(Y,X).
grandson(X,Y)      :- grandparent(Y,X), male(X).
granddaughter(X,Y) :- grandparent(Y,X), female(X).

/* 平辈关系 */
/* 若X与Y有相同的父辈Z，且X不是Y，则X与Y是同胞*/
sibling(X,Y)       :- parent(Z,X), parent(Z,Y), X\==Y. 
brother(X,Y)       :- sibling(X,Y), male(X).
sister(X,Y)        :- sibling(X,Y), female(X).
cousin(X,Y)        :- parent(Z,X), parent(W,Y), sibling(Z,W).

/* 上下两代旁系关系 */
uncle(X,Y)         :- parent(Z,Y), brother(X,Z).
aunt(X,Y)          :- parent(Z,Y), sister(X,Z).
nephew(X,Y)        :- parent(Z,X), sibling(Z,Y), male(X).
niece(X,Y)         :- parent(Z,X), sibling(Z,Y), female(X).

/* 定义一个普适关系relation，方便查询 */
relation(R, X, Y)       :-  relations(Rs), member(R,Rs), Q =..[R,X,Y], call(Q).

/* 事实 */
/* 关系列表 */
relations([parent,father,mother,son,daughter,grandparent,grandfather,
grandmother,grandchild,grandson,granddaughter,
                sibling,brother,sister,cousin,uncle,aunt,nephew,niece]).

parent(a,b). parent(a,c). parent(a,d).
parent(b,e). parent(b,f).
parent(c,g).
parent(d,h). parent(d,i). parent(d,j).

male(a).
male(b).
male(c).
female (d).
female (e).
male(f).
female (g).
male(h).
female (i).
male(j). </pre></div><p>
            叹号没有看出名堂：“Prolog代码并不比Java代码简短多少啊。”
        </p><p>
            “评价代码的复杂度，长短只是一个因素。程序员不是打字员，花在思考上的时间和精力远远超过花在键盘上。”冒号指出，“就拿此例来说，Java代码虽然并不复杂，但有不少的选择分支语句，次序很重要。稍有不慎，就会出现逻辑错误。另外如果我们把关系分得更细致些，比如区分叔伯舅、姑姨婶、堂兄表妹等；再加入姻亲关系，比如姑嫂婆媳、妯娌连襟等。这时你再来改写这段代码试试？”
        </p><p>
            引号听得头皮有些发麻：“那一定需要不少重重嵌套的if-else语句了。”
        </p><p>
            问号提出的问题更让人头痛：“如果我们不限于三代，再加上曾孙女、曾叔父之类的关系呢？”
        </p><p>
            逗号联想到一则笑话：“话说一对父子与一对母女联姻，作父亲的娶了那位女儿，作儿子的娶了那位母亲。本来关系已经够颠倒错乱了，雪上加霜的是这两对夫妇又各自有了子女，那位父亲终于精神崩溃了。”
        </p><p>
            大家哄笑着：这下彻底乱套啰。
        </p><p>
            “前面的Java代码之所以没有嵌套，得益于及时退出的一些return语句。如果考虑到超过三代的关系以及多重交叉的关系，许多语句都得改写。可见上述代码是多么地脆弱！” 冒号就棍打腿，“再看Prolog代码，如果要求更细的血亲关系、增加姻亲关系或三代以上的关系，只需引入新的规则和事实即可，不会影响原有代码。下面列出几个示范语句——”
        </p><div class="informalexample"><pre class="programlisting">
/* 规则 */
/* 配偶原则 */
father(X,Y)          :- spouse(Z,X), mother(Z,Y).
mother(X,Y)        :- spouse(Z,X), father(Z,Y).
husband(X,Y)      :- spouse(X,Y), male(X).
wife(X,Y)            :- spouse(X,Y), female(X).

/* 父系的堂、姑兄弟姐妹 */
paternal_cousin(X,Y) :- father(Z,X), father(W,Y), sibling(Z,W).
/* 母系的舅、姨兄弟姐妹 */
maternal_cousin(X,Y) :- mother(Z,X), mother(W,Y), sibling(Z,W).

/* 姻亲关系 */
father_in_law(X,Y) :- spouse(Y,Z), father(X,Z).
mother_in_law(X,Y) :- spouse(Y,Z), mother(X,Z).
son_in_law(X,Y)    :- spouse(X,Z), daughter(Z,Y).
daughter_in_law(X,Y) :- spouse(X,Z), son(Z,Y).

/* 曾祖孙关系 */
great_grandparent(X,Y) :- grandparent(Z,Y), parent(X,Z).
great_grandchild(X,Y)  :- grandchild(Z,Y), child(X,Z).

/* 事实 */
/* 新引入的关系 */
relations([husband,wife, paternal_cousin,maternal_cousin,
father_in_law,mother_in_law,son_in_law,daughter_in_law,
great_grandparent,great_grandchild]).

parent(pa,a).
spouse(a,as).
spouse(ds,d).
spouse(cs,c). </pre></div><p>
            句号方悟其妙：“这样的代码既无层层嵌套，也无次序分别。比起过程式，编写轻松得多，程序的可维护性和可扩展性也更高。”
        </p><p>
             “此外另有妙处。逻辑式与过程式和函数式的一个不同之处是，它没有明显的输入、输出之分。上面的程序不仅可以用来判断任意二人之间的关系，还能倒过来通过关系来找人。”冒号板书了几行字——
        </p><div class="informalexample"><p>输入查询：relation(R,a,ds)          /* a与ds的关系是什么？ */</p><p>输出结果：R=father_in_law</p><p>输入查询：great_grandparent (pa,X)  /* pa是谁的曾祖？*/</p><p>输出结果：X=e;X=f;X=g; X=h; X=i; X=j;</p></div><p>
            引号义务作翻译：“这告诉我们两件事：a与ds是翁婿关系，pa有曾孙e、f、g、h、i和j。”
        </p><p>
            “逻辑式语言着眼于关系而非函数，对付这类问题正是它的拿手好戏。”冒号声音逐渐高亢，“大家应该都听说过等式‘算法+数据结构=程序’吧？这是Pascal设计者Niklaus Wirth的一本著作的书名，它刻画了过程式尤其是结构化编程的思想。后来Robert Kowalski进一步提出：<span class="strong"><strong>算法=逻辑+控制</strong></span>。其中逻辑是算法的核心，控制主要用于改进算法的效率。在逻辑式编程中，程序员只需表达<span class="emphasis"><em>逻辑</em></span>，而<span class="emphasis"><em>控制</em></span>交给编程语言的解释器或编译器去管理。”
        </p><p>
            “所以程序员的负担大大减轻了。”问号接口道，“逻辑式编程听起来真是不错，但不知Prolog程序能否与Java程序对接呢？”
        </p><p>
            冒号回答：“任何程序之间的对接都是可能的，只是不同的对接方式在复杂度和效率上有所差异而已。除了通过程序之间的通讯（如socket）或可执行文件的直接调用外，Prolog与C、C++、Java、C#、VB、Perl、JavaScript等多种语言之间，还能借助工具进行源代码转换<a class="link" href="#note2"><sup>[2]</sup></a>或通过双向编程接口互嵌代码。具体到Java，一方面可以通过JNI （Java Native Interface）与Prolog引擎相连<a class="link" href="#note3"><sup>[3]</sup></a>，另一方面可以利用Prolog引擎的Java实现来完成JVM上的集成<a class="link" href="#note4"><sup>[4]</sup></a>。”
        </p><p>
            句号请求：“能否总结一下逻辑式编程的优缺点？”
        </p><p>
            冒号欣然应允：“由于逻辑式编程模拟人类的逻辑思维，故而在机器证明、专家系统、自然语言处理、博弈等人工智能领域如鱼得水，同时在非学术领域的知识管理、智能决策分析等方面也能大显身手。同为声明式，它与函数式一样比命令式更简洁、更抽象、更少副作用，运用得当能大大提高生产效率，还能用于<span class="term">快速原型</span>（rapid prototyping）开发。但缺点是运行效率偏低，可掌控性较差，与常规的过程式思维差异较大，更适合<span class="emphasis"><em>基于规则</em></span>（rule-based）而不是<span class="emphasis"><em>基于状态</em></span>（state-based）的应用<a class="link" href="#note5"><sup>[5]</sup></a> 。此外，相对而言逻辑式语言还不够成熟和完善。” 
        </p><p>
            逗号“抗议”道：“我怎么感觉经过这么一反刍，胃里的负担更重了？”
        </p><p>
            冒号略带歉意地笑了笑：“在所有编程范式中，函数式与逻辑式与传统思维方式的差别最大，此前的介绍又过于简单，因此今天特意多谈了些。既然有人提意见，那就我就适可而止了。最后请允许我画蛇添足：在代表计算机最高水平的人工智能领域中，这两种范式发挥着举足轻重的作用。单凭这一点，它们也是值得学习和借鉴的。好了，大家先休息十分钟，出去活动活动筋骨吧。”
        </p></div><div class="section" title="，插语"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="note"></a>，插语</h2></div></div></div><div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem"><p><a name="note1"></a>
                    用数学逻辑的话来说，事实与规则是公理，查询就是待证的定理。
                </p></li><li class="listitem"><p><a name="note2"></a>
                    如Prolog Café和P#能分别将Prolog代码转化为Java代码和C#代码。
                </p></li><li class="listitem"><p><a name="note3"></a>
                    比如JPL通过JNI与Prolog FLI （Foreign Language Interface）将Java与SWI-Prolog桥接起来。
                </p></li><li class="listitem"><p><a name="note4"></a>
                    比如JIProlog（Java Internet Prolog）是一个用Java实现的Prolog解释器，为Java和Prolog提供双向API。类似的还有JLog等。
                </p></li><li class="listitem"><p><a name="note5"></a>
                    交互式或事件驱动式应用通常是基于状态的。
                </p></li></ol></div></div><div class="section" title="。总结"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="summary"></a>。总结</h2></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>
                    代码的长度不是衡量软件复杂度的唯一标准。其中的逻辑结构越复杂、越微妙、受需求变化的影响越大，软件越难控制和维护。
                </p></li><li class="listitem"><p>
                    算法=逻辑+控制。逻辑式编程将算法中的控制部分大都移交给编程语言，编程人员主要关注算法的核心逻辑。这样大大减轻了程序员的负担，编码也更简洁易懂，更具可维护性和可扩展性。
                </p></li><li class="listitem"><p>
                    有别于过程式和函数式，逻辑式没有明显的输入和输出之分。
                </p></li><li class="listitem"><p>
                    逻辑式编程不仅适用于人工智能方面的学术领域，同样广泛适用于各种涉及知识管理、决策分析等方面的应用领域。
                </p></li><li class="listitem"><p>
                    相对于命令式，逻辑式更简洁、更抽象、更少副作用，能提高生产效率，还能用于快速原型开发。但在运行效率、可掌控性、语言成熟度等方面有所欠缺。另外，因其思维方式独特而鲜为人用，适合基于规则而非基于状态的应用 。
                </p></li></ul></div></div><div class="section" title="“”参考"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="reference"></a>“”参考</h2></div></div></div><div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem"><p>
                    Michael Lee Scott．Programming Language Pragmatics．San Francisco：Morgan Kaufmann，2000．620-650
                </p></li><li class="listitem"><p>
                    Robert A. Kowalski．Algorithm = Logic + Control．Communications of the ACM，1979，22(7)：424-436
                </p></li></ol></div></div></div><p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.zhenghui.org%2F2009%2F09%2F15%2Fcolon-class-4_2%2F&amp;title=%E5%86%92%E5%8F%B7%E8%AF%BE%E5%A0%82%C2%A74.2%EF%BC%9A%E9%80%BB%E8%BE%91%E8%8C%83%E5%BC%8F" id="wpa2a_4">分享/保存</a></p><h3  class="related_post_title">相关文章</h3><ul class="related_post"><li>2009年09月8日 -- <a href="http://blog.zhenghui.org/2009/09/08/colon-class-3_1/" title="冒号课堂§3.1：泛型范式">冒号课堂§3.1：泛型范式</a> (5)</li><li>2009年09月7日 -- <a href="http://blog.zhenghui.org/2009/09/07/colon-class-2_4/" title="冒号课堂§2.4：并发范式">冒号课堂§2.4：并发范式</a> (2)</li><li>2009年09月4日 -- <a href="http://blog.zhenghui.org/2009/09/04/colon-class-2_2/" title="冒号课堂§2.2：声明范式">冒号课堂§2.2：声明范式</a> (1)</li><li>2010年09月20日 -- <a href="http://blog.zhenghui.org/2010/09/20/hard-thinking-and-soft-thinking-3/" title="论思维的刚性与柔性（科学的迷信-3）">论思维的刚性与柔性（科学的迷信-3）</a> (0)</li><li>2009年09月21日 -- <a href="http://blog.zhenghui.org/2009/09/21/colon-class-5_1/" title="冒号课堂§5.1：教学计划">冒号课堂§5.1：教学计划</a> (1)</li><li>2009年09月19日 -- <a href="http://blog.zhenghui.org/2009/09/19/colon-class-4_4/" title="冒号课堂§4.4：情景范式">冒号课堂§4.4：情景范式</a> (0)</li><li>2009年09月17日 -- <a href="http://blog.zhenghui.org/2009/09/17/colon-class-4_3/" title="冒号课堂§4.3：汇总范式">冒号课堂§4.3：汇总范式</a> (5)</li><li>2009年09月13日 -- <a href="http://blog.zhenghui.org/2009/09/13/colon-class-4_1/" title="冒号课堂§4.1：函数范式">冒号课堂§4.1：函数范式</a> (0)</li><li>2009年09月11日 -- <a href="http://blog.zhenghui.org/2009/09/11/colon-class-3_4/" title="冒号课堂§3.4：事件驱动">冒号课堂§3.4：事件驱动</a> (2)</li><li>2009年09月10日 -- <a href="http://blog.zhenghui.org/2009/09/10/colon-class-3_3/" title="冒号课堂§3.3：切面范式">冒号课堂§3.3：切面范式</a> (4)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://blog.zhenghui.org/2009/09/15/colon-class-4_2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

