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解决一些实际问题之前必须要先了解它们.这些概念在<七周七语言>这本书中都有介绍,我简单提炼汇 ...
随机推荐
- PetShop安装失败
报错提示: Security This installer has encountered an unexpected error installing this package. This may ...
- 对话框AlertDialog.Builder使用方法
我们在平时做开发的时候,免不了会用到各种各样的对话框,相信有过其他平台开发经验的朋友都会知道,大部分的平台都只提供了几个最简单的实现,如果我们想实现自己特定需求的对话框,大家可能首先会想到,通过继承等 ...
- Mongo集合操作Aggregate
最近一直在用mongodb,有时候会需要用到统计,在网上查了一些资料,最适合用的就是用aggregate,以下介绍一下自己运用的心得.. 别人写过的我就不过多描述了,大家一搜能搜索到N多一样的,我写一 ...
- 使用百度地图API产生指定范围的随机点
直接上代码: <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> ...
- oracle11g dataguard 完全手册
一.前言: 网络上关于dataguard的配置文章很多,但是很多打着oracle11g的文章实际都是只能在9 10 上运行,比如FAL_CLIENT在11g中已经废弃,但是现在网络上的文章都是没有标注 ...
- ubuntu14.04计划任务无法执行
在/etc/crontab中添加了任务1,并确认执行时间设置没有错.发现任务没有执行,而/var/log/cron.log日志文件中没有该计划任务的执行信息.另一个计划任务却能正确,通过修改任务1的执 ...
- 搞定迅雷固件在TP-LINK WR720N,127.0.0.1 9000 获取不到激活码
本帖最后由 exzzzipad 于 2014-7-2 22:33 编辑 基本情况:设备:TP-LINK WR720N目前固件:[antclan][20120825]720N-4M-NAS-withSA ...
- mac上启动和停止mysql
因调试需要,在mac上安装了mysql,安装方法网上大把,此处不赘述.启动和停止命令每次要手工敲,因此写个小脚本方便自己: startmysql.sh(/Applications/Develop/my ...
- TCP\IP三次握手连接,四次握手断开分析
TCP(Transmission Control Protocol) 传输控制协议 TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接: 位码即tcp标志位,有6种标 ...
- java路径问题
使用了java这么久一直对java获取路径存在困惑,将一些常用的获取路径方式记录如下: val property = System.getProperty("user.dir")) ...