PROLOG基础
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
逻辑操作符
• • • • 逻辑操作符:取反操作符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).
删除语句
• 删除语句,也有两个谓词:retract/1和 retractall/1, • 区别:参数是一条语句;后者仅接受语句的 head部分,用于删除所有的满足该head的语句。 • • • • 例如,假设数据库中有如下语句: dog(jim). dog(fido). dog(X).
• ?-retract(dog(fido)). • 删除数据库中的第2条语句
• 当输入逗号,就强制Prolog系统回溯以寻找 更多的匹配
四、 操作符
• 1、通过op谓词,可以将用户自定义的谓词 转成某种操作符,例如: • likes(dennis,catty). • 我们更希望表达成: • dennis likes catty. • 这在默认情况是不行的,通过op谓词转化 likes谓词成中缀操作符: • op(150,xfy,likes).
• fail谓词,fail谓词求值总是fail,因此强迫回溯 开始,例如下面的例子: • dog(fido). • dog(fred). • dog(jonathan). • all_dogs:• dog(X),write(X),write(' is a dog'),nl,fail. • all_dogs.
变量
• 变量,一开始所有的变量都是未绑定的, 当目标被执行时,变量可能被绑定或者解 绑定。
• 变量存在作用域,不同语句中的同名变量 没有任何关系。
量词
• 1)全称量词,出现在事实或者规则head部分的变 量,表示事实或者规则的该变量的所有可能值,这 样的变量成为全称量词,如 • large_animal(X):-animal(X),large(X). 中的X。
• 增加语句,通过谓词assertz/1和asserta/1, 两者的区别在于:前者将语句加入相应谓 词的后面,而后者将语句加入相应谓词的 开始处。例如: • ?-assertz(dog(fido)). • ?-assertz((go:-write('hello world'),nl)). • ?-assertz(dog(X)). • ?-assertz((go(X):-write('hello '),write(X),nl)).
六、改变Prolog数据库
• 加入和删除语句 • Prolog提供了BIPs用于删除或者增加数据库中 的语句。 • 如果一个谓词可以被assertz, retract等BIPs修改, 那么它必须声明是动态的,否则Prolog将报错。 动态声明必须放在谓词声明的前面,最好放在 整个程序的前面,声明方式如下: • dynamic(mypred/3). • 这就将mypred/3谓词声明为动态,可用BIPs进 行增删了。
Prolog编程简介
主要内容
• • • • • • • • • 一、入门 二、 语句和谓词 三、Prolog 执行 四、 操作符 五、循环 六、改变Prolog数据库 七、列表处理 八、字符串处理 九、高级特性
一、入门
1、简单例子
• write('Hello World'),nl,write('Welcom!'),nl. • • • • 以句号结束 有4个目标(goal)组成,按顺序执行 目标之间用逗号隔开 write和nl是内建谓词BIP
• • • • • • •
算术比较操作符: =:=, =\=, >, >=, <, =<
• 3、等值操作符: • E1=:=E2 成功当且仅当两个表达式求值的结果一致。 • E1=\=E2 成功当且仅当两个表达式求值的结果不一 致。
• Term1==Term2成功当且仅当Trem1跟Term2完全相同。
匿名变量
• 哑元,下划线_表示,表示你并不关心这个 变量的值是什么,仅仅为了占位,用以表 示任意值。
三、Prolog 执行
• Prolog按照顺序执行,每个目标都是由call term 组成,每个目标都与一个相应的谓词相关联。 • Prolog系统是依次在语句的head部分来匹配目 标,如果匹配,将输出yes,否则就是no。 • 对于指定目标,Prolog没有找到任何事实或者 规则与之匹配的话,那么就是fail。 • 这就是所谓的封闭世界假设:任何结论如果无 法从数据库中的事实和规则中得到证明,那么 这个结论就是否定的。
• 2、算术运算:通过内建的is/2谓词来进行 算术运算,is/2是一个内建的中缀运算符, 例如: • X is 2. • X is 3,Y is X+3.
• + - * /称为算术运算符,还有一类称为算术函 数,它们并不是谓词,例如abs/1 sqrt/1等,完 整列表: • +-*/ • X//Y 两个整数的商 • X^Y 表示X的Y次方,在gnu prolog上是** • -X 一元操作符 • abs(X) • sqrt(X) • sin(X) • cos(X) • max(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。
• • • • 1 )数字,623,+3,-.245。 2 )atom,非数值常量 3)变量:以大写字母或者下划线开头. 4)term,以atom开头,后接参数列表,例如: read(X) dog(henry) likes(dog(henry),Y)等 • 5)列表,如: [dog,cat,mypred,[a,b,c],hello] • 6) 其他类型。
2、程序文件
• • • • 写入下列代码并保存为prog1.pl: dog(fido). cat(felix). animal:-dog(X).
• 通过consult谓词,将其导入, 分析下代码: • dog(fido). • cat(felix).
3、事实和规则
• 就是所谓事实,dog和cat就是谓词,而fido 和felix是atom,这里陈述了:fido是一只狗, felix是一只猫。
• 谓词的递归定义,分为直接和间接递归, 例子: 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), writeBaidu NhomakorabeaX), nl, fail.
4、Prolog的注释
• /* this is a comment */
• %
5、查询
• dog(X),查询所有满足谓词dog的X,也就是 找出所有的狗狗。 • dog(X),cat(X).查询是狗又是猫的“东西”。 • listing(dog),列出所有定义了谓词dog的语 句。
6、数据类型
• • • • animal:-dog(X). 这句就是规则(rule) 中间的:-符号可以理解为“如果” X是变量 该规则就是:如果X是狗,那么X就是动物。
• | ?- animal(fido). • Yes
• 根据规则,felix不是动物(虽然它是): • | ?- animal(felix). • no
• 2)存在量词,head中没有,在body中出现的量词, 仅仅为了表示该变量至少存在一个值,这样的变量 称为存在量词。例如: • person(dennis,zane,male,25,programmer). • man(A):-person(A,B,male,C,D). • man谓词body部分的B,C,D变量就是存在量词
• 因此: • likes(X,prolog)==likes(X,prolog)相同 • likes(X,prolog)==likes(Y,prolog)失败,X与Y是不同的变 量 • 3+7==6+4 失败,两个表达式不会被求值,显然不同
• 6+X=6+3。成功,X绑定为3 • 6+4=3+7 仍然失败 • X=0,X=:=0. 成功,将X绑定为0,比较成功。
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).
二、 语句和谓词
• 一个Prolog程序就是由一系列语句(clause) 组成的,语句可以多行,以引文句号结束。 两种基础语句:事实和规则。 • 事实语句,是由atom或者组合term构成: • chrismas. • likes(john,mary).
• 规则,形式如下: head:-t1,t2,…,tk. (k>=1) 头部,颈部, body • head是目标,body是它的子目标,规则就 是为了达到目标head,必须先达到子目标 t1,t2…tk
联合
• Prolog的匹配——联合(unification)
变量可以跟任何term联合,其中包括了变量: X=1将X与1联合. dog(X)与dog(ferris),将X与ferris联合。 pred(X,X,man)与pred(landon,dog,A) 如何?
目标的求值
回溯
• 回溯(backtracking),回溯就是一个返回前一 个满足的目标,寻找其他方式重新满足该 目标的过程。
• 循环直到条件满足: 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).
• ?-retract(dog(X)). • 却是删除dog(jim).因为这是第一条与(dog(X) 匹配的语句,而最后的dog(X).反而得到保留。
• retractall(mypred(_,_,_)).删除所有的 mypred/3谓词语句。 • retractall(parent(john,Y)).删除所有的第一个 参数的john的parent/2语句。 • retractall(mypred).删除所有的mypred/0谓词。