admin管理员组

文章数量:1794759

Prolog入门教程

Prolog入门教程

Prolog是一门逻辑式编程语言,专门用来解决逻辑问题。其语法风格源于Horn子句逻辑,故本质上来说是对事实与规则的一种描述,就规则定义来说是声明式语言,从调用来看有点像查询语言,总之与其他语言风格迥异。

文章目录
  • 入门案例
  • 基本概念
  • 程序结构
    • 事实与规则
    • 内部谓词
  • 递归

入门案例

我们可以新建一个prolog文件

%test.pl %在prolog中注释符为% friend(john,julia).%声明john和julia为friend friend(john,jack).%在prolog中用.结尾 friend(julia,sam). friend(julia,molly).

然后在控制台中调用

?- [test]. %调用test.pl true. ?- friend(john,julia). %查询john和julia是否为friend true.

在上例中,friend为标识符原子,john、julia、sam等均为字符串原子。

基本概念

prolog语言提供了统一的数据结构,即项(term),在prolog中,无论程序还是数据,都是由项构成。项包括常量、变量以及复合项;常量又包括原子和数,其概念的从属关系和定义规则如下。

概念定义或包括
<项><常量>、<变量>、<复合项>
<常量><原子>、<数>
<原子><标识符原子>、<字符串原子>、<特殊原子>
<标识符原子>小写字母开头的小写字母数字串
<变量>大写字母开头的字母数字串
<空变量>_
<复合项><原子>(<项>{,<项>}))、<项><原子><项>{<原子><项>})

此外,prolog还提供了表结构,用[ ]表示,例如[john,sam,julia]。在表中,可以通过|来划分表头,例如定义P(john,sam,julia,jack]),那么

?- mylist([A,B|C]). A = john, B = sam, C = [julia, jack].

即|之前的值一一对应。

需要注意的是,列表的长度可变。长度不可变的列表即元组,用( )表示。

程序结构 事实与规则

prolog的程序分为前提与问题两个部分,需要注意的是前后不能颠倒。前提,即所有的事实和规则,在入门案例中,test.pl便是前提;问题及目标子句序列,即后面的查询语句。 在前提段,我们可以定义事实和规则,在入门案例中,friend(jhon,julia)即事实。在客观意义上,朋友关系是可逆的,这则是一种规则,可以表示为friend(X,Y):-friend(Y,X),需要注意的是,X、Y大写表示变量。

内部谓词

可以理解为prolog自定义的函数。

  • 比较谓词 包括>、<、>=、<=、=、\\=,其中=为等于,\\=为不等于,与其他语言相差比较大。
  • 赋值谓词 is,相当于其他语言中的=
  • 运算谓词 +、-、*、/、mod ,mod为取模

在prolog中,write(X)相当于C语言中的printf(X),fn为换行符。

递归

prolog的语法风格与其他语言迥异,但其编程思想却与其他语言共通。例如,对于阶乘问题,我们可以快速写出一个python程序:

def fac(n): if n<2: return 1 else: return n*fac(n-1)

或者更简洁一点fac = lambda n : n*fac(n-1) if n>1 else 1。令F=fac(n),即可以把F和n之间理解为一种对应关系fac。

换句话说,用prolog的语言风格即fac(N,F)。其中,N和F是一一对应的。那么这个程序可以写为

fac(0,1). %0的阶乘是1 fac(1,1). %1的阶乘是1 fac(N,F) :- N>1,N1 is N-1,fac(N1,F1),F is N*F1.

在第三行定义了阶乘的规则,如果N和F满足fac条件,则意味着N1和F1同样满足fac条件,其中N1 is N-1, F1 is N*F1。其调用结果如下。

?- [fac]. true. ?- fac(10,X). X = 3628800 .

本文标签: 入门教程Prolog