首页 » 网站建设 » php上机指点技巧_那么Prolog告诉我怎么走

php上机指点技巧_那么Prolog告诉我怎么走

访客 2024-12-03 0

扫一扫用手机浏览

文章目录 [+]

只管处理大数据是开个玩笑,但学习 Prolog 的目标是真的。
既然要学习一门编程措辞,就必须找一本靠谱的教材。
在无中生友之后,我选择了《Learn Prolog Now》[1]作为入门读物。

只管《Learn Prolog Now》的内容一点也不 real world,却循规蹈矩、非常地适宜初学者,每一章的结尾还准备了“上机题”。
出人意料的是,仅仅在第三章就碰着了不会做的题目。
在发急地苦战一番未果后,我拖着怠倦的身躯搁置了它,连续学习后面的章节。

php上机指点技巧_那么Prolog告诉我怎么走 php上机指点技巧_那么Prolog告诉我怎么走 网站建设

时隔五个月,我再次考试测验解答这道题目。
却惊喜地创造,只须要镇静地剖析再仔细利用前三章学过的知识,办理这道题目也便是迎刃而解的事情了。

php上机指点技巧_那么Prolog告诉我怎么走 php上机指点技巧_那么Prolog告诉我怎么走 网站建设
(图片来自网络侵删)
以是到底是个什么题?

讲了这么多,是时候揭晓这它的真面孔了。
由于第三题以第二题为根本,因此一并搬运了过来

感兴趣的朋友也可以直接移步源网页[2]查看。

看完上面的题目,只学过主流编程措辞的朋友大概会是一头雾水,毕竟无论是代码还是术语,都与平日里利用的大相径庭。
我来试着阐明一下。
像byCar(auckland, hamilton)和byTrain(metz, frankfurt)这样的代码,用 Prolog 的术语来讲叫做“事实”。
就像数学中的公理一样,它们总是成立的。
如果向 Prolog 提问,它会给出肯定的回答

byCar和byTrain被称为“谓词”,auckland和hamilton则是“原子”。

第二题哀求定义travel/2,第三题哀求定义travel/3。
travel是谓词的名字,2 和 3 则是它所接管的参数的个数。
定义一个谓词便是给出描述它何时成立的“规则”,举个例子,可以定义一个名为len的谓词,只有当第二个参数即是第一个参数的长度时才成立

以大写字母开头的标识符(如题目中的X,上图中的T、L)是变量,在归一化(unification)时 Prolog 能够为它们赋值使得查询成立。

鉴于本文不是 Prolog 的入门教程,各位读者如果想进一步理解 Prolog,还请移步《Learn Prolog Now》的干系章节。

先办理第二题吧

讲了这么多,该进入正题了。
第二题实在不难,细心的读者该当已经创造,这题可以用递归来办理(就像上文的len一样)。

设谓词travel的两个参数分别叫做S和E,各代表出发点和终点。
显然,travel(S, E)成立,当且仅当:

可以从S搭乘汽车(byCar)、火车(byTrain),或飞机(byPlane)抵达E,或者;存在另一个城市M,可以从S搭乘汽车、火车,或飞机抵达M,并且travel(M, E)也成立。

上述算法可以轻松地写成 Prolog 代码

byCar(auckland,hamilton).byCar(hamilton,raglan).byCar(valmont,saarbruecken).byCar(valmont,metz).byTrain(metz,frankfurt).byTrain(saarbruecken,frankfurt).byTrain(metz,paris).byTrain(saarbruecken,paris).byPlane(frankfurt,bangkok).byPlane(frankfurt,singapore).byPlane(paris,losAngeles).byPlane(bangkok,auckland).byPlane(singapore,auckland).byPlane(losAngeles,auckland).travel(S, E) :- just_go(S, E).travel(S, E) :- just_go(S, M), travel(M, E).just_go(S, E) :- byCar(S, E).just_go(S, E) :- byTrain(S, E).just_go(S, E) :- byPlane(S, E).

让 Prolog 见告咱们这个travel/2写得对不对

精彩!

你话我猜?

Prolog 不仅知道一个查询是否成立,还知道这个查询在什么参数下成立。
例如,可以让 Prolog 见告咱们,从valmont可以抵达哪一些城市,以及哪一些城市可以抵达auckland

这正是在接下来的题目中须要发扬光大的能力。

终于来到第三题

第三题所哀求的travel是一个接管三个参数的谓词,第三个参数由从出发点到终点的路子城市构成。
设这个新的变量为R,那么travel(S, E, R)成立当且仅当:

可以从S抵达E,并且R为go(S, E),或者;存在另一个城市M,以及另一条路径R2。
可以从S抵达M,并且travel(M, E, R2)成立,并且R为go(S, M, R2)。

那么如何在规则中描述R的构造呢?莫非是像上面的谓词len那样,在:-的右侧写上形如R is go(S, M, R2)这样的代码?

并不是。

借助 Prolog 强大的模式匹配能力,只须要在:-的左边声明R的构造即可

byCar(auckland,hamilton).byCar(hamilton,raglan).byCar(valmont,saarbruecken).byCar(valmont,metz).byTrain(metz,frankfurt).byTrain(saarbruecken,frankfurt).byTrain(metz,paris).byTrain(saarbruecken,paris).byPlane(frankfurt,bangkok).byPlane(frankfurt,singapore).byPlane(paris,losAngeles).byPlane(bangkok,auckland).byPlane(singapore,auckland).byPlane(losAngeles,auckland).travel(S, E, go(S, E)) :- just_go(S, E).travel(S, E, go(S, M, R)) :- just_go(S, M), travel(M, E, R).just_go(S, E) :- byCar(S, E).just_go(S, E) :- byTrain(S, E).just_go(S, E) :- byPlane(S, E).

加载这段代码后,就能让 Prolog 见告我们,如何从valmont去往losAngeles了

Prolog 不仅找出了题目中所给出的答案(见上图的第二行X =),还找出了其余一条可行的路径。

后记

确实不难,难怪可以作为第三章的习题。

参考资料

[1]

《Learn Prolog Now》: http://www.learnprolognow.org/lpnpage.php?pageid=online

[2]

源网页: http://www.learnprolognow.org/lpnpage.php?pagetype=html&pageid=lpn-htmlse12#x25-38066x2

标签:

相关文章

C语言网站设计,探索技术魅力与创新方法

随着互联网技术的飞速发展,网站设计已成为现代企业展示形象、拓展业务的重要途径。C语言作为一种高效、稳定的编程语言,在网站设计领域具...

网站建设 2024-12-05 阅读0 评论0

php取回cookie技巧_PHP Cookie

Cookie 是什么?cookie 常用于识别用户。cookie 是一种做事器留在用户打算机上的小文件。每当同一台打算机通过浏览器...

网站建设 2024-12-05 阅读0 评论0