混合查询

我们可以把简单的查询连接起来,组成复杂的查询。

?- 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)的更多相关文章

  1. prolog 规则

    规则 规则由几个互相依赖的简单句(谓词)组成.用来描述事实之间的依赖关系,如:因果关系,蕴含关系,对应关系 规则的实质就是存储起来得查询 其语法结构如下: head:-body head 为谓词的定义 ...

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

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

  3. 对Prolog的感想和我写的一些教程

    我第一次见到Prolog这门独特的编程语言是在<七周七语言(Seven Languages in Seven Weeks)>中看到的.<七周七语言>名字看起来与市面上什么< ...

  4. Atitit.5gl 第五代语言编程语言 PROLOG教程  人工智能语言的标准 与实现

    Atitit.5gl 第五代语言编程语言 PROLOG教程  人工智能语言的标准 与实现 1. 第五代语言就是自然语言又被称为知识库语言或人工智能语言,1 2. 人工智能语言特点2 2.1. 试探法2 ...

  5. 人工智能技术导论——逻辑程序设计语言PROLOG

    最近在复习人工智能导论,里面介绍了一种逻辑关系语言PROLOG,但这本书里面用到的编译器是Turbo PROLOG,这个编译器早就被淘汰了,我后来找的了它的升级版Visual PROLOG,但一些语法 ...

  6. 【ProLog - 4.0 List】

    [简介] 列表是Prolog编程中常用的一种重要的递归数据结构 列表是一个有限的元素序列 实例: 所有Prolog术语都可以是列表的元素,一个非空的List应该含有两个元素:头元素(Head)和尾元素 ...

  7. [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 ...

  8. [LeetCode] Find Minimum in Rotated Sorted Array II 寻找旋转有序数组的最小值之二

    Follow up for "Find Minimum in Rotated Sorted Array":What if duplicates are allowed? Would ...

  9. [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 ...

随机推荐

  1. 高通AR增强现实Unity3D

    AR: 增强现实,台湾翻译叫做扩张实境 1.注册.然后下载sdk(注册账号主要是为了第3步中制作识别图而用的) 下载地址:https://developer.vuforia.com/resources ...

  2. HDU2896 病毒侵袭

    题目大意:给出若干病毒的特征码,不超过500个.每个病毒的特征码长度在20~200之间.现在有若干网站的源代码,要检测网站的源代码中是否包含病毒.网站的个数不超过1000个,每个网站的源代码长度在70 ...

  3. [经验交流] Mesos-dns 和 Marathon-lb 简要使用方法

    Mesos-dns 和 Marathon-lb 是mesosphere 官网提供的两种服务发现和负载均衡工具.官方的文档主要针对DCOS,针对其它系统的相关中文文档不多,下面是我在Centos7上的安 ...

  4. Objective-C的 KVC和KVO

    字面意思分别是: KVC是指key value coding,键值编码. KVO是指key value observing,键值观察. 直白的说法是: KVC就是将一个对象的属性及其值当做一个字典,可 ...

  5. [MySQL] SqlServer 迁移到 MySQL 方法介绍

    一.原则: 只迁移表结构和数据,存储过程.函数.触发器尽量自己改写,并充分测试. 迁移前,先设置好数据库的一些参数,比如默认存储引擎,默认编码等,方便后续导入. 二.方法: 1.使用MySQL Wor ...

  6. class中new与未new的区别 类对象占用空间--转载

    转载自http://blog.sina.com.cn/shuiwuhendeboke    颗颗的博客 (1)作用域不同 不用new:作用域限制在定义类对象的方法中,当方法结束时,类对象也被系统释放了 ...

  7. Thunderbird扩展

    FromToGMAP 1.4 Mail Redirect 0.7.8 MinisizeToTray revived 1.1.2 Nightly Tester Tools 3.7 Thunderbrid ...

  8. RealTimePerformanceDemoView

    using System;using System.Diagnostics;using System.Timers;using System.Windows;using System.Windows. ...

  9. 我的 Kernel

    求真 工作之后,渐渐与人打交道,人情世俗也慢慢接触了,领了工资之后,也可以买一些自己喜欢的东西,感觉也开始像一个独立完整的人了. 所见所闻也有所想了,有些理念开始慢慢转变了.但是,不知道为什么,对于假 ...

  10. 物料主数据MRP4中的独立/集中

    转自悲守穷庐 http://blog.itpub.net/12287/viewspace-681569/ 从按订单还是按库存来考虑. (1)独立集中为空,即又上层决定独立集中情况 (2)独立集中为1: ...