实验二:使用Prolog的一阶逻辑推理实验
班级;智能1401
姓名:蒙寿伟
学号:201408070120
一.实验目的
1.学会使用Prolog语言;
2.用Prolog语言巩固一阶逻辑知识;
3.能够使用prolog语言实现一阶逻辑的证明;
二、实验的硬件、软件平台
硬件:计算机
软件:操作系统:WINDOWS 10
应用软件:Prolog
三、实验内容及步骤
熟悉prolog语言的使用并实现对于一阶逻辑推理的证明
实验步骤:
1:对于a,b,c,d四种输入情况,验证|?- p(a).的真假;
a.p(b). p(a) :- p(b). p(a) :- p(c)
推理分析:
事实:p(b)为真.
推理:由p(b)为真可以推出p(a)为真,由p(c)为真可以推出p(a)为真. 结论:p(a)为真.
运行结果:
b. p(c). p(a) :- p(b). p(a) :- p(c).
推理分析:
事实:p(c)为真.
推理:由p(b)为真可以推出p(a)为真,由p(c)为真可以推出p(a)为真. 结论:p(a)为真.
运行结果:
c. p(b). p(a) :- p(b) ,p(c).
推理分析:
事实:p(b)为真.
推理:由p(b)为真且p(c)为真可以推出p(a)为真.
结论:p(a)为假.因为p(b)未知.
d. p(c). p(a):- p(b) ; p(c).
推理分析:
事实:p(b)为真.
推理:由p(b)为真或p(c)为真可以推出p(a)为真.
结论:p(a)为真.
2.验证
?-friend(john,Y).
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).
推理分析:
1.如果X喜欢音乐,而且喜欢阅读,那么X是john的朋友。
2.如果X喜欢音乐,而且喜欢运动,那么X是john的朋友。
相关事实:mary喜欢音乐也喜欢运动。
结论:mary是john的朋友。
运行结果:
3.验证
likes(bill,X)
likes(ellen,tennis).
likes(john,football).
likes(tom,baseball).
likes(eric,swimming).
likes(mark,tennis).
likes(bill,X) if likes(tom,X).
推理分析:
如果tom喜欢X,则bill喜欢X。
相关事实:tom喜欢baseball
结论:bill喜欢baseball
运行结果:
4.构建与,或,非,异或表达,并验证。
代码:
and(X,Y) :- X,Y.
or(X,Y) :- X;Y.
no(X) :- not(X).
xor(X,Y) :- X\==Y.
推理分析: 推理:X,Y都为真时and(X,Y)为真。
X,Y有一个为真时or(X,Y)为真。
X为真时no(X)为真。
X不等于Y时,异或xor(X,Y)
为真。
运行结果:
5.已知兄弟sib(X, Y)的定义如下
sib(X, Y):- p(Z, X), p(Z, Y), X \== Y.
5.1:定义堂兄弟co(X, Y);
5.2; 定义二代堂兄弟sco(X, Y),X,Y的父母是堂兄弟。
并做验证。
代码:
p(ye,ba).
p(ye,bo).
p(ba,wo).
p(bo,tg).
p(wo,tom).
p(tg,jerry).
sib(X,Y) :- p(Z,X),p(Z,Y), X\==Y.
co(X,Y) :- sib(A,B),p(A,X),p(B,Y),A\==B,X\==Y.
sco(X,Y) :- co(A,B),p(A,X),p(B,Y),A\==B,X\==Y.
推理分析:
当X不等于Y,Y且Z是和Y的父亲,则X和Y是兄弟。
当A不等于B,X不等于Y,A和B是兄弟,且A是X的父亲,B是Y的父亲,则X和Y是堂兄弟。
当A不等于B,X不等于Y,A和B是堂兄弟,且A是X的父亲,B是Y的父亲,则X和Y是二代堂兄弟。
相关事实:
ye是ba和bo的父亲,ba是wo的父亲,bo是tg的父亲,wo是tom的父亲,tg 是jerry的父亲。
结论:
Wo和tg是堂兄弟,tom和jerry是二代堂兄弟。
运行结果:
6.自动实现搜索算法-回溯,判断JOHN是谁的朋友
TOM喜欢TALK,BILL喜欢游泳,BILL喜欢谈话;若X既喜欢TALK,有喜欢SWIM,则JOHN是X的朋友。
代码:
likes(tom,talk).
likes(bill,swim).
likes(bill,talk).
friend(X,Y) :- likes(X,talk),likes(X,swim).
推理分析:
当X喜欢talk,且喜欢swimming,则X是Y的朋友。
相关事实:bill喜欢talk,且喜欢swimming。
结论:bill是JOHN的朋友。
运行结果:
7.谁是盗窃犯问题:某人被盗,公安局派出所派出5个侦察员去调查。
研究案情时:
侦察员A说:“赵与钱中至少有一人作案”;
侦察员B说:“钱与孙中至少有一人作案”;
侦察员C说:“孙与李中至少有一人作案”;
侦察员D说:“赵与孙中至少有一人与此案无关”;
侦察员E说:“钱与李中至少有一人与此案无关”。
如果这5个侦察员的话都是可信的,试编程求出谁是盗窃犯,并给出Prolog.程序。
代码:
spyA(X,Y):-(X=true);(Y=true).
spyB(X,Y):-(X=true);(Y=true).
spyC(X,Y):-(X=true);(Y=ture).
spyD(X,Y):-(X=false);(Y=false).
spyE(X,Y):-(X=false);(Y=false).
find([Zhao,Qian,Sun,Li]):-spyA(Zhao,Qian),spyB(Qian,Sun),spyC(Sun,Li) ,spyD(Zhao,Sun),spyE(Qian,Li).
推理分析:
定义谓词:Crime(x)表示x作案。
则已知事实:
(1) Crime(Zhao) ∨ Crime(Qian)
(2) Crime(Sun) ∨ Crime(Qian)
(3) Crime(Sun) ∨ Crime(Li)
(4) Crime(Zhao) ∨ Crime(Sun)
(5) Crime(Qian) ∨ Crime(Li)
推理:
Find(Zhao) V Crime(Qian)
Find(Zhao) V Crime(Sun)
Find(Zhao) V Crime(Li)
归结结果,Zhao不是罪犯,按照同样的方法得:
Qian 是罪犯,Sun 也是罪犯。
结果:
钱和孙作案。
四、思考题
1.在题目2中PROLOG搜索过程是怎样的,试用树的结构表示,并计算其推理步数。
先搜索是否有喜欢reading 的,发现没有,然后搜索是否有喜欢sports 的,发现bell 和mary 喜欢sports ,继续搜索bell 是否喜欢music ,发现不喜欢,继续搜索mary 是否喜欢music ,发现喜欢,即mary 满足是john 朋友的条件,由此判断mary 是john 的朋友。
故推理步数为4步。
2.PROLOG 语言和其它语言(如C 语言)做逻辑推理,你更喜欢哪一个,简要说说差别。
Prolog 是陈述性语言,一旦给它提交必要的事实和规则之后,Prolog 就使用内部的演绎推理机制自动求解程序给定的目标,而不需要像C 语言那样要在程序中列出详细的求解步骤。
Prolog 给人的感觉就是你提出问题,让机器自己去想怎么实现,而C 语言则是你要去想怎么实现。
如果从解决逻辑推理来说,我更喜欢Prolog 语言。
reading music
sports
mary
bell
Mary 是 john 的朋友
1
2
3
4。