机器智能实验二:prolog编程实现一阶逻辑推理

一.实验目的

  1. 学会使用Prolog语言;
  2. 用Prolog语言巩固一阶逻辑知识;
  3. 能够使用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.

发布了63 篇原创文章 · 获赞 15 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/LieberVater/article/details/89762982