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),即可以把Fn之间理解为一种对应关系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入门教程相关推荐

  1. Kafka入门教程与详解

    1 Kafka入门教程 1.1 消息队列(Message Queue) Message Queue消息传送系统提供传送服务.消息传送依赖于大量支持组件,这些组件负责处理连接服务.消息的路由和传送.持久 ...

  2. 【CV】Pytorch一小时入门教程-代码详解

    目录 一.关键部分代码分解 1.定义网络 2.损失函数(代价函数) 3.更新权值 二.训练完整的分类器 1.数据处理 2. 训练模型(代码详解) CPU训练 GPU训练 CPU版本与GPU版本代码区别 ...

  3. python tornado教程_Tornado 简单入门教程(零)——准备工作

    前言: 这两天在学着用Python + Tornado +MongoDB来做Web开发(哈哈哈这个词好高端).学的过程中查阅了无数资料,也收获了一些经验,所以希望总结出一份简易入门教程供初学者参考.完 ...

  4. python向量计算库教程_NumPy库入门教程:基础知识总结

    原标题:NumPy库入门教程:基础知识总结 视学算法 | 作者 知乎专栏 | 来源 numpy可以说是 Python运用于人工智能和科学计算的一个重要基础,近段时间恰好学习了numpy,pandas, ...

  5. mysql query browswer_MySQL数据库新特性之存储过程入门教程

    MySQL数据库新特性之存储过程入门教程 在MySQL 5中,终于引入了存储过程这一新特性,这将大大增强MYSQL的数据库处理能力.在本文中将指导读者快速掌握MySQL 5的存储过程的基本知识,带领用 ...

  6. python tensorflow教程_TensorFlow入门教程TensorFlow 基本使用T

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 TensorFlow入门教程 TensorFlow 基本使用 TensorFlow官方中文教程 TensorFlow 的特点: 使用图 (graph) 来 ...

  7. air调用java,AIR2.0入门教程:与Java应用交互

    在之前的一篇文章中,我介绍了如何使用AIR2.0新增的NativeProcess类与本地进程进行交互和通讯,在那个例子里面我们使用了C++ 的代码,实际上只要是基于命令行的标准输入输出,AIR2.0的 ...

  8. 【Arduino】开发入门教程【一】什么是Arduino

    Arduino Arduino 是一款便捷灵活.方便上手的开源电子原型平台,包含硬件(各种型号的arduino板)和软件(arduino IDE).它适用于艺术家.设计师.爱好者和对于"互动 ...

  9. python 三分钟入门_Cython 三分钟入门教程

    作者:perrygeo 译者:赖勇浩(http://laiyonghao.com) 原文:http://www.perrygeo.net/wordpress/?p=116 我最喜欢的是Python,它 ...

  10. BIML 101 - ETL数据清洗 系列 - BIML 快速入门教程 - 序

    BIML 101 - BIML 快速入门教程 做大数据的项目,最花时间的就是数据清洗. 没有一个相对可靠的数据,数据分析就是无木之舟,无水之源. 如果你已经进了ETL这个坑,而且预算有限,并且有大量的 ...

最新文章

  1. 3DSSD:基于点云的single-stage物体检测模型 | CVPR2020
  2. 这一波震撼的福利,你绝对想不到!!!
  3. 上海大学计算机工程与科学学院官网,上海大学计算机工程与科学学院.PDF
  4. 软件工程作业之小学数学题目
  5. 2018.12.30|区块链技术头条
  6. 三星 平板手机电脑 Galaxytab2忘记开机密码解决方法
  7. python函数返回布尔值_python-3.x - 函数不返回正确的布尔值 - SO中文参考 - www.soinside.com...
  8. 美图回应与华为合作:华为没有使用美图的任何影像技术
  9. export project from intellij to myeclipse
  10. SVD原理及代码实现
  11. Drupal 7.17 发布,专业的 CMS 内容管理系统
  12. 牛客--二维数组中的查找
  13. SpringApplication#run⽅法第5步,打印banner(四)
  14. Rhino(犀牛)室内模型导入Unity3d快速烘焙光影【2020】
  15. Keil5各个版本的下载地址
  16. 微信小程序体验版无法调用接口
  17. 360游戏大厅打不开HTML游戏,360游戏大厅打不开怎么办
  18. 易语言新手入门教程第十五课 - QQ自动登录器第三部分
  19. [ZZ]Sign Up for the First-Ever Appium Roadshow on August 20th in New York City
  20. Office EXCEL 创建图片超链接打不开怎么办 Excel打开图片提示发生了意外错误怎么办

热门文章

  1. Win7显示文件拓展名
  2. Spring Cloud 快速入门指南(一)
  3. Python程序员培训计划
  4. 如何将PDF转换成xls格式的表格
  5. wordcloud----canvas 绘制标签云/词云web版wordle(一)
  6. Android音频开发(二):录制音频(WAV及MP3格式)
  7. FCFS,SSTF,SCAN,FIFO,LRO
  8. 【已解决】Win 10 切换程序时,默认输入法始终为英文,抓狂,解决办法
  9. Excel如何将二维表转成数据列
  10. java球的体积计算