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 ...
随机推荐
- Shiro简单配置
注:这里只介绍Spring配置模式. 因为官方例子虽然中有更加简洁的ini配置形式,但是使用ini配置无法与spring整合.而且两种配置方法一样,只是格式不一样. 涉及的jar包 核心包shiro- ...
- Troubleshooting a node by using the netapp SP
Troubleshooting a node by using the SP When you encounter a problem with a node, you can use the SP ...
- SOAP(简单对象访问协议)
ylbtech-Miscellaneos:SOAP(简单对象访问协议) A,返回顶部 1, 简单对象访问协议是交换数据的一种协议规范,是一种轻量的.简单的.基于XML(标准通用标记语言下的一个子集)的 ...
- Sql Server分割字符串函数
-- Description: 分割字符串函数 -- SELECT * FROM dbo.Split('a,b,c,d,e,f,g',',') -- ========================= ...
- [ActionScript 3.0] 两个AIR之间的通信示例LocalConnection
发送方AIR程序: package { import flash.display.DisplayObjectContainer; import flash.display.Sprite; import ...
- WinForm中TreeView控件实现鼠标拖动节点(可实现同级节点位置互换,或拖到目标子节点)
;//1:不同级, 不为1:拖同级 private void treeView1_ItemDrag(object sender, ItemDragEventArgs e) { if (e.Button ...
- Unix 用gdb分析core dump文件
产生core文件条件 用ulimit -c 指定core文件大小来开启core文件的生成,如:ulimit -c unlimited 用gdb分析core文件的条件 可执行程序在编译时,需加入-g参数 ...
- PHP中对淘宝URL中ID提取
<?php $taobao = 'taobao.com'; $tmall = 'tmall.com'; $guojitmall = 'tmall.hk'; $juhuasuan = 'ju.ta ...
- unity自定义工具
using UnityEngine;using UnityEditor;using System.Collections;using System.IO;using System.Collection ...
- 剑指Offer:面试题29——数组中出现次数超过一半的数字(java实现)
PS:在前几天的面试中,被问到了这个题.然而当时只能用最低效的方法来解. 问题描述: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2, ...