Prolog语言基础知识
- 格式:pdf
- 大小:131.80 KB
- 文档页数:12
prolog 语法Prolog是一种逻辑编程语言,它的语法结构由谓词和规则组成。
以下是Prolog的基本语法规则:1. 事实(Facts):事实是描述真实情况的陈述,使用谓词表示。
例如:father(jack, john)表示"jack是john的父亲"。
2. 规则(Rules):规则定义了与事实之间的逻辑关系。
规则由头部和身体组成,使用":-"连接。
头部是一个谓词,身体是一个由逗号分隔的谓词列表。
例如:man(X) :- father(X, _), male(X)表示"如果X是某人的父亲且X是男性,则X是男人"。
3. 查询(Queries):查询用于检查一个特定条件是否成立。
查询以问号开头,使用谓词表示。
例如:?- man(X)表示"是否存在一个人X是男人"。
4. 变量(Variables):变量用大写字母或下划线开头。
变量在查询时用于接收结果。
例如:?- father(jack, X)表示"是否存在一个人X是jack的父亲"。
5. 列表(Lists):列表由方括号包围,其中的项由逗号分隔。
列表可以包含任何类型的元素,甚至包含其他列表。
例如:[1, 2, 3]表示一个包含数字1、2和3的列表。
6. 运算符:Prolog中的运算符被分为多个优先级和结合性。
常用的运算符包括算术运算符(+, -, *, /),比较运算符(<, >,=<, >=, =:=, \=)和逻辑运算符(,;,!,\+)。
7. 注释(Comments):Prolog中的注释以%开头,直到行末。
这些是Prolog语法的基本规则,但还有许多其他的语法特性和约定可用于更复杂的程序。
逻辑型程序设计语言PROLOG教程2.3. 1逻辑型程序设计语言PROLOGPROLOG的语句PROLOG语言只有三种语句,分别称为事实、规则和问题。
1.事实(fact)格式: <谓词名>(<项表>).功能一般表示对象的性质或关系。
其中谓词名是以小写英文字母打头的字母、数字、下划线等组成的字符串,项表是以逗号隔开的项序列。
例如:student(john).like( mary ,music).表示“约翰是学生”和“玛丽喜欢音乐”。
2. 规则(rule)格式:<谓词名>(<项表>):-<谓词名>(<项表>){,<谓词名>(<项表>)}.功能: 一般表示对象间的因果关系、蕴含关系或对应关系。
其中“:-”号表示“if”(也可以直接写为if),其左部的谓词是规则的结论(亦称为头),右部的谓词是规则的前提(亦称为体),{}表示零次或多次重复,逗号表示and(逻辑与),即规则的形式是一个逻辑蕴含式。
例如:bird(X):-animal(X),has(X,feather).grandfather(X,Y):-father(X,Z),father(Z,Y).第一条规则表示“如果X是动物,并且X有羽毛,则X是鸟”;第二条规则就表示“X 是Y的祖父,如果存在Z,X是Z的父亲并且Z又是Y的父亲”。
3.问题(question)格式: ?-<谓词名>(<项表>){,<谓词名>(<项表>)}.功能表示用户的询问,它就是程序运行的目标。
例如:?-student(john).?-like(mary,X).2.3. 2 PROLOG程序PROLOG程序一般由一组事实、规则和问题组成。
问题是程序执行的起点,称为程序的目标。
例如下面就是一个PROLOG程序。
likes(bell,sports).likes(mary,music).likes(mary,sports).likes(jane ,smith).friend(john,X):-likes(X,reading),likes(X,music).friend(john,X):-likes(X,sports),likes(X,music).?-friend(john,Y).可以看出,这个程序中有四条事实、两条规则和一个问题。
prolog的条件语句
Prolog是一种逻辑编程语言,它使用基于规则的推理系统来处理查询。
为了实现这种推理,Prolog引入了条件语句的概念,使得我们可以在程序中根据不同的情况执行不同的操作。
在Prolog中,条件语句的基本形式是if-then-else结构。
它的语法如下:
if (condition) then
statement1
else
statement2
其中,condition是一个逻辑表达式,它会被求值为真或假。
如果condition为真,则执行statement1;否则执行statement2。
需要注意的是,Prolog中的条件语句是非确定性的。
也就是说,当condition可以被求值为真或假时,Prolog会尝试所有可能的情况,直到找到一个满足条件的解决方案。
因此,在编写条件语句时,我们需要确保所有情况都被考虑到,以确保程序的正确性。
除了if-then-else结构外,Prolog还支持更复杂的条件语句,如case语句和switch语句。
这些语句在处理多个选择时非常有用,可以让我们更方便地组织程序。
总的来说,Prolog的条件语句为我们提供了一种灵活的控制结构,使得我们可以根据不同的情况执行不同的操作。
在编写Prolog 程序时,我们应该合理地运用条件语句,以实现更加高效和可靠的程
序。
Prolog语言基础知识一.数据结构PROLOG语言与其他任何一种计算机高级语言一样,有其定义的数据结构。
下面将介绍PROLOG语言的基本数据结构。
1.常量常量是数据结构的基本组成部分,用来对特定对象及关系的命名。
在PROLOG语言中,合法的常量有:(1)整数,一个纯数字串,例 182 000,581 202。
(2)原子,分为两种:1)标识符:以小写字母开头的,包含字母、数字、下划线的串,例aBC12,is_。
2)符号:PROLOG语言规定的符号集的非空序列,例?、-、=。
若原子用单引号厂(‘ ’)括住,则可含有任何字符。
(3)字符集ab...z2.变量变量是用来表示还无法知道且需要PROLOG程序来确定的客体。
变量用变量名表示,变量名与标识符相似,所不同的是以大写字母或下划线开头。
例Variable,_ansure。
PROLOG语言中有一个特殊的变量,不需要知道它是什么以及具体名字,只是表示留出一位置,称为匿名变量。
用单一的下划线(_)来表示。
比如只想知道是否有人喜欢跳舞,但不需知道这个人的名字,这时就可以用匿名变量。
3.结构结构是PROLOG语言中的第三类数据结构;用于构造PROLOG数据对象。
一个结构是一个单一的客体,它由一个函子和一个或多个称为分量的项的序列组成。
其书写形式为函子(分量1,分量2,…,分量n)其中的分量也可以是结构。
例如可用结构描述事实"Mary住zhongshan路120号":person(mary,address(zhongshan,120)).此例中address是一个具有两个分量即路名和门牌号的结构。
该结构是作为事实的一个分量出现,它将作为关系中的一个客体来对待。
当然,结构中的分量也可以是结构,如上例可写成:person(name(mary),address(street(zhongshan),number(120))).其中name,address,street,number均为结构。
用prolog解决汉诺塔问题因为没有接触过这种人工智能语言,所以有点战战兢兢,在这里就和大家来分享一下对prolog的理解:要想使用prolog,首先要了解prolog。
1、prolog语句(1)、谓词逻辑谓词,是只用来描述对象的状态、性质及对象之间的关系的词。
逻辑,是指事物的因果关系。
谓词逻辑:就是指利用谓词的行驶,来表达只和和进行因果推理例如:喜欢(小芳,羽毛球)即表示:小芳喜欢羽毛球。
(2)、事实、规则和目标(1)事实事实是prolog中最简单的谓词,一般表示对象的状态、性质或对象之间的关系。
其格式为:谓词(参数1,参数2……)例如:小芳喜欢羽毛球在prolog中可以这样表示:likes(xiaofang,badminton)。
(2)规则当一条事实需要依赖于另一条事实时,需要用规则来表示。
规则可以表示对象之间的因果关系、蕴涵关系或对应关系。
其格式:谓词名1(参数):-谓词名2(参数),谓词名3(参数)……符号“:-”表示如果,右面的谓词是规则的前提,左面的谓词是规则的结论。
例如:凡是喜欢乒乓球的都是小华的朋友。
在prolog中表示为:friend(X,xiaohua):-likes(X,pingpong).(3)目标用户的询问是程序运行的目标。
它可以是一个简单的谓词,也可以是多个谓词的组合。
目标通常直接在程序中写出(成为内部目标),也可以在程序运行时临时给出(成为外部目标)。
“?-”谓词名(参数)……“? –”表示提问例如:谁是小华的朋友?在Prolog中表示为:?-friend(X ,xiaohua)2、prolog的运行机理:prolog求解问题的过程是:从目标出发,不断地进行例化(当某一变量被赋值后就成为约束变量,也可以成为例化)、匹配(当两个谓词的名称相同,参数的个数、类型相同,并且还满足某些条件时,则这两个谓词可以相互匹配),有时还要进行回溯,知道目标被完全满足或不能满足时为止。
Prolog语言基础知识一.数据结构PROLOG语言与其他任何一种计算机高级语言一样,有其定义的数据结构。
下面将介绍PROLOG语言的基本数据结构。
1.常量常量是数据结构的基本组成部分,用来对特定对象及关系的命名。
在PROLOG语言中,合法的常量有:(1)整数,一个纯数字串,例 182 000,581 202。
(2)原子,分为两种:1)标识符:以小写字母开头的,包含字母、数字、下划线的串,例aBC12,is_。
2)符号:PROLOG语言规定的符号集的非空序列,例?、-、=。
若原子用单引号厂(‘ ’)括住,则可含有任何字符。
(3)字符集ab...z2.变量变量是用来表示还无法知道且需要PROLOG程序来确定的客体。
变量用变量名表示,变量名与标识符相似,所不同的是以大写字母或下划线开头。
例Variable,_ansure。
PROLOG语言中有一个特殊的变量,不需要知道它是什么以及具体名字,只是表示留出一位置,称为匿名变量。
用单一的下划线(_)来表示。
比如只想知道是否有人喜欢跳舞,但不需知道这个人的名字,这时就可以用匿名变量。
3.结构结构是PROLOG语言中的第三类数据结构;用于构造PROLOG数据对象。
一个结构是一个单一的客体,它由一个函子和一个或多个称为分量的项的序列组成。
其书写形式为函子(分量1,分量2,…,分量n)其中的分量也可以是结构。
例如可用结构描述事实"Mary住zhongshan路120号":person(mary,address(zhongshan,120)).此例中address是一个具有两个分量即路名和门牌号的结构。
该结构是作为事实的一个分量出现,它将作为关系中的一个客体来对待。
当然,结构中的分量也可以是结构,如上例可写成:person(name(mary),address(street(zhongshan),number(120))).其中name,address,street,number均为结构。
这样,该事实的表示更一目了然了。
在PROLOG语言中,常用的结构形式有:(1)函子(分量1,分量2,...,分量n)。
如上例Mary的住所。
(2)表。
表是PROLOG语言中最常用的数据结构,它由一些有序分量组成,其长度可任意。
有序即表示表中的分量次序是有意义的。
同样,表的分量可以是原子、结构等,当然也可以是表。
例如含有3个分量a,b,c的表可写成[a,b,c]。
如用函数的方式可写成.(a.(b.(c[])))。
其中符号"."是表的函子,也就是说,表是以"."为函子的特殊结构。
(3)表达式。
PROLOG语言提供了各种运算,如算术运算、比较运算等。
PROLOG语言中的运算可以是中缀形式,简明直观,符合人们的习惯。
算术表达式X+Y&Z中,"+"、"&"便是运算符,该表达式如用函数结构形式来表示就是+ (X&(YZ))。
所以,表达式也是一种结构。
PROLOG语言提供了统一的数据结构--项(term)。
在PROLOG中,无论是程序还是数据,都是由项构成。
项的定义为<项>::=<常量>|<变量>|<结构>|“(”<项>“)”每一个项书写为一个字符串。
二.程序结构PROLOG语言的程序结构非常简单,由三部分组成,即事实、规则和询问。
1.事实事实用来说明有关客体及客体之间的相互关系。
事实和规则都是逻辑推理的前提。
例如 J ohn喜欢 Mary(J ohn Li k e。
Mary)。
这是一个事实,它包含了两个客体 J ohn和Mary及一个关系li k es。
用PROLOG语言的标准形式描写即为li k es(j ohn,mary).事实中的关系(如 li k es)称为谓词,客体称为自变量。
事实的语义是表示该语句恒为真。
在PROLOG语言的标准形式中,谓词和确定的客体(常量)必须以小写字母开头,而变量客体用大写字母开头,客体间用逗号","分开,用一对圆括号括住,最后用“.”终结。
下面是一些事实的例子:f emale(j ane).ane是女性。
play(j ane,mary,chess).ane和mary下棋。
关系中自变量的个数是任意的,而语句意义的解释由程序员所确定。
如li k es(j ohn,mary),可解释成J ohn喜欢Mary,也可解释成Mary喜欢J ohn。
因此解释一个谓词含义是完全由程序设计者决定的,但一经确定,就必须在整个程序中遵守。
事实的语法与结构相似。
事实中的谓词对应于结构的函子,而事实中的自变量则对应于结构的分量。
2.规则规则是关于客体及其关系的一般陈述,表明某些关系的成立要依赖于其他一些关系的成立。
规则可以是事实的一种紧凑的表现形式。
自然语言中,用"如果"一词来说明规则。
在PROLOG语言中,规则由规则头和规则体组成,其间用符号":-"连接。
符号":-"表示"如果"。
规则用"."结尾。
例如"如果某人是学生,则j ohn就喜欢该人"。
用PROLOG语言书写应为li k es(j ohn, X):-student(X).表示如果student(X)成立,则li k es(j ohn)就成立。
PROLOG语言的规则的一般形式为p:-p1,p2,p3,…,pn..其中p1,…pn均为命题。
在此,逗号","是合取(∧或并且)的意思。
因此,规则的语义是:如果“p1∧p2∧…∧pn”为真,则p就为真,即规则头部就为真。
值得注意的是:在一条规则中,所有相同的变量代表了相同的客体,而在规则的不同次使用时,变量可以代表不同的客体。
但规则的同一次使用中,对一变量的解释必须完全一致。
一个谓词可用一些事实和规则的组合来定义,称为谓词的子句。
可以把PROLOG程序看做是事实和规则的一个库,称为数据库或知识库。
PROLOG系统的任务就是依据知识库中的知识(事实和规则的集合)来回答用户的问题。
编写PROLOG程序,实际上就是提供所需要的事实和规则,PROLOG系统能使计算机去利用事实和规则及自身所带有的推理方法,从一些事实推理出另一些事实。
3.询问PROLOG语言是一种可会话式语言。
执行一个PROLOG程序实际上就是进行人机对话,在将事实和规则存人数据库或知识库中后,就可以向系统询问一些有关的问题,而问题就是系统求解的目标。
例如设有数据库:li k es(mary,w ine).li k es(j ohn,meat).li k es(j ohn,X):-li k es(mary,X).就可以询问:"Mary喜欢葡萄酒吗?"或"J ohn喜欢什么?"PROLOC语言的询问的一般形式为?- p1,p2,…,pn..其中"?-"是PROLOG语言询问的特殊符号,p1,p,…pn的意义与规则中的意义相同。
询问的语义是:“p1∧p2∧…∧pn”是为真吗?"。
因此,上面的"Mary喜欢葡萄酒吗?"或"J ohn喜欢什么?"询问可分别写为:?-li k es(mar,w ine).?-i k es(j ohn,X).于是,PROLOG系统将根据数据库或知识库中的事实和规则进行推演来回答用户的问题。
三. PROLOG语言的内部谓词内部谓词是由PROLOG系统预先提供的,而不是由编程者自定义的谓词。
它们提供了无法靠程序来定义的功能,为用户提供常用的谓词。
编程时可不加定义地直接利用这些谓词,因而为程序设计提供了便利。
此外,内部谓词由系统实现,因此它们有很高的执行效率。
PROLOG语言有着较为丰富的系统内部谓词,由于篇幅所限只是粗略地按类介绍。
文中所提到例化是指一个变量去代表某个确定的客体。
1 比较类比较谓词类是具有两个自变量中缀形式的内部谓词,结果为T rue或F alse。
比较谓词有:X=Y等于X\=Y不等于X<Y小于X>Y大于X<=Y小于等于X>=Y大于等于X==Y强等于这些谓词的自变量可以是被例化为整数的变量,也可以是以常量形式出现的整数。
其中=、\=和==不仅是对整数而言,其自变量也可以是任何结构。
2 表达式类PROLOG语言提供的表达式求值和建立表达式的内部谓词如下:X is Y(Y可被例化为表达式。
该谓词首先对Y求值,得出一整数。
如X未例化,则X例化为这一结果,且目标成功;否则,如X已例化,则"is"退化为"="来判断成功与否。
)X+Y加法运算。
求值时自变量必须例化。
X-Y减法运算。
求值时自变量必须例化。
X*Y乘法运算。
求值时自变量必须例化。
X/Y整除法运算。
求值时自变量必须例化。
X mod Y取模运算。
求值时自变量必须例化。
可进行整数或实数求值。
运算的优先级是:+、-(正负号),mod(取模),*、/(乘除),+、-(加减)。
3 输入输出类PROLOG语言的输入输出类(I/O)谓词是系统从输入流输入一个项、一个字符或一个文件,或把一个项、一个字符或一个文件输出到输出流。
它们仅仅是功能性的,即仅完成一项动作。
(l)geto(X)。
如 X与输入流中的下一个字符匹配,则目标成功。
(2)get(X)。
如 X与输入流中的下一个打印字符匹配,则目标成功。
(3)s k ip(X)。
读入并跳过当前输入流中的字符,直到找到一个可与X匹配的字符。
(4)read(X)。
读入当前输入流的下一个项,并使之与X匹配。
(5)put(X)。
把整数X输出到当前输出流(X必须例化)。
(6)nl。
对当前输出流输出控制符"回车换行"。
(7)w rite(X)。
把项X输出到当前输出流。
(8) w rite q(X)。
与w rite(X)相似。
4控制谓词类(1)true。
该目标永远成功。
(2)f ail。
该目标永远失败。
使用f ail可以强制回溯,从而得到问题的所有解。
(3)!(cut)。
截断谓词!是PROLOG语言控制搜索过程的一个非常重要的内部谓词,它允许程序员告诉PROLOG系统,当对已满足的目标的链进行回溯时,前面的那些选择不需要重新考虑。
截断谓词! 的含义是:作为一个目标,它直接成功,但当回溯到它时,不能重新被满足,并使其双亲目标(触发含有!的子句的目标)立即失败。
即穿过"“!”的回溯是不可能的。
5表处理表是PROLOG中一种非常有用的数据结构。