prolog 规则
规则
规则由几个互相依赖的简单句(谓词)组成。用来描述事实之间的依赖关系,如:因果关系,蕴含关系,对应关系
规则的实质就是存储起来得查询
其语法结构如下:
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 规则的更多相关文章
- prolog 阶段总结
http://blog.csdn.net/mwsong/article/details/1766382 到现在为止,我们已经对Prolog有了一个基本的了解,现在有必要对我们所学过的知识做一个系统 ...
- 一、prolog简介
一般来说,人工智能语言应具备如下特点: 1.具有符号处理能力(即非数值处理能力): 2.适合于结构化程序设计,编程容易: 3. 具有递归功能和回溯功能: 4. 具有人机交互能力: 5. 适合于推理: ...
- 七周七语言——Prolog(二)
1 递归 首先来看一个知识库: father(zeb,john_boy_sr). father(john_boy_sr,john_boy_jr). ancestor(X,Y):-father(X,Y ...
- Visual Prolog 的 Web 专家系统 (8)
GENI核心 -- 推理引擎(2)流量控制 1.阐述fail."!"而回溯 与其他语言相比,,Prolog最大的特点.这是回溯机制. 回溯机制,还有的主要手段2个月,首先,通过使用 ...
- Visual Prolog 的 Web 专家系统 (7)
GENI核心 -- 推理引擎(1)知识表示 GOAL最后一句是谓语infer(),它的含义是"论证". 因此,,进GENI核心,执行视图推理引擎. infer() infer(): ...
- Prolog学习:基本概念 and Asp.net与Dojo交互:仪器仪表实现
Asp.net与Dojo交互:仪器仪表实现 项目中需要用到仪器仪表的界面来显示实时的采集信息值,于是便遍地寻找,参考了fusionchart和anychart之后,发现都是收费的,破解的又没有这些功能 ...
- The Art of Prolog:Advanced Programming Techniques【译文】
申明:此文为译文,仅供学习交流试用,请勿用作商业用途,造成一切后果本人概不负责,转载请说明.本人英语功力尚浅,翻译大多借助于翻译工具,如有失误,欢迎指正. 逻辑程序简介 逻辑程序是一组公理或规则,定义 ...
- Prolog学习:数独和八皇后问题
上一篇简单介绍了下Prolog的一些基本概念,今天我们来利用这些基本概念解决两个问题:数独和八皇后问题. 数独 数独是一个很经典的游戏: 玩家需要根据n×n盘面上的已知数字,推理出所有剩余空格的数字, ...
- Prolog学习:基本概念
上一篇对Prolog有了一个感性的认识,今天介绍下Prolog中一些基本概念,想要用Prolog解决一些实际问题之前必须要先了解它们.这些概念在<七周七语言>这本书中都有介绍,我简单提炼汇 ...
随机推荐
- C语言中,定义的含义?声明的含义?它们之间的区别是什么?
在C语言中,对于定义和声明,也许我们非常的熟悉,但不一定真正的了解! 定义的含义:所谓定义,就是创建(编译器)一个对象,为这个对象分配一块内存空间并取名,也就是我们平常所说的变量名或对象名,一旦这个名 ...
- NSOperationQueue与GCD的使用原则和场景
首先,我们要明确NSOperationQueue与GCD之间的关系: NSOpertaionQueue用GCD构建封装的,是GCD的高级抽象. 其次,我们要区别两者的不同: GCD仅仅支持FIFO队列 ...
- Unity UI on the HoloLens
Following the steps under "Required configuration" will allow Unity UI to continue to work ...
- yii-basic-app-2.0.5/basic/config/web.php
<?php $params = require(__DIR__ . '/params.php'); $config = [ 'id' => 'basic', 'basePath' => ...
- java web工程 数据库操作报驱动类找不到的错误
这几天在进行数据库的操作,写好数据库操作类后,用测试类测试成功通过,但是部署到tomcat后,从页面访问就会报异常. 最后终于发现是tomcat使用了连接池的数据连接方式. 解决方法是把jdbc ja ...
- spring+ibatis整合
一.pom.xml: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://ww ...
- OpenLayers 3 基础知识(一)
OpenLayers 是一个专为Web GIS 客户端开发提供的JavaScript 类库包,用于实现标准格式发布的地图数据访问. 要在你的网页中使用OpenLayers(现用版本:v3.19,1), ...
- mysql通过sql文件导入数据时出现乱码的解决办法
首先在新建数据库时一定要注意生成原数据库相同的编码形式,如果已经生成可以用phpmyadmin等工具再整理一次,防止数据库编码和表的编码不统一造成乱码. 方法一: 通过增加参数 –default-ch ...
- Unix 用gdb分析core dump文件
产生core文件条件 用ulimit -c 指定core文件大小来开启core文件的生成,如:ulimit -c unlimited 用gdb分析core文件的条件 可执行程序在编译时,需加入-g参数 ...
- log level
ALL < DEBUG < INFO < WARN < ERROR < FATAL < OFF