规则

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

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

其语法结构如下:

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. 承接Unity3D外包公司 — 技术分享

    Cardboard SDK for Unity的使用 上一篇文章作为系列的开篇,主要是讲了一些虚拟现实的技术和原理,本篇就会带领大家去看一看谷歌的Cardboard SDK for Unity,虽然目 ...

  2. Shiro简单配置

    注:这里只介绍Spring配置模式. 因为官方例子虽然中有更加简洁的ini配置形式,但是使用ini配置无法与spring整合.而且两种配置方法一样,只是格式不一样. 涉及的jar包 核心包shiro- ...

  3. Mysql的row_format

    在mysql中, 若一张表里面不存在varchar.text以及其变形.blob以及其变形的字段的话,那么张这个表其实也叫静态表,即该表的row_format是fixed,就是说每条记录所占用的字节一 ...

  4. some code of c

    // // main.c // LineList // // Created by Rubert on 16/9/11. // Copyright © 2016年 Study. All rights ...

  5. VS2010 无法计算HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSBuild\ToolsVersions\14.0@VCTargetPath处的属性表达式

    VS2010打开.csproj工程文件报错,不能加载,错误信息如下: 无法计算HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSBuild\ToolsVersions\1 ...

  6. Android Studio 高级配置

    http://liukun.engineer/2016/04/10/Android-Studio-advanced-configuration/

  7. Stanford NLP学习笔记:7. 情感分析(Sentiment)

    1. 什么是情感分析(别名:观点提取,主题分析,情感挖掘...) 应用: 1)正面VS负面的影评(影片分类问题) 2)产品/品牌评价: Google产品搜索 3)twitter情感预测股票市场行情/消 ...

  8. peer not authenticated error

    问题背景 系统:OS X El Capitan,10.11.2 IDE:Android Studio 2.0 Preview Java:1.8.0_65 Gradle:2.3 clone了代码后,在i ...

  9. ASP.NET程序中 抛出"Thread was being aborted. "异常(转)

    Thread was being aborted :中文意思 线程被终止 引用地址:http://support.microsoft.com/default.aspx/kb/312629/EN-US/ ...

  10. Objective-C之run loop详解[转]

    做了一年多的IOS开发,对IOS和Objective-C深层次的了解还十分有限,大多还停留在会用API的级别,这是件挺可悲的事情.想学好一门语言还是需要深层次的了解它,这样才能在使用的时候得心应手,出 ...