对Prolog的感想和我写的一些教程
我第一次见到Prolog这门独特的编程语言是在《七周七语言(Seven Languages in Seven Weeks)》中看到的。《七周七语言》名字看起来与市面上什么《三十天……从入门到精通》之类的垃圾书类似,但完全不是那回事。《七周七语言》的目标在于让读者了解到这些语言独有的编程思想和设计模式。而且它也不是什么入门书。Prolog是门声明式编程语言,它与我们平时最常遇到的命令式编程语言有很大的不同。命令式语言需要你精确地告诉计算机如何完成一项工作,而声明式语言则是需要你提供信息和推论而无需知道如何做。
Prolog程序没有特定的运行顺序,其运行顺序是由电脑决定的,而不是编程序的人。而且它的程序和数据高度统一。比如一般的编程语言,提示你输入的内容是作为字符串或是为相应的变量赋值,而它是可以直接参与到程序中。如果说汇编语言和C语言是最接近硬件底层,最能反映计算机工作原理的;那么Lisp和Prolog则是最能反映计算和逻辑本身的,高度抽象。
《七周七语言》中,将它比喻为“雨人”。Prolog这门语言有时特别聪明,有时又特别令人失望。只有当你知道如何提问时,你才会得到令人惊奇的答案。它的编程的时的思考模式的确令人吃惊。Prolog的穷举特性不禁让人想起蚂蚁寻找最短路线的过程。比如蚁巢派出许多蚂蚁,去寻找到食物之间的最短路线。选择机制很简单:在探路的蚂蚁中,走最短路线的蚂蚁肯定比其他同伴能更快地回到蚁巢。而且,最短路线比其他路线的气味更大,后来的蚂蚁会沿着气味最大的路线走,因而又加强了这条路上的气味。也许可能未来Prolog的设计趋势可能会加入更高层次的分布式处理吧。
Prolog确实不是通用的编程语言,但它这种声明逻辑式编程语言在计算机科学中的地位是很高的,就好比中文系教授不可能上电视当名嘴一样。上个世纪80年代,在全球颁发了无数个逻辑程序设计领域的计算机科学博士。我们的宿敌日本还投入了数以亿计的研发资金,计划制造第五代计算机,虽然总体而言,小日本的野心失败了(野心勃勃的日本第五代计算机,如何一步步走向失败)。至少Prolog在功能上是完备的。SWI-Prolog内部有调用C语言、Java等编程语言的库(这段程序完全不需要什么中间语言,就自动生成R语言的函数,连R语言的语法都被嵌套了进去:r_demo.pl)。Prolog在自然语言处理、自动调整系统、专家系统中发挥着重大作用。
这里面有一篇趣文是关于Prolog的:程序员的语言“艳遇史”(三)——法国外教prolog。
我在百度经验上写过一系列非常基础的Prolog教程,希望能够帮到你。为了写这些教程,除了参考了网络资料,还参考了《用Prolog和Turbo Prolog语言开发专家系统》(不过我的教程里用的是SWI-Prolog)、《七周七语言》等书籍。关于Prolog的现存书籍真的太少了,网络资料也很少。去年在学校的图书馆搜索引擎中找到了,但第一次去时发现它已被移库了,可能书太老了。后来又找了一次才找到。可惜百度经验将杂志功能取消了,不得不将链接分别发出来。建议按顺序阅读:
配置SWI-Prolog编程环境
Prolog的基本概念和语法规则
Prolog规则结构与实例
SWI-Prolog的调试
SWI-Prolog的算术运算
SWI-Prolog的递归
SWI-Prolog的截断机制
用Prolog实现过程
Prolog的数据结构
Prolog的输入和输出和文件操作
以后会在博客上写一些关于Prolog更为复杂的内容(也许)。
对Prolog的感想和我写的一些教程的更多相关文章
- 几年前做家教写的C教程(之一)
C语言学习宝典 首先让我们认识什么是C语言. C语言是一种计算机开发语言,是一种非常基础的开发语言.能够用C语言做很多事情.C语言是顺序执行的程序. 程序应该包括数据描述,数据操作. C语言的数据类型 ...
- 参考sectools,每个人至少查找5种安全工具、库等信息并深入研究至少两种并写出使用教程
1.Nessus Nessus是免费网络漏洞扫描器,它可以运行于几乎所有的UNIX平台之上.它不仅能永久升级,还免费提供多达11000种插件(但需要注册并接受EULA-acceptance--终端用户 ...
- 几年前做家教写的C教程(之五专讲结构体与文件操作)
C语言学习宝典(5) 结构体: 将不同类型的数据组合成为一个有机的整体,这个整体就是一个结构体. 例如: Struct student { Int name; Char sex; Float scor ...
- 几年前做家教写的C教程(之四专讲了指针与汉诺塔问题)
C语言学习宝典(4) 指针:可以有效的表示复杂的数据结构,能动态的分配动态空间,方便的使用字符串,有效的使用数组,能直接处理内存单元 不掌握指针就没有掌握C语言的精华 地址:系统为每一个变量分配一个内 ...
- 几年前做家教写的C教程(之三专讲了递归和斐波那契)
C语言学习宝典(3) 数组: 一维数组的定义: 类型说明符 数组名[常量表达式] 例如: int a[10]; 说明:(1)数组名的命名规则和变量名相同,遵循标示符命名规则 (2)在定义数组时需要 ...
- 几年前做家教写的C教程(之二)
C语言学习宝典(2) 认识C语言中的运算符: (1)算术运算符 (+ - * / %) (2)关系运算符 (> < == >= <= != ) (3 ...
- 我写了个教程《一步步教你把ubuntu安装到U盘》
一步步教你把ubuntu安装到U盘 作者 Val 2452013147@qq.com 原因: 由于某些原因(学生党),需要把ubuntu安装到U盘到处走,百度了一下,教程都不是很好,要么很复杂,要么不 ...
- JavaScript写一个拼图游戏
拼图游戏的代码400行, 有点多了, 在线DEMO的地址是:打开: 因为使用canvas,所以某些浏览器是不支持的: you know: 为什么要用canvas(⊙o⊙)? 因为图片是一整张jpg或 ...
- Hibernate写配置文件无提示信息解决
把Hibernate的相关jar包引入工程后,在配置hibernate.cfg.xml时没有提示信息,对于开发人员来说,那么多标签,标签有那么多属性,全部都记住显然是不可能的,遇到这种情况是很头疼的事 ...
随机推荐
- iOS自动化-iOS录屏xrecord及解决iPhone设备不显示的问题
github地址:https://github.com/WPO-Foundation/xrecord 安装方法: git clone https://github.com/WPO-Foundation ...
- SQL监控:mysql及mssql数据库SQL执行过程监控审计
转载 Seay_法师 最近生活有很大的一个变动,所以博客也搁置了很长一段时间没写,好像写博客已经成了习惯,搁置一段时间就有那么点危机感,心里总觉得不自在.所以从今天起还是要继续拾起墨笔(键盘),继续好 ...
- 页面请求速度慢,TTFB时间长的问题分析
线上环境发现用户请求某个页面时,出现请求速度慢页面卡顿白屏的现象,通过chrome开发工具调试查看Timing,花费在waiting(TTFB)上的时间过长,几秒十几秒不等 TTFB全称Time To ...
- PhoneGap模仿微信摇一摇功能
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- BZOJ4870:[SHOI2017]组合数问题(组合数学,矩阵乘法)
Description Input 第一行有四个整数 n, p, k, r,所有整数含义见问题描述. 1 ≤ n ≤ 10^9, 0 ≤ r < k ≤ 50, 2 ≤ p ≤ 2^30 − 1 ...
- 3、Android-全局大喇叭-广播机制
所谓的官博机制可以理解成为1对多的概念 即一个喇叭所有的人都能听到(统一范围内) 为了便于及逆行系统级别的消息通知 Android引入了一套广播机制 而且更容易进行实现. 3.1.广播机制的简介 再A ...
- Hadoop学习笔记---HDFS
Hadoop分布式文件系统(HDFS)被设计成适合运行在通用硬件(commodity hardware)上的分布式文件系统.HDFS是一个高度容错性的系统,适合部署在廉价的机器上.HDFS能提供高吞吐 ...
- 将form表单元素的值序列化成对象
/**jQuery * 将form表单元素的值序列化成对象 * @returns object */ var serializeObject = function(form) { var o = {} ...
- HDU 3038 How Many Answers Are Wrong(带权并查集,真的很难想到是个并查集!!!)
How Many Answers Are Wrong Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Ja ...
- +QFTPOPEN: 603,0 怎么把这样一个字符串中的 603 提取出来给一个 uint32_t 的变量那
+QFTPOPEN: 603,0 怎么把这样一个字符串中的 603 提取出来给一个 uint32_t 的变量那? 注意冒号后面有个空格!!! 答案:要使用 sscanf 标准库函数! char s ...