prolog --寻找neni (2)
混合查询
我们可以把简单的查询连接起来,组成复杂的查询。
?- location(X,kitchen),edible(X).
简单查询只有一个目标,而混合查询可以把这些目标连接起来。从而进行较为复杂的查询。
, 合取 且 的意思。
该查询意思为:寻找满足条件的X,条件是:X位于kitchen中,且可以吃(具有edible属性)
如果某个变量在查询中多次出现,那么此变量在所有出现的位置都必须绑定相同的值,所以该查询,只有找到一个X 得值,使得两个目标都成立,才算查询成功。
每次查询所使用的都是局部变量。
除了使用逻辑的方式理解混合查询外,还可以通过分析程序运行步骤的方式来理解
如该查询可以这么理解:首先找到一样位于厨房的东西,然后判断它是否能吃。
如果不能,那就找到下一样东西,在判断能否使用,直至找到答案,或者是把厨房的东西都查找完毕。
- [debug] ?- location(X,kitchen),edible(X).
- T Call: () location(_G533, kitchen)
- T Exit: () location(broccoli, kitchen) %匹配第一个子句成功
- T Call: () edible(broccoli) %匹配第二个子句
- T Fail: () edible(broccoli) %匹配第二个子句失败,解除第一个子句的绑定,回溯上一个匹配成功的子句,发现并没有,回溯到最开始状态。
- T Redo: () location(_G533, kitchen) %重新匹配第一个子句
- T Exit: () location(crackers, kitchen)
- T Call: () edible(crackers) % 匹配第二个子句
- T Exit: () edible(crackers) %匹配成功,绑定X,同时显示
- X = crackers ;
- T Redo: () location(_G533, kitchen)
- T Exit: () location(apple, kitchen)
- T Call: () edible(apple)
- T Exit: () edible(apple)
- X = apple.
- [debug] ?-
上面为一个变量的。下面是两个变量的。
?- door(kitchen,R),location(T,R).
意思:找到和kitchen有们相邻的R,找到位于R中的T
- [debug] ?- door(kitchen,R),location(T,R).
- T Call: () door(kitchen, _G534)
- T Exit: () door(kitchen, office) %匹配第一个子句成功
- T Call: () location(_G536, office) %开始匹配第二个子句
- T Exit: () location(desk, office) %匹配第二个子句,
- R = office,
- T = desk ;
- T Redo: () location(_G536, office) %释放 T,重新在上一次匹配成功的子句后面寻找其他符合目标的条目
- T Exit: () location(computer, office) % 再次找到符合条目,绑定,显示
- R = office,
- T = computer ;
- T Redo: () door(kitchen, _G534) %SWI-prolog的原因,没有显示上面那次location匹配失败,重新开始匹配door子句,
- T Exit: () door(kitchen, cellar) %找到 door 子句 绑定 R cellar
- T Call: () location(_G536, cellar) % 查找 location子句
- T Exit: () location('washing mechine', cellar)
- R = cellar,
- T = 'washing mechine'.
- [debug] ?-
如图所示,由于SWI-prolog的不显示 fail 的原因,所以,我同样copy一份教程上的 debug 调试信息
- ?-door(kitchen,R),location(T,R).
- call door(kitchen,R) %匹配第一个子句
- exit() door(kitchen,office)
- call location(T,office) %第一个子句匹配成功之后,匹配第二个子句
- exit() location(desk,office)
- R = office
- T = desk
- redo location(T,office) %释放掉T,重新开始查询剩余的与location相匹配的条目
- exit() location(computer,office) %匹配成功
- R = office
- T = computer
- redo location(T,office) %释放掉 T ,再次查询剩余的与location相匹配的条目
- fail location(T,office) % 查询失败,释放掉 R,返回上一次匹配成功的子语句,发现并没有,所以会到最初状态
- redo door(kitchen,R) % 在最开始匹配成功的条目后面,查找剩余的和door相匹配的条目
- exit() door(kitchen,cellar) %匹配door成功,帮定R
- call location(T,cellar) %开始查找第二个子句
- exit() location('washing room',cellar) %查找成功,绑定R,显示R,T
- R = cellar
- T = 'washing room'
- redo location(T,cellar) %释放 T,重新开始查找剩下的和location相匹配的条目
- fail location(T,cellar) % 查找失败 释放已经绑定的R,返回上一次匹配成功的子句,发现没有,会到最初状态
- redo door(kitchen,R) % 重新查找剩余的和door相匹配的条目
- fail door(kitchen,R) %查找失败结束所有查找
- no
prolog --寻找neni (2)的更多相关文章
- prolog 规则
规则 规则由几个互相依赖的简单句(谓词)组成.用来描述事实之间的依赖关系,如:因果关系,蕴含关系,对应关系 规则的实质就是存储起来得查询 其语法结构如下: head:-body head 为谓词的定义 ...
- Prolog学习:基本概念 and Asp.net与Dojo交互:仪器仪表实现
Asp.net与Dojo交互:仪器仪表实现 项目中需要用到仪器仪表的界面来显示实时的采集信息值,于是便遍地寻找,参考了fusionchart和anychart之后,发现都是收费的,破解的又没有这些功能 ...
- 对Prolog的感想和我写的一些教程
我第一次见到Prolog这门独特的编程语言是在<七周七语言(Seven Languages in Seven Weeks)>中看到的.<七周七语言>名字看起来与市面上什么< ...
- Atitit.5gl 第五代语言编程语言 PROLOG教程 人工智能语言的标准 与实现
Atitit.5gl 第五代语言编程语言 PROLOG教程 人工智能语言的标准 与实现 1. 第五代语言就是自然语言又被称为知识库语言或人工智能语言,1 2. 人工智能语言特点2 2.1. 试探法2 ...
- 人工智能技术导论——逻辑程序设计语言PROLOG
最近在复习人工智能导论,里面介绍了一种逻辑关系语言PROLOG,但这本书里面用到的编译器是Turbo PROLOG,这个编译器早就被淘汰了,我后来找的了它的升级版Visual PROLOG,但一些语法 ...
- 【ProLog - 4.0 List】
[简介] 列表是Prolog编程中常用的一种重要的递归数据结构 列表是一个有限的元素序列 实例: 所有Prolog术语都可以是列表的元素,一个非空的List应该含有两个元素:头元素(Head)和尾元素 ...
- [LeetCode] Find the Celebrity 寻找名人
Suppose you are at a party with n people (labeled from 0 to n - 1) and among them, there may exist o ...
- [LeetCode] Find Minimum in Rotated Sorted Array II 寻找旋转有序数组的最小值之二
Follow up for "Find Minimum in Rotated Sorted Array":What if duplicates are allowed? Would ...
- [LeetCode] Find Minimum in Rotated Sorted Array 寻找旋转有序数组的最小值
Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 migh ...
随机推荐
- LeetCode "Design Twitter"
A mix of hashmap, list and heap. struct Tw { Tw(long long pts, int tid) { ts = pts; tweetid = tid; } ...
- ruby中tes-unitt数据初始化方法整理
在用ruby做测试时,很多时候需要一些数据初始化以及事后的数据恢复还原之类的操作,下面整理了这些方法.require "test/unit" class TestAnion < ...
- Hadoop总结篇之一------开篇
从今天开始新的系列:Hadoop总结篇 之前的hadoop学习篇由于是学习过程中随手记下来的一些内容,不具有系统性.所以在这个系列中,将凭着这段时间的研究心得,来记录一些自认为比较重要的东西. 本系列 ...
- JQuery获取元素本身HTML
$('<p>').append($(this).clone()).html() 原理:创建一个匿名对象,克隆本身,追加到匿名对象中,再获取匿名对象的HTML
- jquery 监听所有锚点链接实现平滑移动
jquery 监听所有锚点链接实现平滑移动,地址栏上不会改变链接地址 //监听所有锚点链接实现平滑移动 $('a[href*=#],area[href*=#]').click(function() { ...
- Nuget 常用命令
Update-Package -ProjectName 'NLog' -Reinstall 主题 about_NuGet 简短说明 提供有关 NuGet 程序包管理器命令的信息. 详细说明 本主题介绍 ...
- gradle修改AndroidManifest.xml中的版本号
def VersionCode = "19" ant.replaceregexp(file:"../Assets/Plugins/Android/AndroidManif ...
- eclipse下的webservice开发
关于eclipse下的webservice开发,有非常多的教程,这里只记下学习过程中的弯路: 1.无论是CXF模式还是AXIS模式,在出现start server之后,点击next报错:"s ...
- Linq并行执行
一. 并行LINQ 1. 并行查询 .NET4在System.Linq名称空间中包含一个新类ParalleIEnumerable ,可以分解查询的工作使其分布在多个线程上.尽管Enmerab ...
- linux出现user account has expired解决方案
SUSE Linux 用户user1登陆不了,确认密码没错,使用root用户登陆,su - user1 提示密码不对,passwd user1提示帐户过期user account hasexpired ...