Prolog语言基础知识
Prolog语言(耐心看完-你就入门了)剖析

Prolog的求解过程:
第一步:问题 uncle(a,U) 与事实逐个匹配, 不成功
2024/8/13
father(a, b). father(c, d). brother(a, c).
uncle(a,U) uncle(X, Y) :- brother(X, Z) , father(Z, Y). 第二步:与规则头(左部)匹配,即寻找合一者, 有 {a/X, U/Y} 转化为两个子问题:brother(a, Z)和father(Z, U)
人工智能
Artificial Intelligence (AI)
2024/8/13
Prolog 语言简介 Prolog语言是一种以一阶谓词为基础的逻辑性语 言(Programming in Logic)
2024/8/13
Prolog语言的特点 Prolog语言的基本内容 简单的例子
2024/8/13
例: P([the, cat, sat, down]).
?- P([ X | Y ]). 答案:X=the, Y=[cat, sat, down]
?-P([ X , Y | Z ]). 答案:X=the, Y=cat,Z=[sat, down]
2024/8/13
4 Prolog程序的结构
Prolog的程序分为两部分: 前提部分:所有事实和规则 问题部分:目标子句序列
2024/8/13
Prolog的求解过程
likes(m, f). likes(m, w). likes(j, w). likes(j, s).
现在有两个问题:likes(m, X) 和 likes(j, X))
第一步:第一个问题 likes(m, X) 去与事实匹配 (置换与合一),按顺序得到 {f/X}
prolog语言简介

例:
自动实现的搜索算法之二——回溯 回溯
clauses likes(tom,talk). /*1*/ likes(bill,swim). /*2*/ likes(bill,talk). /*3*/ friend(john,X):-likes(X,talk),likes(X,swim) /*4*/ 设Goal:friend(john,Who)
可以回溯 如果加入 cut p:- q1,q2,!,r1,r2. p:- s1,s2. 逻辑关系变为 P1 if (if q1∧ q2 then r1 ∧r2 else s1 ∧s2 ) then p q1 q2 ! r1 回溯
P P2 P r2 s1 s2
截断 回溯
影响回溯的手段之二——cut 影响回溯的手段之二
影响回溯的手段之二——cut (截 影响回溯的手段之二
断)
cut—无条件成功,并截断回溯
(也可以用! 表示)
影响回溯的手段之二——cut 影响回溯的手段之二
例:p:- q1,q2,r1,r2. p:- s1,s2. 逻辑关系是 if q1∧ q2∧r1 ∧r2 or s1 ∧s2 P P1 then p q1 q2 r1 r2 s1 s2 P2 P
影响回溯的手段之二——cut 影响回溯的手段之二
应改为 legal(X):- super_speed(X),!,fail. legal(X):- drunk_drive(X),!,fail. legal(X).
常识:“外Goal” 和“程序内goal” 有“勤” “懒” 之分
显然,此结果不完备
Press the SPACE bar
影响回溯的手段之一——fail 影响回溯的手段之一
fail—无条件失败,引起回溯
用于人工智能的Prolog语言

在示例程序中,添加有关性别的信息: Predicates
parent(symbol)
clauses parent(pam,bo
b). parent(tom,bo
b).
male(tom). male(bob). male( jim).
(3)关系的对象可以是常量 (如:tom,ann) ,也可以是变量(如:X,Y)。
(4)向系统提出问题,可由一个或多个目标组成。
(5)一个Prolog 程序由一些子句(clauses)组成。每个子句用句号结束。
(6)对一个问题的回答是肯定的或者是否定的,取决于相应的目标是否满足。 在肯定回答的情况下,说相应的目标是可满足的,而且这个目标成功了。 否则,说目标不可满足,目标失败了。
parent(Z,X), parent(Z,Y), female(X).
sister(X,pat).
改进的sister规则:
predicates
parent(symbol,symbol)
sister(symbol,symbol)
female(symbol)
male(symbol)
different(symbol,sym
R("zhsan").
4.2 家庭关系程序示例
下图是一个表示家庭关系的实例:
用Prolog 语句表示为:
Pam
Tom
).
Bob
Liz
).
Ann
Pat
Jim
parent(pam,bob
parent(tom,bob
parent(tom,liz). parent(bob,ann). parent(bob,pat).
prolog 语法

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

其次,调用过程AT(Zhang, x),从而产生新目标 T(Zhang, train),与事实匹配,产生目标 ⊓ 。因而调用成功,输出“True”。
高级人工智能
5
人工智能语言—Prolog语言
高级人工智能
10
人工智能语言—Prolog语言
Prolog的构成
目标(问题):关于对象性质或关系的询问。 ?— student(john) ?— married(mary,x)
高级人工智能
11
人工智能语言—Prolog语言
Prolog语言的基本文法
Prolog语言的最基本语言成分是项(term)
定理证明、智能问题求解、计算机辅助设计、规 划生成等领域。
高级人工智能
8
人工智能语言—Prolog语言
Prolog的构成
事实:事实用来说明一个问题中已知的对象和它们之间 的关系。在Prolog程序中,事实由谓词名及用括号括起 来的一个或几个对象组成。谓词和对象可由用户自己定 义
student(john) married(tom, mary) likes(bill,book)
Prolog语言及其基本结构
Prolog是当代最有影响的人工智能语言之一, 由于该语言很适合表达人的思维和推理规则, 在自然语言理解、机器定理证明、专家系统 等方面得到了广泛的应用,已经成为人工智 能应用领域的强有力的开发语言。
高级人工智能
6
人工智能语言—Prolog语言
现在的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引入了条件语句的概念,使得我们可以在程序中根据不同的情况执行不同的操作。
在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语言与其他任何一种计算机高级语言一样,有其定义的数据结构。
下面将介绍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均为结构。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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中一种非常有用的数据结构。