PROLOG基础
lisp和prolog[精华]
![lisp和prolog[精华]](https://img.taocdn.com/s3/m/ffdf9d71f4335a8102d276a20029bd64793e6256.png)
LISP和Prolog计一石伟辰数理逻辑又称符号逻辑、理论逻辑。
它是数学的一个分支,是用数学方法研究逻辑或形式逻辑的学科。
其研究对象是对证明和计算这两个直观概念进行符号化以后的形式系统。
数理逻辑是数学基础的一个不可缺少的组成部分。
虽然名称中有逻辑两字,但并不属于单纯逻辑学范畴。
所谓数学方法就是指数学采用的一般方法,包括使用符号和公式,已有的数学成果和方法,特别是使用形式的公理方法。
用数学的方法研究逻辑的系统思想一般追溯到莱布尼茨,他认为经典的传统逻辑必须改造和发展,是之更为精确和便于演算。
后人基本是沿着莱布尼茨的思想进行工作的。
简而言之,数理逻辑就是精确化、数学化的形式逻辑。
它是现代计算机技术的基础。
新的时代将是数学大发展的时代,而数理逻辑在其中将会起到很关键的作用。
逻辑是探索、阐述和确立有效推理原则的学科,最早由古希腊学者亚里士多德创建的。
用数学的方法研究关于推理、证明等问题的学科就叫做数理逻辑。
也叫做符号逻辑。
程序语言学、语义学的研究从模型论衍生而来,而程序验证则从模型论的模型检测衍生而来。
典型的人工智能语言主要有LISP、Prolog、Smalltal k、C++等。
一般来说,人工智能语言应具备如下特点:具有符号处理能力(即非数值处理能力)适合于结构化程序设计,编程容易;具有递归功能和回溯功能;具有人机交互能力。
适合于推理;既有把过程与说明式数据结构混合起来的能力,又有辨别数据。
确定控制的模式匹配机制。
由于人工智能研究的问题的特点和解决问题的方法的特殊性,为了能方便而有效地建立人工智能系统,需要发展专门的人工智能语言。
人工智能语言的特点是什么,亦即人工智能语言应具备的特征是什么?一般来说,人工智能语言应具备如下特点:1.要有符号处理能力(即非数值处理能力);2.适合于结构化程序设计,编程容易;(要把系统分解成若干易于理解和处理的小单位的能力,从而既能较为容易地改变系统的某一部分,而又不破坏整个系统。
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}
4.prolog 与visual prolog

?_parent(tom,X), ?_parent(X,Y).
jim
以上程序说明的几个重要观点: (1)在Prolog中定义一个关系是容易的,可以通过满足关系的n个对象来表达。 (2)对程序中已定义的关系,用户可以轻而易举地询问Prolog 系统。 (3)关系的对象可以是常量 (如:tom,ann) ,也可以是变量(如:X,Y)。 (4)向系统提出问题,可由一个或多个目标组成。 (5)一个Prolog 程序由一些子句(clauses)组成。每个子句用句号结束。 (6)对一个问题的回答是肯定的或者是否定的,取决于相应的目标是否满足。在肯定 回答的情况下,说相应的目标是可满足的,而且这个目标成功了。否则,说目标不 可满足,目标失败了。
一个Turbo Prolog程序通常包括5个部分。如下:
1.域说明部分,说明谓词对象的数据类型。 /* 注释 */ domains 域说明 database 数据库说明 predicates 谓词说明 goal 目标说明 clauses 子句说明 /* 注释 */ 2.数据库说明部分,包含一些数据库谓词的定义, 是说明用于动态数据库管理的谓词。如果程序不 需要动态数据库,该部分可省略。 3.谓词说明部分,定义程序中除内部谓词以外的 所有谓词。
Prolog 有三种形式的语句: 1. B:- A1,A2,…,An . 含义是 A1 A2... An B ,相当于~A1~A2… ~An B。可视作人工智能 系统中的推理规则。也可将该句看作一个过程,B为过程头,是过程名,而 {A1,A2,…,An }为过程体。 2. A1,A2,…,An . 含义是 A1 A2 ... An F ,相当于~A1~A2… ~An,可视作推理的目 标,或称目标子句。 3. B. 含义是公式B无条件地为真。可视作已知的事实。
SWI-PROLOG第1章 事实

第1章事实、规则和查询这一章有两个主要目标:给一些简单的Prolog程序的例子。
这将会给我们介绍Prolog的三种基本结构:事实、规则和查询。
它也会给我们介绍其他一些主题,像逻辑Prolog的角色,执行统一的概念借助变量。
开始Prolog通过定义条件的系统研究,原子变量和其他语法概念。
1.1 一些简单的例子知识基础1知识基础2知识库3知识库4知识基础51.2 Prolog语法原子数字变量复杂的条款1.3 练习1.4 实际的会话1.1一些简单的例子只有Prolog中的三种基本结构:事实、规则和查询。
事实和规则的集合称为知识库(或数据库)和Prolog 编程都是关于写作知识基础。
也就是说,Prolog程序简单是知识库,事实和规则的集合描述关系的集合,我们发现一些有趣的。
那么,我们如何使用Prolog程序?通过提出查询。
也就是说,通过询问信息存储在知识库中。
这可能听起来很奇怪。
这当然不明显,与编程。
毕竟,不是编程告诉计算机做什么吗?但我们应当看到,Prolog的编程方式是非常合理的,至少对于某些任务;例如,它是有用的在计算语言学和人工智能(AI)。
而是说更多关于Prolog概括地说,让我们直接开始编写一些简单的知识基础;这不仅仅是学习Prolog的最佳方式,这是唯一的方法。
知识基础1知识库1(KB1)是一个简单事实的集合。
事实是用于国家的事情无条件地真正感兴趣的一些情况。
例如,我们可以,Mia, Jody, Yolanda是woman, Jody扮演空气吉他,一方发生,使用以下五个事实:woman(mia).woman(jody).woman(yolanda).playsAirGuitar(jody).party.这个事实是KB1的集合。
这是我们的第一个例子的Prolog程序。
注意,名字mia,jody,yolanda,属woman和 playsAirGuitar,命题方一直在写,第一个字母小写。
这是很重要的;稍后我们将看到为什么。
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简单教程

likes(tom,wine). likes(tom,book).
* 程序内goal则是找到一个解就停止搜索了 例:predicates likes(symbol,symbol) goal likes(tom,W),write(―tom likes ‖,W,‖\n‖). clauses likes(tom,food). likes(tom,wine). 程序内goal 运行结果 likes(tom,book). Dialog Tom tom likes food
3、影响回溯的手段——fail和cut
注意:Turbo Prolog ―外Goal‖ 和“程序内goal‖ 有“勤” “懒” 之分 * 对话框中输入的外Goal主动找出全部解并报告有几个 外Goal运行情况 Solutions Dialog 例:predicates Goal:likes(tom,What) likes(symbol,symbol) What=food What=wine clauses What=book likes(tom,food). 3 Solutions
•
表(List)
——
•
表由方括号与元素组成,元素又可是一个表。 非空表可用[x|y]表示,x—表头 y—表尾 • 例: [a,b,c] [a | [b,c]] 表头 a
表尾 [c]
[c]
[b | [c]]
[c | []]
表头 b 表尾 [c]
表头 c 表尾 []
空表无表头!
匹配与回溯
GOAL(目标)
predicates 运行 thief(symbol) Dialog likes(symbol,symbol) Goal : may_steal(john,What) may_steal(symbol,symbol) What=food clauses What=wine thief(john). 2 Solutions likes(tom,food). likes(john,wine). likes(john,X):- likes(tom,X). may_steal(X,Y):- thief(X),likes(X,Y).
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提供了BIPs用于删除或者增加数据库中 的语句。 • 如果一个谓词可以被assertz, retract等BIPs修改, 那么它必须声明是动态的,否则Prolog将报错。 动态声明必须放在谓词声明的前面,最好放在 整个程序的前面,声明方式如下: • dynamic(mypred/3). • 这就将mypred/3谓词声明为动态,可用BIPs进 行增删了。
love(zhangxueyou,wanfei). love(zhangxueyou,zouhuimin). love(wanfei,xietinfen). love(zouhuimin,zhangxueyou). love(xietinfen,wanfei). love(xietinfen,zouhuimin). love(liudehua,zouhuimin). lovers(X,Y):-love(X,Y),love(Y,X). • ?-love(zhangxueyou,wanfei). • ?-love(zhangxueyou,liudehua). • ?- lovers(X,Y).
large_animal(X):-animal(X),large(X). go:-write(‘hello world’),nl.
• 谓词,元数。描述性质或关系的atom.谓词 可以记录为pred/n,比如parent/1
• 谓词分为用户自定义和built-in谓词(BIPs)。
• IO谓词如write,nl就是BIPs,它们都是总会成 功的谓词。用户不能重定义BIPs。
• 2)存在量词,head中没有,在body中出现的量词, 仅仅为了表示该变量至少存在一个值,这样的变量 称为存在量词。例如: • person(dennis,zane,male,25,programmer). • man(A):-person(A,B,male,C,D). • man谓词body部分的B,C,D变量就是存在量词
4、Prolog的注释
• /* this is a comment */
• %
5、查询
• dog(X),查询所有满足谓词dog的X,也就是 找出所有的狗狗。 • dog(X),cat(X).查询是狗又是猫的“东西”。 • listing(dog),列出所有定义了谓词dog的语 句。
6、数据类型
• 循环直到条件满足: go:-loop(start). loop(end). loop(X):X\=end, write('Type end to end'),read(Word), write('Input was '),write(Word),nl,loop(Word).
• • • •
通过;/2谓词,可以改写为: loop:-write('Type end to end'),read(Word), write('Input was '),write(Word),nl, (Word=end;loop).
• 当输入逗号,就强制Prolog系统回溯以寻找 更多的匹配
四、 操作符
• 1、通过op谓词,可以将用户自定义的谓词 转成某种操作符,例如: • likes(dennis,catty). • 我们更希望表达成: • dennis likes catty. • 这在默认情况是不行的,通过op谓词转化 likes谓词成中缀操作符: • op(150,xfy,likes).
Prolog编程简介
主要内容
• • • • • • • • • 一、入门 二、 语句和谓词 三、Prolog 执行 四、 操作符 五、循环 六、改变Prolog数据库 七、列表处理 八、字符串处理 九、高级特性
一、入门
1、简单例子
• write('Hello World'),nl,write('Welcom!'),nl. • • • • 以句号结束 有4个目标(goal)组成,按顺序执行 目标之间用逗号隔开 write和nl是内建谓词BIP
二、 语句和谓词
• 一个Prolog程序就是由一系列语句(clause) 组成的,语句可以多行,以引文句号结束。 两种基础语句:事实和规则。 • 事实语句,是由atom或者组合term构成: • chrismas. • likes(john,mary).
• 规则,形式如下: head:-t1,t2,…,tk. (k>=1) 头部,颈部, body • head是目标,body是它的子目标,规则就 是为了达到目标head,必须先达到子目标 t1,t2…tk
• • • • • • •
算术比较操作符: =:=, =\=, >, >=, <, =<
• 3、等值操作符: • E1=:=E2 成功当且仅当两个表达式求值的结果一致。 • E1=\=E2 成功当且仅当两个表达式求值的结果不一 致。
• Term1==Term2成功当且仅当Trem1跟Term2完全相同。
• fail谓词,fail谓词求值总是fail,因此强迫回溯 开始,例如下面的例子: • dog(fido). • dog(fred). • dog(jonathan). • all_dogs:• dog(X),write(X),write(' is a dog'),nl,fail. • all_dogs.
• ?-retract(dog(X)). • 却是删除dog(jim).因为这是第一条与(dog(X) 匹配的语句,而最后的dog(X).反而得到保留。
• retractall(mypred(_,_,_)).删除所有的 mypred/3谓词语句。 • retractall(parent(john,Y)).删除所有的第一个 参数的john的parent/2语句。 • retractall(mypred).删除所有的mypred/0谓词。
删除语句
• 删除语句,也有两个谓词:retract/1和 retractall/1, • 区别:参数是一条语句;后者仅接受语句的 head部分,用于删除所有的满足该head的语句。 • • • • 例如,假设数据库中有如下语句: dog(jim). dog(fido). dog(X).
• ?-retract(dog(fido)). • 删除数据库中的第2条语句
匿名变量
• 哑元,下划线_表示,表示你并不关心这个 变量的值是什么,仅仅为了占位,用以表 示任意值。
三、Prolog 执行
• Prolog按照顺序执行,每个目标都是由call term 组成,每个目标都与一个相应的谓词相关联。 • Prolog系统是依次在语句的head部分来匹配目 标,如果匹配,将输出yes,否则就是no。 • 对于指定目标,Prolog没有找到任何事实或者 规则与之匹配的话,那么就是fail。 • 这就是所谓的封闭世界假设:任何结论如果无 法从数据库中的事实和规则中得到证明,那么 这个结论就是否定的。
逻辑操作符
• • • • 逻辑操作符:取反操作符not,表示or的; 例如: X=0,not X is 0. 返回no 6<3;7 is 2+5.返回yes
五、循环
• 一定次数的循环:
• loop(0). • loop(N):-N>0,write('The value is: '),write(N),nl,M is N-1,loop(M).
• 增加语句,通过谓词assertz/1和asserta/1, 两者的区别在于:前者将语句加入相应谓 词的后面,而后者将语句加入相应谓词的 开始处。例如: • ?-assertz(dog(fido)). • ?-assertz((go:-write('hello world'),nl)). • ?-assertz(dog(X)). • ?-assertz((go(X):-write('hello '),write(X),nl)).
• • • • animal:-dog(X). 这句就是规则(rule) 中间的:-符号可以理解为“如果” X是变量 该规则就是:如果X是狗,那么X就是动物。
• | ?- animal(fido). • Yes
• 根据规则,felix不是动物(虽然它是): • | ?- animal(felix). • no
• 谓词的递归定义,分为直接和间接递归, 例子: likes(john,X):-likes(X,Y),dog(Y). john喜欢喜欢狗的人。
loading语句
• loading语句,包括两个BIPs:consult/1和 reconsult/1,用于产生将文件中的语句导入 数据库 • reconsult会覆盖之前定义的相同谓词,而 consult不会。 • consult*‘prog1.pl’+可以简化为*‘prog1.pl’+. • reconslt*‘prog1.pl’+可以简写为[-‘prog1.pl’+
• cut谓词:用于中止回溯,也可用!号表示。例 如下面的例子: data(one). data(two). data(three). test(X) :- data(X). % test(X) :- data(X), !. test('last clause').
?- test(X), write(X), nl, fail.
2、程序文件
• • • • 写入下列代码并保存为prog1.pl: dog(fido). cat(felix). animal:-dog(X).
• 通过coห้องสมุดไป่ตู้sult谓词,将其导入, 分析下代码: • dog(fido). • cat(felix).
3、事实和规则
• 就是所谓事实,dog和cat就是谓词,而fido 和felix是atom,这里陈述了:fido是一只狗, felix是一只猫。