规则

规则由几个互相依赖的简单句(谓词)组成。用来描述事实之间的依赖关系,如:因果关系,蕴含关系,对应关系

规则的实质就是存储起来得查询

其语法结构如下:

head:-body

head 为谓词的定义部分,和事实一样,也包括谓词名和参数说明

:-   连接符 表示 蕴含

body  一个或多个目标,用“,”连接,表示 且

如上一章中的混合查询按规则保存下来即为:

where_food(X,Y):-location(X,Y),edible(X).

房间Y中,有可食事物的条件是:X位于Y 中,且X具有 edible属性

继续用上一章举例子,在文件的最后追加一个规则

where_food(X,Y):-location(X,Y),edible(X).

文件内容如下:

room(kitchen).
room(office).
room(hall).
room('dining room').
room(cellar).
location(nani,'washing mechine').
location(desk,office).
location(apple,kitchen).
location(broccoli,kitchen).
location(crackers,kitchen).
location(flashlight,desk).
location('washing mechine',cellar).
location(computer,office).
door(office,hall).
door(kitchen,office).
door(hall,'dining room').
door(kitchen,cellar).
door('dining room',kitchen).
edible(apple).
edible(crackers).
tastes_yucky(broccoli).
turned_off(flashlight).
here(kitchen). where_food(X,Y):-location(X,Y),edible(X).

我们可以做如下动作:

1、查找所有有可食食品的房间,和可食食品。

?- where_food(X,Y).
X = apple,
Y = kitchen ;
X = crackers,
Y = kitchen ;
false.

2、验证某个房间中是否存在某食物

?- where_food(apple,kitchen).
true .

3、查找某个房间中所有的可食用食物

?- where_food(X,kitchen).
X = apple ;
X = crackers.

4、查找可食用食物的所在的房间

?- where_food(apple,R).
R = kitchen.

综上所述,其实就是根据已经输入的事实,求解该规则的一个或两个变量的值。

规则的工作原理

首先prolog把目标和规则的子句的头部进行匹配,如果成功,那么prolog就把该规则的body部分作为新的目标进行匹配。

所以上面的 wherer_food 的debug信息如下:

?- where_food(X,kitchen).
T Call: () where_food(_G2943, kitchen)
T Call: () location(_G2943, kitchen)
T Exit: () location(apple, kitchen)
T Call: () edible(apple)
T Exit: () edible(apple)
T Exit: () where_food(apple, kitchen)
X = apple ;
T Redo: () location(_G2943, kitchen)
T Exit: () location(broccoli, kitchen)
T Call: () edible(broccoli)
T Fail: () edible(broccoli)
T Redo: () location(_G2943, kitchen)
T Exit: () location(crackers, kitchen)
T Call: () edible(crackers)
T Exit: () edible(crackers)
T Exit: () where_food(crackers, kitchen)
X = crackers.

对于 寻找Nani这个游戏,我们可以增添如下的规则:

/*定义两个房间相连*/
connect(X,Y):-door(X,Y).
connect(X,Y):-door(Y,X). /*列出该房间的所有物品*/
list_things(Place):-location(X,Place),tab(),write(X),nl,fail. /*列出所有和该房间相邻的房间*/
list_connect(Place):-connect(Place,X),tab(),write(X),nl,fail.

做一个测试:

?- list_things(kitchen).
apple
broccoli
crackers
false. ?- list_connect(kitchen).
office
cellar
dining room
false.

如图所示,list_things展示了该房间内的所有东西,list_connect显示了所有的和该房间相邻的所有房间。

但是这两个规则都有一个问题,都是 fail 结尾,如果我们把他们联用的时候,会由于fail,导致回溯。从而出现问题。

?- list_things(kitchen),list_connect(kitchen).
apple
broccoli
crackers
false.
list_connect(kitchen) 没有运行

所以我们要解决这个问题。

故我们在应该在添加两条事实,从而实现list_things和list_connect 都返回true。

list_things(_).
list_connect(_).
"_" 为空变量,表示我们不关心或者是暂时无法求值的变量。 这里取 我们不关心的意思。
?- list_things(kitchen),list_connect(kitchen).
apple
broccoli
crackers
office
cellar
dining room
true.

现在我们可以编写一条规则,查看小女孩所在的房间,并列出房间内所有的物品以及和该房间相邻的房间。

look:-here(Place),write('You are in the '),write(Place),nl,write('You can see '),list_things(Place),write('You can go to '),nl,list_connect(Place).

所以到目前位置,整个 test.pl 文件如下

room(kitchen).
room(office).
room(hall).
room('dining room').
room(cellar).
location(nani,'washing mechine').
location(desk,office).
location(apple,kitchen).
location(broccoli,kitchen).
location(crackers,kitchen).
location(flashlight,desk).
location('washing mechine',cellar).
location(computer,office).
door(office,hall).
door(kitchen,office).
door(hall,'dining room').
door(kitchen,cellar).
door('dining room',kitchen).
edible(apple).
edible(crackers).
tastes_yucky(broccoli).
turned_off(flashlight).
here(kitchen). where_food(X,Y):-location(X,Y),edible(X). connect(X,Y):-door(X,Y).
connect(X,Y):-door(Y,X). list_things(Place):-location(X,Place),tab(),write(X),nl,fail.
list_things(_).
list_connect(Place):-connect(Place,X),tab(),write(X),nl,fail.
list_connect(_). look:-here(Place),write('You are in the '),write(Place),nl,write('You can see '),list_things(Place),write('You can go to '),nl,list_connect(Place).

运行如下

?- look.
You are in the kitchen
You can see apple
broccoli
crackers
You can go to
office
cellar
dining room
true.

prolog 规则的更多相关文章

  1. prolog 阶段总结

    http://blog.csdn.net/mwsong/article/details/1766382   到现在为止,我们已经对Prolog有了一个基本的了解,现在有必要对我们所学过的知识做一个系统 ...

  2. 一、prolog简介

    一般来说,人工智能语言应具备如下特点: 1.具有符号处理能力(即非数值处理能力): 2.适合于结构化程序设计,编程容易: 3. 具有递归功能和回溯功能: 4. 具有人机交互能力: 5. 适合于推理: ...

  3. 七周七语言——Prolog(二)

    1  递归 首先来看一个知识库: father(zeb,john_boy_sr). father(john_boy_sr,john_boy_jr). ancestor(X,Y):-father(X,Y ...

  4. Visual Prolog 的 Web 专家系统 (8)

    GENI核心 -- 推理引擎(2)流量控制 1.阐述fail."!"而回溯 与其他语言相比,,Prolog最大的特点.这是回溯机制. 回溯机制,还有的主要手段2个月,首先,通过使用 ...

  5. Visual Prolog 的 Web 专家系统 (7)

    GENI核心 -- 推理引擎(1)知识表示 GOAL最后一句是谓语infer(),它的含义是"论证". 因此,,进GENI核心,执行视图推理引擎. infer() infer(): ...

  6. Prolog学习:基本概念 and Asp.net与Dojo交互:仪器仪表实现

    Asp.net与Dojo交互:仪器仪表实现 项目中需要用到仪器仪表的界面来显示实时的采集信息值,于是便遍地寻找,参考了fusionchart和anychart之后,发现都是收费的,破解的又没有这些功能 ...

  7. The Art of Prolog:Advanced Programming Techniques【译文】

    申明:此文为译文,仅供学习交流试用,请勿用作商业用途,造成一切后果本人概不负责,转载请说明.本人英语功力尚浅,翻译大多借助于翻译工具,如有失误,欢迎指正. 逻辑程序简介 逻辑程序是一组公理或规则,定义 ...

  8. Prolog学习:数独和八皇后问题

    上一篇简单介绍了下Prolog的一些基本概念,今天我们来利用这些基本概念解决两个问题:数独和八皇后问题. 数独 数独是一个很经典的游戏: 玩家需要根据n×n盘面上的已知数字,推理出所有剩余空格的数字, ...

  9. Prolog学习:基本概念

    上一篇对Prolog有了一个感性的认识,今天介绍下Prolog中一些基本概念,想要用Prolog解决一些实际问题之前必须要先了解它们.这些概念在<七周七语言>这本书中都有介绍,我简单提炼汇 ...

随机推荐

  1. C# dataTable 排序

    DataView dv = ds.DefaultView; dv.Sort = "header asc"; ds = dv.ToTable(); C# dataTable 排序

  2. 08void

    void void修饰函数返回值和参数 如果函数没有返回值,那么应给将其声明为void 如果函数没有参数,应该声明其参数为void 不存在void类型的变量 void指针的意义 C语言规定只有相同类型 ...

  3. Java基础语法目录

    一.Java相关科普知识1.Java的发展历程2.Java的发展方向3.Java的体系特性二.Java第一个程序1.JavaJDK的安装与环境的配置2.记事本开发Java程序的注意事项与常见问题3.J ...

  4. ie8用ajax访问不能每次都刷新的问题

    最近发现,用ajax访问后台,用ie8访问,第一次可以正常返回值,后面就一直不会执行后台,总是返回第一次访问的结果. 用ie9,ie10等都没问题,chrome,等浏览器也没有问题. 测试后发现,是i ...

  5. oracle免客户端安装 plsql连接

    开发的过程中,往往没有必要在自己的电脑上安装oracle,也实在太大了. 这里介绍一种使用plsql连接oracle的方法,类似于navicat之连接mysql. 先下载plsql,进行安装,这里提供 ...

  6. CentOS 6.5安装Oracle 11.2.0.4------CentOS 6.5安装

    规划: IP:192.168.213.199 mask: 255.255.255.0 gateway:192.168.213.1 DNS1:202.101.172.35 磁盘分区: 磁盘总大小:25G ...

  7. Latex感想

    看人家,一个小女生,被导师逼着,首先对电脑方面理解不多,3天时间,latex已经把Paper框架建立起来,我可以说我自愧不如吗?德鲁克<卓有成效的管理者>说的一次干一件事情,<冬吴相 ...

  8. sqlite读取中文乱码(C#)

    C#读取一些C++创建的sqlite数据库时乱码,  C++保存DB是用GB2312编码的, C#调用的官方的system.data.sqlite是用的UTF-8编码的, 在读取时会乱码, 用一个GB ...

  9. 关于ckeditor 第二次加载 出现问题

    在使用ckeditor 出现的问题也比较多的 ,一个问题是图片上传的问题 ,一个就是第二次加载的时候 ckeditor编辑框出现不了的问题 第一个问题 是修改ckeditor js属性 网上都有  第 ...

  10. jquery下常用正则表达式整理(可直接粘贴使用)

    与正则表达式做比较的方法 var _val = '1234'; var _ev = /^[a-z\d]+(\.[a-z\d]+)*@([\da-z](-[\da-z])?)+(\.{1,2}[a-z] ...