//love(zhangxueyou,wanfei). 爱(张学友,王菲). “张学友爱王菲”。
prolog是不允许使用除了基本字符以外字符的。
最末尾的“.”一定不能掉,它表示一个句子结束。

//“:-”在prolog中表示“如果”的意思,我们使用它来定义规则。
lovers(X,Y):-love(X,Y),love(Y,X).某人甲和某人乙是情侣的规则就是:某人甲爱某人乙,并且某人乙爱某人甲。上面用来分隔两个爱的句子的“,”表示并且的意思。

//提示符号为“?-”询问,返回yes/no。
?-love(zhangxueyou,wanfei).张学友爱王菲么?解释器将回答yes。

//“;”是人工输入的,当解释器找到一个答案之后,它将这个答案输出,并且等待用户的进一步输入,如果用户输入“;”,解释器将继续寻找其他的答案,如果输入的是别的符号,解释器将终止查询。

//事实(facts)是prolog中最简单的谓词(predicate)。它和关系数据库中的记录十分相似。

//谓词: Prolog语言的基本组成元素,可以是一段程序、一个数据类型或者是一种关系。它由谓词名和参数组成。两个名称相同而参数的数目不同的谓词是不同的谓词。

//事实的语法结构如下:
pred(arg1, arg2, ... argN).
其中pred为谓词的名称。arg1,...为参数,共有N个。‘.’是所有的Prolog子句的结束符。没有参数的谓词形式如下:
pred.
参数可以是以下四种之一:
整数(integer) 绝对值小于某一个数的正数或负数。
原子(atom) 由小写字母开头的字符串(通常是字母和数字组成,开头的字符必须是小写字母。使用单引号扩起来也是)。
变量(variable) 由大写字母或下划线(_)开头。变量‘_’是匿名变量。
结构(structure)结构由结构名和一定数量的参数组成,与目标和事实是一样的。

//Prolog的目标有四个端口用来控制运行的流程:调用(call)、退出(exit)、重试(redo)以及失败(fail)。一开始使用Call端口进入目标,如果匹配成功就到了exit端口,如果失败就到了fail端口,如果用户输入分号,则又从redo端口进入目标。call 开始使用目标搜寻子句。 
exit 目标匹配成功,在成功的子句上作记号,并绑定变量。 
redo 试图重新满足目标,首先释放变量,并从上次的记号开始搜索。 
fail 表示再找不到更多的满足目标的子句了。

//在Prolog的解释器中输入
?- debug.
就可以开始调试你的程序了。
 
//常用的输出谓词。
write/1
此谓词被调用时永远是成功的,并且它可以把它的参数作为字符串输出到屏幕上。当回溯时,它永远是失败,所以回溯是不会把已经写到屏幕上的字符又给删除的。
nl/0
此谓词没有参数,和write一样,从Call端口调用时总是成功的,从Redo端口回溯时总是失败的,它的作用是在屏幕上输出一个回车符。
tab/1
此谓词的参数是一个整数,它的作用是输出n个空格,n为它的参数。其控制流程与上面两个相同。

//fail/0 专门引起回溯的内部谓词,从它的名字不难看出,它的调用永远是失败的。如果fail/0从左边得到控制权,则它立即把控制权再传回到左边。它不会从右边得到控制,因为没法通过fail/0把控制权传到右侧。

//输出列表,结尾不显示no。
下面我们来编写list_connections/1,它能够列出与某个房间相连的所有房间。
list_connections(Place) 
:- connect(Place, X),
tab(2),
write(X),
nl, 
fail.
list_connections(_).

//算术
X is <数学表达式>
变量X将被赋值为表达式的值,在回溯时不赋值。
X >= Y 
X =< Y

//asserta(X)
把子句X当作此子句的谓词的第一个子句加入到动态数据库中。它和I/O内部谓词的流程控制相同。回溯是失败,并且不会取消它所完成的工作。

//retract(X)
把子句X从动态数据库中删除。此操作也是永久性的,也就是说回溯的时候不能撤销此操作。

//not/1内部谓词,它的参数是一个目标,如果此目标失败,则它成功;目标成功则它失败。

//联合
变量&任何项目: 变量可以与任何项目绑定,其中也包括变量 
原始项目&原始项目: 两个原始项目(原子或整数)只有当它们相同时才能联合。 
结构&结构: 如果两个结构的每个相应的参数能联合,那么这两个结构可以联合。 
‘=/2’内部谓词,此谓词当它的两个参数能够联合时成功,反之则失败。它的语法如下:
=(arg1, arg2)
为了方便阅读,也可以写成如下形式:
arg1 = arg2  注意:此处的等号在Prolog中的意义与其他语言中的不同。它不是数学运算符或者赋值符。
如果在两次绑定中变量的值发生冲突,那么目标就失败了。
如果变量不能绑定为某一可能的值,那么联合也将失败。
匿名变量(_)不会绑定为任何值。所以不要求它所出现的位置的值必须相同。

//列表
列表是一组项目的集合,此项目可以是Prolog的任何数据类型,包括结构和列表。列表的元素由方括号括起来,项目中间使用逗号分割。
我们可以使用列表来代替以前的多个子句。例如: loc_list([apple, broccoli, crackers], kitchen).
当某个列表中没有项目时我们称之为空表,使用“[]”表示。也可以使用nil来表示。下面的句子表示hall中没有东西。 loc_list([], hall)

//op/3来定义操作符,它的三个参数分别是:优先权、结合性、操作符名称。
每个操作符有不同的优先权值,从1到1200。当某句中有多个操作符时,优先权高的将先被考虑。优先权值越小优先权越高。
结合性使用模板来定义,例如中缀操作符使用“xfx”来定义。“f”表示操作符的位置。
当操作符的优先权相同时,Prolog必须决定是从左到右还是从右到左地读入操作符。这就是操作符的左右结合性。有些操作符没有结合性,如果你把两个这种操作符放到一起将产生错误。
Infix: 
xfx non-associative (没有结合性) 
xfy right to left 
yfx left to right 
Prefix 
fx non-associative 
fy left to right 
Postfix: 
xf non-associative 
yf right to left 
为了表示这种嵌套关系,我们可以使用从右到左的结合性。
?- op(35,xfy,is_in).

//display/1可以看到操作符等的标准的语法结构。

//只有一些特殊的内部谓词(例如is/2)进行真正的数学运算。is/2计算它右边表达式的值,并让左边绑定为此值。它与联合(=)谓词是不同的,=只进行联合而不进行计算。

Prolog学习笔记100805相关推荐

  1. Swi-Prolog学习笔记(入门篇)

    首先介绍一个学习swi-prolog 和amzi-prolog很靠谱的中文网站:http://hyry.dip.jp/tech/book/page/prolog/search_game_maxmin. ...

  2. 【人工智能】SWI-prolog学习笔记(一)

    首先感谢来自于 Patrick Blackburn, Johan Bos 和Kristina Striegnitz的一份03年教程 : Learn Prolog Now! 同时感谢来自于SWI官方的m ...

  3. 编译原理学习笔记2——高级程序设计语言概述

    编译原理学习笔记2--高级程序设计语言概述 2.1常用的高级程序设计语言 2.2程序设计语言的定义 2.2.1语法 2.2.1语法 2.2.3程序语言的基本功能和层次机构 2.2.4程序语言成分的逻辑 ...

  4. PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 call

    您的位置 首页 PyTorch 学习笔记系列 PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 发布: 2017年8月4日 7,195阅读 ...

  5. 容器云原生DevOps学习笔记——第三期:从零搭建CI/CD系统标准化交付流程

    暑期实习期间,所在的技术中台-效能研发团队规划设计并结合公司开源协同实现符合DevOps理念的研发工具平台,实现研发过程自动化.标准化: 实习期间对DevOps的理解一直懵懵懂懂,最近观看了阿里专家带 ...

  6. 容器云原生DevOps学习笔记——第二期:如何快速高质量的应用容器化迁移

    暑期实习期间,所在的技术中台-效能研发团队规划设计并结合公司开源协同实现符合DevOps理念的研发工具平台,实现研发过程自动化.标准化: 实习期间对DevOps的理解一直懵懵懂懂,最近观看了阿里专家带 ...

  7. 2020年Yann Lecun深度学习笔记(下)

    2020年Yann Lecun深度学习笔记(下)

  8. 2020年Yann Lecun深度学习笔记(上)

    2020年Yann Lecun深度学习笔记(上)

  9. 知识图谱学习笔记(1)

    知识图谱学习笔记第一部分,包含RDF介绍,以及Jena RDF API使用 知识图谱的基石:RDF RDF(Resource Description Framework),即资源描述框架,其本质是一个 ...

最新文章

  1. sql 自动 清理 ldf 日志_阳泉自动转盘式喷砂机
  2. 江西省一级计算机考试试题,江西省计算机一级考试试题
  3. 使用ADF列表视图的主从数据
  4. PHP异常与错误处理机制
  5. STM32项目(二) —— 车灯测试台架
  6. 【Python爬虫】Beautiful Soup库入门
  7. go并发编程-理解不同并发场景下的go原语
  8. abb变频器dp适配器说明书_国产变频器与西门子和ABB的差距大吗?
  9. jmeter分布式性能测试
  10. 独特的 Erlang -- Eralng 学习笔记 (1)
  11. 如何修改注册表的计算机名称,如何修改注册表【图文】
  12. 【基于JavaEE的医院药品管理系统的设计与实现】
  13. Redis -- 羊哥CodeSheep20题(转发)
  14. 双碳目标下综合能源系统低碳运行优化调度Matlab程序
  15. 微信点餐系统的开发与实现
  16. 8个酷炫的GitHub技巧
  17. Linux下线程池源码实现
  18. 终于知道google为什么有时不能用了
  19. 【教程搬运】读懂github上的工程代码——带你熟悉Python中的Parser
  20. 无人机、手持全景设备、单反制作全景的基础流程,及全景成果与地图融合

热门文章

  1. 前端学习(659):小结
  2. 前端学习(585):查看和编辑css
  3. 前端学习(495):嵌入代码与外部文件和文档模式
  4. The Apache Tomcat installation at this directory is version,tomcat
  5. java学习(70):GUL图形用户界面初识
  6. KEIL ARM 6.12 compiler 编译__ASM 错误的解决方法
  7. MySQL常用语法记录
  8. 计算机无法同步时间,为什么在Win7中无法同步计算机时间?
  9. 正则不等于一个字符串_乳饮料不等于酸奶,记住一个关键词,花最少的钱买到真正的好酸奶...
  10. ref是什么意思_终于有人说出A股不敢说的话:为什么股价不断下跌,大单却持续流入,你知道是什么缘由吗?...