0
点赞
收藏
分享

微信扫一扫

#小马的Prolog日记#

1. Intro

Prolog是一门声明式编程语言(decalarative language)。你向Prolog提供一些事实(fact)和推论(inference),并让它为你推断。

随意浏览一下互联网,你就能发现很多使用不到20行代码解决数独问题的例子,也能找到魔 方以及诸多著名难题的解决方法,例如汉诺塔(Tower of Hanoi)(大约用了十几行代码)。Prolog是最早成功的逻辑编程语言之一。你使用纯逻辑设置断言,Prolog判定它们是否为真。你可以在断言中留出空白,Prolog将尝试填充这些空白并使那些不完整的事实变为真。

1.1关于Prolog

这门备受尊重的语言为各类问题提供了编程基础。你可以使用这门基于规则的语言来表达逻辑和提出问题。和SQL一样,Prolog基于数据库,但是其数据由逻辑规则和关系组成;和SQL一样,Prolog包含两个部分:一部分用于描述数据,而另一部分则用于查询数据。在Prolog中,数据以逻辑规则的形式存在,下面是基本构建单元:

  • 事实 fact。事实是关于真实世界的基本断言。(Babe是一头猪,猪喜欢泥巴。)
  • 规则 rule。规则是关于真实世界中一些事实的推论。(如果一个动物是猪,那么它喜欢泥巴。)
  • 查询 query。查询是关于真实世界的一个问题。(Babe喜欢泥巴吗?)

事实和规则被放入一个知识库(knowledge base)。Prolog编译器将这个知识库编译成一种适于高效查询的形式。当我们学习这些例子的时候,你可以使用Prolog表达知识库。然后你就可以直接检索数据,也可以使用Prolog将多个规则串联在一起来得到一些你可能不知道的事情。

1.2基本概念

如果一个词以小写字母开头,它就是一个原子(atom),一个固定值。
如果一个词以大写字母或下划线开头,那么它就是一个变量(variable)。变量的值可以改变,原子则不能。

1.3 使用

安装完成后就可以开始使用了。首先新建一个文本文档,然后在其中写入代码。写完之后保存退出,然后将文件的后缀名改为.pl.。然后打开SWI-Prolog,这里有可以选择file,单击选择consult,然后选择上一步生成的.pl文件。然后输入对应的语句之后回车,就可以得到结果。注意要写.。或者直接输入consult('文件所在的路径'). ,例如下:

consult('/Users/mac/Desktop/test.pl').

1.4 逻辑编程

什么叫逻辑编程?也许你还没有一个整体的印象,还是让我们首先来研究一个简单的例子吧。

运用经典的逻辑理论,我们可以说“所有的人( person )都属于人类( mortal )”,如果用 Prolog 的语言来说就是
“对于所有的 X ,只要 X 是一个人,它就属于人类。”

mortal(X):-person(X).

同样,我们还可以加入一些简单的事实,比如:苏格拉底( socrates )是一个人。

person(socrates).
有了这两条逻辑声明, Prolog 就可以判断苏格拉底是不是属于人类。

在 Prolog 的 Listener 中键入如下的命令:

?-mortal(socrates). ( 此句中的 ‘?-’ 是 Listener 的提示符,本句表示询问苏格拉底是不是属于人类。)

Linstener 将给出答案:

yes

我们还可以询问,“谁属于人类?”

?-mortal(X).

我们会得到如下的答案:

X= socrates

这个简单的例子显示了 Prolog 的一些强大的功能。它能让程序代码更简洁、更容易编写。在多数情况下 Prolog 的程序员不需要关心程序的运行流程,这些都由 Prolog 自动地完成了。

1.4.1事实 (facts)

事实( facts )是 prolog 中最简单的谓词( predicate )。它和关系数据库中的记录十分相似。
谓词: Prolog 语言的基本组成元素,可以是一段程序、一个数据类型或者是一种关系。它由谓词名和参数组成。两个名称相同而参数的数目不同的谓词是不同的谓词。
事实的语法结构如下:
pred(arg1, arg2, … argN).
其中 pred 为谓词的名称。 arg1 , … 为参数,共有 N 个。
‘ . ’是所有的 Prolog 子句的结束符。
没有参数的谓词形式如下:
pred.
参数可以是以下四种之一:
1.整数( integer)
绝对值小于某一个数的正数或负数。
2.原子( atom )
由小写字母开头的字符串。
3.变量( variable )
由大写字母或下划线( _ )开头。
4.结构( structure )

不同的 Prolog 还增加了一些其他的数据类型,例如浮点数和字符串等。
Prolog 字符集包括: 大写字母, A-Z ;小写字母, a-z ;数字, 0-9 ; ±/^,.~:.?#$ 等。
原子通常是字母和数字组成,开头的字符必须是小写字母。例如:
hello
twoWordsTogether
x14
下面的是不合法的原子,
no-embedded-hyphens
123nodigitsatbeginning
Nocapsfirst
下划线不能放在最前面
使用单引号扩起来的字符集都是合法的原子。例如:
‘this-hyphen-is-ok’
‘UpperCase’
‘embedded blanks’
下面的由符号组成的也是合法的原子:
o >,++
变量和原子相似, 但是开头字符是大写字母或是下划线。例如:
X
Input_List
下划线开头的都是变量
_Z56
有了这些基本的知识,我们就可以开始编写事实了。事实通常用来储存程序所需的数据。
例如,某次商业买卖中的顾客数据。
customer/3 。( /3 表示 customer 有三个参数)
customer(‘John Jones’, boston , good_credit).
customer(‘Sally Smith’, chicago, good_credit).
必须使用单引号把顾客名引起来,因为它们是由大写字母开头的,并且中间有空格。
Prolog 的解释器提供了动态储存事实和规则的方法,并且也提供了访问它们的方法。

数据库的更新是通过运行‘ consult ’或‘ reconsult ’命令。我们也可以直接在解释器中输入谓词,但是这些谓词不会被储存到硬盘上。

1.4.2cquery

Prolog 的查询工作是靠模式匹配完成的。查询的模板叫做目标 (goal) 。如果有某个事实与目标匹配,那么查询就成功了, Prolog 的解释器会回显 ‘yes.’ 。如果没有匹配的事实,查询就失败了,解释器回显 ‘no.’ 。
我们把 Prolog 的模式匹配工作叫做联合 (unification) 。当数据库中只包括事实时,以下三个条件是使联合成功的必要条件。

目标谓词名与数据库中的某个谓词名相同。
这两个谓词的参数数目相同。
所有的参数也相同。

举报

相关推荐

0 条评论