admin管理员组文章数量:1794759
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入门教程 内容由林淑君副主任自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.xiehuijuan.com/baike/1686868788a112582.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论