快速业务通道

冒号课堂§4.2:逻辑范式 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-16
*/ /* 关系列表 */ 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).

冒号课堂§4.2:逻辑范式(4)

时间:2011-06-27 BlogJava xyz98

叹号没有看出名堂:“Prolog代码并不比Java代码简短多少啊。”

“评价代码的复杂度,长短只是一个因素。程序员不是打字员,花在思考上的时间和精力远远超过花在键盘上。”冒号指出,“就拿此例来说,Java代码虽然并不复杂,但有不少的选择分支语句,次序很重要。稍有不慎,就会出现逻辑错误。另外如果我们把关系分得更细致些,比如区分叔伯舅、姑姨婶、堂兄表妹等;再加入姻亲关系,比如姑嫂婆媳、妯娌连襟等。这时你再来改写这段代码试试?”

引号听得头皮有些发麻:“那一定需要不少重重嵌套的if-else语句了。”

问号提出的问题更让人头痛:“如果我们不限于三代,再加上曾孙女、曾叔父之类的关系呢?”

逗号联想到一则笑话:“话说一对父子与一对母女联姻,作父亲的娶了那位女儿,作儿子的娶了那位母亲。本来关系已经够颠倒错乱了,雪上加霜的是这两对夫妇又各自有了子女,那位父亲终于精神崩溃了。”

大家哄笑着:这下彻底乱套啰。

“前面的Java代码之所以没有嵌套,得益于及时退出的一些return语句。如果考虑到超过三代的关系以及多重交叉的关系,许多语句都得改写。可见上述代码是多么地脆弱!” 冒号就棍打腿,“再看Prolog代码,如果要求更细的血亲关系、增加姻亲关系或三代以上的关系,只需引入新的规则和事实即可,不会影响原有代码。下面列出几个示范语句——”

/* 规则 */ /* 配偶原则 */ 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).

句号方悟其妙:“这样的代码既无层层嵌套,也无次序分别。比起过程式,编写轻松得多,程序的可维护性和可扩展性也更高。”

“此外另有妙处。逻辑式与过程式和函数式的一个不同之处是,它没有明显的输入、输出之分。上面的程序不仅可以用来判断任意二人之间的关系,还能倒过来通过关系来找人。”冒号板书了几行字——

输入查询:relation(R,a,ds)

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号