一.实验目的
- 学会使用Prolog语言;
- 用Prolog语言巩固一阶逻辑知识;
- 能够使用prolog语言实现一阶逻辑的证明;
二、实验的硬件、软件平台
硬件:计算机
软件:操作系统:WINDOWS
应用软件:Prolog
三、实验内容及步骤
熟悉prolog语言的使用并实现对于一阶逻辑推理的证明
实验步骤:
1.构建一个pl文件,首先建立一个记事本,写入实验内容之后保存为pl格式就可以了,第一个小实验分为四个部分
①p(b).
p(a):-p(b).
p(a):-p(c).
这里需要注意的是每一句后面都要有一个英文句号表示结束,文件中的内容都是陈述事实,比如文件中的表示p(b)为真,p(a):-p(b).表示如果右边为真,则左边为真
运行的时候右键pl文件,选择到swipl-win.exe,之后输入要查询的内容就可以了,比如我们这里要查询p(a)
②p(c).
p(a) :- p(b).
p(a) :- p(c).
③p(b).
p(a) :- p(b) ,p(c).
用逗号连接条件,连接的双方同时成立才能推出为真
④p(c).
p(a):- p(b) ; p(c).
分号是或的意思,满足其一就可以为真
2.根据下面的语句猜测结果,再验证
|?- p(X) = p(a).
|?- p(X, f(Y)) = p(a, Z).
|?- p(X, a, Y) = p(b, Y, Z).
|?- p(X, f(Y, a), Y) = p(f(a, b), V, Z).
|?- p(f(X, g(Y)), Y) = p(f(g(a), Z), b)
①实例化,X=a
②X=a,f(Y) = Z
③X = b,a = Y,Y = Z
④X = f(a,b),Y = Z,V = f(Z,a).
⑤Y = b,X = g(a),Z = g(b).
第二个等号两边翻过来了,不知道有没有影响,这里应该是表示相等的关系,所以顺序应该是可以接受的
第三个出了一点问题,a = Y,Y = Z,所以应该是a = Z
3.
为下列集合构造Prolog检测器
- 非负数;
- 奇数;
- {0,1,2,3,4,5,6,7,8}
这里用到了一些比较符和函数,首先如果我们判断一个数是非负数的话,就保证这个数大于等于0就可以,prolog可以使用>=这样的符号来进行判断
p(X) :-
X>=0.
奇数判断可以使用取余mod来实现,由于可能有正奇数和负奇数,所以对2取余之后大于零或者小于零就可以
test(X):-
X mod 2>0;X mod 2<0.
第三部分使用成员函数member,这里面有两个参数,第一个是待判断是否在其中的数,第二个是一个数组对象
test(X):- member(X,[0,1,2,3,4,5,6,7,8]).
4.
已知兄弟sib(X, Y)的定义如下
sib(X, Y):- p(Z, X), p(Z, Y), X \== Y.
4.1:定义堂兄弟co(X, Y);
4.2; 定义二代堂兄弟sco(X, Y),X,Y的父母是堂兄弟。
定义辈分结构如图:
按照图中定义,Johnson和Paul是堂兄弟关系,Thomas和James是第二级的堂兄弟关系
p(jack,john).
p(jack,jackson).
p(john,johnson).
p(jackson,paul).
p(johnson,thomas).
p(paul,james).
sib(X,Y):- p(Z,X),p(Z,Y),X\==Y.
co(X,Y):- sib(A,B),p(A,X),p(B,Y),X\==Y,A\==B.
sco(X,Y):- p(A,X),p(B,Y),co(A,B),A\==B,X\==Y.