Prolog学习笔记100805

//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计算它右边表达式的值,并让左边绑定为此值。它与联合(=)谓词是不同的,=只进行联合而不进行计算。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/417557.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

charts引入icon图片_v-charts 踩坑之路

最近要做一个大屏 没有使用echarts 使用了更适合vue封装的v-charts组件库&#xff0c;第一次使用 期间踩了不少坑&#xff0c;记录下来和大家分享一下。废话不多说 开始搞起来&#xff01;一、安装 引入什么的大家自行百度 百度一下&#xff0c;你就知道​www.baidu.com二、2.1…

今天星期一在家值班

只盼着不要出问题 转载于:https://www.cnblogs.com/bkchengzheng/p/6196193.html

高一学生计算机知识现状分析,关于高中信息技术课教学现状的思考

一、 当前信息技术教学现状的分析(一)课程开设的现状高中信息技术课已经开展好多年了&#xff0c;总的来说&#xff0c;越来越被教育部门重视了&#xff0c;从刚开始的仅仅要求学生认识计算机&#xff0c;到学习一些简单处理软件&#xff0c;到把信息技术整合成一门象样的…

魔兽争霸 地图编辑器 常用属性【原创】

物体单位 技能-英雄&#xff1a;选择英雄的技能文本-名字&#xff1a;英雄的名字状态-初始力量、敏捷、智力&#xff1a;初始三围状态-初始属性&#xff1a;初始英雄类别&#xff08;力量、敏捷、智力&#xff09;状态-每等级所加力量、敏捷、智力&#xff1a;每升一级增加三围…

pla3d打印材料密度_模具粉必看!总有一款粉末能解决您的问题-毅速3D打印研制...

金属3D打印最常见的形式是粉末床熔融。这类工艺使用热源&#xff08;SLM工艺使用激光&#xff0c;EBM工艺使用电子束&#xff09;逐点将粉末颗粒熔融在一起&#xff0c;逐层加工至物件完成。在金属3D打印过程中&#xff0c;可能存在很多设备操作者试图避免的问题&#xff0c;包…

魔兽争霸 地图编辑器 笔记

//高级——游戏平衡常数英雄最大XP取得范围&#xff1a;最大经验值英雄最大等级限制 //玩家属性——势力重新定义添加势力——我方共享单位控制、共享高级单位控制

【Networking】容器网络大观 SDN 资料汇总

SDNLAB技术分享&#xff08;十五&#xff09;&#xff1a;容器网络大观SDNLAB君 • 16-06-17 •2957 人围观编者按&#xff1a;本文系SDNLAB技术分享系列&#xff0c;本次分享来自SDN撕X群&#xff08;群主&#xff1a;大猫猫&#xff09;群直播&#xff0c;我们希望通过SDNLAB…

七年级计算机室使用计划表,七年级信息技术教学工作计划

时间眨眼而过&#xff0c;又是一年工作计划的时刻啦!下面是出国留学网小编为大家整理的“七年级信息技术教学工作计划”&#xff0c;欢迎参阅。内容仅供参考&#xff0c;了解更多关于工作计划内容&#xff0c;请关注出国留学工作计划栏目。七年级信息技术教学工作计划【一】一、…

java 建立ssh隧道_SSH基础

SSH基本概念SSH 为 Secure Shell 的缩写&#xff0c;由 IETF 的网络小组&#xff08;Network Working Group&#xff09;所制定&#xff1b;SSH 为建立在应用层基础上的安全协议。SSH 是较可靠&#xff0c;专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有…

windows 批处理

暂停 pause>nul 批处理删除自身 attrib -h -s -r -a %0 del %0 第一行是把自身可能有的隐藏&#xff0c;系统&#xff0c;只读&#xff0c;存档属性去掉 第二行代码是删除自身&#xff08;%0代表自身&#xff09; 设置默认的控制台前景和背景颜色 COLOR [attr] attr …

GJM : Unity3D HIAR -【 快速入门 】 三、导入 SDK

导入 SDK 本文将向您介绍如何在 Unity 工程中导入 HiAR SDK for Unity。在开始之前&#xff0c;请先访问 HiAR 官网下载最新版本的 SDK。 下载 HiAR SDK for Unity Step 1. 下载解压 SDK 前往下载页面下载 SDK 包&#xff0c;可以获得一个 zip 文件&#xff1a;hiar_sdk_unity_…

5g时代计算机网络过时,5g云电脑 取代主机(5g时代云电脑会普及吗)

云电脑会是未来的发展方向&#xff0c;但是要完全取代传统的个人电脑&#xff0c;还需要一段时间。云电脑相比传统个人电脑&#xff0c;更方便灵活&#xff0c;更环保&#xff0c;更便宜。但是目前网络速度还有一定瓶。有一定关系&#xff0c;首先5g的普及&#xff0c;电脑网速…

蚁群算法

蚁群算法(ant colony optimization, ACO)&#xff0c;又称蚂蚁算法&#xff0c;是一种用来在图中寻找优化路径的机率型算法。它由Marco Dorigo于1992年在他的博士论文中提出&#xff0c;其灵感来源于蚂蚁在寻找食物过程中发现路径的行为。蚁群算法是一种模拟进化算法,初步的研究…

中修改环境变量_Golang入门(1):安装与配置环境变量的意义

摘要在几年前学习Java的时候&#xff0c;环境的配置就会劝退一部分的初学者。而对于Golang来说&#xff0c;也需要从环境的配置开始学起。这一篇文章将从如何安装Golang开始讲起&#xff0c;随后将会提到Golang中的环境变量GOROOT和GOPATH的配置以及这两个环境变量起到什么样的…

1219个人总结

我们团队使用的工具有&#xff1a;Eclipse&#xff0c;github&#xff08;保存代码&#xff0c;实现代码合并&#xff09; 使用的API&#xff1a;Bmob&#xff08;云数据&#xff09;官网&#xff1a;http://www.bmob.cn/ Mob&#xff08;短信验证&#xff09;&#xff1a;http…

华科计算机学院有博士吗,华科计算机学院博士毕业条件

华中科技大学计算机学院2008级博士论文规定根据《华中科技大学申请博士学位发表学术论文的规定》&#xff0c;我院博士研究生申请博士学位前&#xff0c;须按以下要求之一发表学术论文&#xff1a;1、A类、B类或学院规定的国际顶尖学术会议论文一篇&#xff1b;2、SCI期刊论文一…

js IE和Firefox下event处理

如果在使用javascript的时候涉及到event处理&#xff0c;就需要知道event在不同的浏览器中的差异&#xff0c;因为javascript的事件模型有三种&#xff0c;它们分别是NN4、IE4和W3C/Safari;这也造成了在不同的浏览器中处理event的差异&#xff0c;这里结合一些零碎的代码来说明…

线程打印状态_Java线程状态的转换

根据上面关于线程状态的介绍我们可以得到下面的线程状态转换图:BLOCKED与RUNNABLE状态的转换我们在上面说到:处于BLOCKED状态的线程是因为在等待锁的释放。假如这里有两个线程a和b, a线程提前获得了锁并且暂未释放锁&#xff0c;此时b就处于BLOCKED状态。我们先来看一个例子:初…