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 1else: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入门教程相关推荐
- Kafka入门教程与详解
1 Kafka入门教程 1.1 消息队列(Message Queue) Message Queue消息传送系统提供传送服务.消息传送依赖于大量支持组件,这些组件负责处理连接服务.消息的路由和传送.持久 ...
- 【CV】Pytorch一小时入门教程-代码详解
目录 一.关键部分代码分解 1.定义网络 2.损失函数(代价函数) 3.更新权值 二.训练完整的分类器 1.数据处理 2. 训练模型(代码详解) CPU训练 GPU训练 CPU版本与GPU版本代码区别 ...
- python tornado教程_Tornado 简单入门教程(零)——准备工作
前言: 这两天在学着用Python + Tornado +MongoDB来做Web开发(哈哈哈这个词好高端).学的过程中查阅了无数资料,也收获了一些经验,所以希望总结出一份简易入门教程供初学者参考.完 ...
- python向量计算库教程_NumPy库入门教程:基础知识总结
原标题:NumPy库入门教程:基础知识总结 视学算法 | 作者 知乎专栏 | 来源 numpy可以说是 Python运用于人工智能和科学计算的一个重要基础,近段时间恰好学习了numpy,pandas, ...
- mysql query browswer_MySQL数据库新特性之存储过程入门教程
MySQL数据库新特性之存储过程入门教程 在MySQL 5中,终于引入了存储过程这一新特性,这将大大增强MYSQL的数据库处理能力.在本文中将指导读者快速掌握MySQL 5的存储过程的基本知识,带领用 ...
- python tensorflow教程_TensorFlow入门教程TensorFlow 基本使用T
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 TensorFlow入门教程 TensorFlow 基本使用 TensorFlow官方中文教程 TensorFlow 的特点: 使用图 (graph) 来 ...
- air调用java,AIR2.0入门教程:与Java应用交互
在之前的一篇文章中,我介绍了如何使用AIR2.0新增的NativeProcess类与本地进程进行交互和通讯,在那个例子里面我们使用了C++ 的代码,实际上只要是基于命令行的标准输入输出,AIR2.0的 ...
- 【Arduino】开发入门教程【一】什么是Arduino
Arduino Arduino 是一款便捷灵活.方便上手的开源电子原型平台,包含硬件(各种型号的arduino板)和软件(arduino IDE).它适用于艺术家.设计师.爱好者和对于"互动 ...
- python 三分钟入门_Cython 三分钟入门教程
作者:perrygeo 译者:赖勇浩(http://laiyonghao.com) 原文:http://www.perrygeo.net/wordpress/?p=116 我最喜欢的是Python,它 ...
- BIML 101 - ETL数据清洗 系列 - BIML 快速入门教程 - 序
BIML 101 - BIML 快速入门教程 做大数据的项目,最花时间的就是数据清洗. 没有一个相对可靠的数据,数据分析就是无木之舟,无水之源. 如果你已经进了ETL这个坑,而且预算有限,并且有大量的 ...
最新文章
- 3DSSD:基于点云的single-stage物体检测模型 | CVPR2020
- 这一波震撼的福利,你绝对想不到!!!
- 上海大学计算机工程与科学学院官网,上海大学计算机工程与科学学院.PDF
- 软件工程作业之小学数学题目
- 2018.12.30|区块链技术头条
- 三星 平板手机电脑 Galaxytab2忘记开机密码解决方法
- python函数返回布尔值_python-3.x - 函数不返回正确的布尔值 - SO中文参考 - www.soinside.com...
- 美图回应与华为合作:华为没有使用美图的任何影像技术
- export project from intellij to myeclipse
- SVD原理及代码实现
- Drupal 7.17 发布,专业的 CMS 内容管理系统
- 牛客--二维数组中的查找
- SpringApplication#run⽅法第5步,打印banner(四)
- Rhino(犀牛)室内模型导入Unity3d快速烘焙光影【2020】
- Keil5各个版本的下载地址
- 微信小程序体验版无法调用接口
- 360游戏大厅打不开HTML游戏,360游戏大厅打不开怎么办
- 易语言新手入门教程第十五课 - QQ自动登录器第三部分
- [ZZ]Sign Up for the First-Ever Appium Roadshow on August 20th in New York City
- Office EXCEL 创建图片超链接打不开怎么办 Excel打开图片提示发生了意外错误怎么办