对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时没有提示信息,对于开发人员来说,那么多标签,标签有那么多属性,全部都记住显然是不可能的,遇到这种情况是很头疼的事 ...
随机推荐
- charles license key
Download: http://www.charlesproxy.com/ (Official Web-site) Registered name: anthony ortolani License ...
- C++中在子类实现父类的方法调用
- webpack中热模块更新
Hot Module Replacement,热模块更新,很多时候会简写成HMR. "scripts": { "start": "webpack-de ...
- xss实现钓鱼操作
自己写一个和原网站后台登录地址一模一样的钓鱼页面 JS加载一个iframe 100%覆盖原网页 提示登录超时重新登录 因为是iframe加载 url地址不变 钓鱼成功后 再跳转回/admin/inde ...
- [Python 练习爬虫] XPATH基础语法
XPATH语法: // 定位根标签 / 往下层寻找 /text() 提取文本内容 /@xxx 提取属性内容 Sample: import requests from lxml import etree ...
- Java50道经典习题-程序34 三个数排序
题目:输入3个数a,b,c,按大小顺序输出. import java.util.Scanner; public class Prog34 { public static void main(Strin ...
- [转]OpenGL与CUDA互操作方式总结
一.介绍 CUDA是Nvidia推出的一个通用GPU计算平台,对于提升并行任务的效率非常有帮助.本人主管的项目中采用了OpenGL做图像渲染,但是在数据处理方面比较慢,导致帧率一直上不来.于是就尝试把 ...
- Java SPI(Service Provider Interface)
SPI 全称为 (Service Provider Interface) ,是JDK内置的一种服务提供发现机制. 目前有不少框架用它来做服务的扩展发现, 简单来说,它就是一种动态替换发现的机制, 举个 ...
- 12c数据库重启后自动启动pdb
由于最近管理12c数据库,创建了9个新的pdb.相对于以前11g版本每天一个一个的环境检查,方便了很多. 但是因为一次意外宕机,数据库重启.虽然数据库重启,但是管理的pdb确不能自动重启,所以需要手动 ...
- Oracle高级函数篇之递归查询start with connect by prior简单用法
路飞:" 把原来CSDN的博客转移到博客园咯!" 前段时间,自己负责的任务中刚好涉及到了组织关系的业务需求,自己用了oracle递归查询.下面简单来举个例子.在工作中我们经常会遇到 ...