对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时没有提示信息,对于开发人员来说,那么多标签,标签有那么多属性,全部都记住显然是不可能的,遇到这种情况是很头疼的事 ...
随机推荐
- Hibernate 一次查询分多次返回 避免内存溢出
public void grpcGpioDevice(StreamObserver<NI_GetAllDeviceListResponse> responseObserver, Map&l ...
- Java.io 包(字节流)
I/O流概述 在 Java 中,把不同类型的输入.输出源抽象为流(Stream),而其中输入或输出的数据则称为数据流(Data Stream),用统一的接口表示,从而使程序设计简单明了.流是一组有顺序 ...
- python面向对象之类成员修饰符
类的所有成员分为: 公有成员,在任何地方都能访问 私有成员,只有在类的内部才能访问 私有成员和公有成员的定义不同:私有成员命名时,前两个字符是下划线.(特殊成员除外,例如:__init__.__c ...
- 项目管理利器-Maven(Windows安装)
什么是Maven? 安装Maven环境: 下载地址:https://maven.apache.org/download.cgi Maven3.3+JDK1.7以上版本 下载windows版本 解压到本 ...
- linux服务器nginx的卸载和安装
刚接触的linux服务器上,nginx配置乱的有点令人发指,就把老的卸载了重新装一下. 卸载 linux有一系列的软件管理器,比如常见的linux下的yum.Ubuntu下的apt-get等等.通过这 ...
- 大屏FAQ
1. 大屏可以分为哪几类?帆软有哪些大屏硬件合作商?编辑 拼接屏:通常由单个46-55寸的液晶显示屏组成屏幕墙,存在拼缝,借助矩阵.屏控系统来进行信号的输入与输出控制,可以实现屏幕墙上多个屏幕的组合. ...
- JavaScript浏览器对象模型(BOM)之location对象
一.概述: location 是 BOM 对象之一,它提供了与当前窗口中加载的文档有关的信息,还提供了一些导航功能. 事实上,location 对象是 window 对象的属性,也是 document ...
- UVa 1639 - Candy(数学期望 + 精度处理)
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- 【[JXOI2017]加法】
江西竟然还有省选,而且还是可怜题,实在是有点可怕 这道题还是比较清真的,大概是最简单的可怜题? 首先看到最大值最小,就很容易想到了二分答案 对于一个二分出来的答案\(mid\),去把原数列扫一遍就可以 ...
- SpringBoot+MyBatis中自动根据@Table注解和@Column注解生成ResultMap
其实我一点都不想用mybatis,好多地方得自己写,比如这里. 使用mybatis要写大量的xml,烦的一批.最烦人的莫过于写各种resultmap,就是数据库字段和实体属性做映射.我认为这里应该是m ...