Prolog入门教程
发布日期:2021-10-06 15:05:22 浏览次数:16 分类:技术文章

本文共 1681 字,大约阅读时间需要 5 分钟。

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

文章目录

入门案例

我们可以新建一个prolog文件

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

然后在控制台中调用

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

在上例中,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),即可以把Fn之间理解为一种对应关系fac

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

fac(0,1).	%0的阶乘是1fac(1,1).	%1的阶乘是1fac(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 .

转载地址:https://blog.csdn.net/m0_37816922/article/details/100912825 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:python交互绘制Julia集
下一篇:python光学仿真之菲涅耳公式

发表评论

最新留言

不错!
[***.144.177.141]2024年03月29日 07时17分33秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

基于VMware安装CentOs7的镜像 2019-04-27
PL/SQL数据库管理工具的使用 2019-04-27
带你玩转属于自己的spring-boot-starter系列(一) 2019-04-27
带你玩转属于自己自己的spring-boot-starter系列(二) 2019-04-27
带你玩转属于自己的spring-boot-starter系列(三) 2019-04-27
基于SnowFlake算法如何让分库分表中不同的ID落在同一个库的算法的实现 2019-04-27
基于springboot的ShardingSphere5.X的分库分表的解决方案之分库解决方案(二) 2019-04-27
基于springboot的ShardingSphere5.X的分库分表的解决方案之分表解决方案(一) 2019-04-27
基于springboot的ShardingSphere5.X的分库分表的解决方案之关联查询解决方案(三) 2019-04-27
基于springboot的ShardingSphere5.X的分库分表的解决方案之基于seata的分布式事务的解决方案(十五) 2019-04-27
Linux文件管理参考 2019-04-27
FTP文件管理项目(本地云)项目日报(一) 2019-04-27
FTP文件管理项目(本地云)项目日报(二) 2019-04-27
FTP文件管理项目(本地云)项目日报(三) 2019-04-27
FTP文件管理项目(本地云)项目日报(四) 2019-04-27
【C++】勉强能看的线程池详解 2019-04-27
FTP文件管理项目(本地云)项目日报(五) 2019-04-27
FTP文件管理项目(本地云)项目日报(关于不定长包的测试) 2019-04-27
FTP文件管理项目(本地云)项目日报(六) 2019-04-27
FTP文件管理项目(本地云)项目日报(七) 2019-04-27