test.pl文件

room(kitchen).
room(office).
room(hall).
room('dining room').
room(cellar).
location(desk,office).
location(apple,kitchen).
location(flashlight,desk).
location('washing mechine',cellar).
location(nani,'washing mechine').
location(broccoli,kitchen).
location(crackers,kitchen).
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).

localtion() 和 door() 中的变量是区分顺序的,如:

?-location(desk,office).

true

?-location(office,desk).

false

?-door('dining room',kitchen).

true

?-door(kitchen,'dining room').

false

prolog程序的运行机理

1、自由变量 约束变量

  prolog中无值的变量称之为自由变量,有值的变量称之为约束变量。

  一个变量取了某值,就称该变量约束于某值,或者该变量被某值约束,或者该变量被某值实例化了。

  在程序运行过程中,自由变量可以被实例化成为约束变量;一个约束变量也可以解除其值成为自由变量。

2、匹配合一

  两个谓词可以匹配合一,指两个谓词的名相同,参量项的个数相同,参量类型相同,并且对应参量项还满足如下条件之一:

    ①如果两个都是常量,则必须完全相同。

    ②如果两个都是约束变量,则两个约束值必须相同

    ③如果一个是常量,一个是约束变量,那么常量和约束值必须相同。

    ④至少有一个是自由变量。(个人理解,如果至少有一个自由变量,其实是给用另一个相应的值,把这个自由变量约束起来,成为一个约束变量,最后是实现相等)

  prolog的匹配合一操作,可以使两个能匹配的谓词合一起来。即为参加匹配的自由变量和常量,或者是两个自由变量建立一种对应关系。使得常量作为变量的约束值,两个对应的自由变量始终保持一致,即若其中一个值被约束,则另一个值也被约束,反之,解除一个值的约束,另外一个值也会被解除约束。

test.pl文件

room(kitchen).
room(office).
room(hall).
room('dining room').
room(cellar).
location(desk,office).
location(apple,kitchen).
location(flashlight,desk).
location('washing mechine',cellar).
location(nani,'washing mechine').
location(broccoli,kitchen).
location(crackers,kitchen).
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).

localtion() 和 door() 中的变量是区分顺序的,如:

?-location(desk,office).

true

?-location(office,desk).

false

?-door('dining room',kitchen).

true

?-door(kitchen,'dining room').

false

prolog程序的运行机理

1、自由变量 约束变量

  prolog中无值的变量称之为自由变量,有值的变量称之为约束变量。

  一个变量取了某值,就称该变量约束于某值,或者该变量被某值约束,或者该变量被某值实例化了。

  在程序运行过程中,自由变量可以被实例化成为约束变量;一个约束变量也可以解除其值成为自由变量。

2、匹配合一

  两个谓词可以匹配合一,指两个谓词的名相同,参量项的个数相同,参量类型相同,并且对应参量项还满足如下条件之一:

    ①如果两个都是常量,则必须完全相同。

    ②如果两个都是约束变量,则两个约束值必须相同

    ③如果一个是常量,一个是约束变量,那么常量和约束值必须相同。

    ④至少有一个是自由变量。(个人理解,如果至少有一个自由变量,其实是给用另一个相应的值,把这个自由变量约束起来,成为一个约束变量,最后是实现相等)

  prolog的匹配合一操作,可以使两个能匹配的谓词合一起来。即为参加匹配的自由变量和常量,或者是两个自由变量建立一种对应关系。使得常量作为变量的约束值,两个对应的自由变量始终保持一致,即若其中一个值被约束,则另一个值也被约束,反之,解除一个值的约束,另外一个值也会被解除约束。

简单查询

prolog的查询工作是靠模式匹配完成的,查询的模版叫做目标,如果有某个事实与目标想匹配,那么查询成功,prolog的解释器会显示true(有的prolog IDE 会显示yes),否则显示false(有的prolog IDE显示no)。

我们把prolog的模式匹配工作叫做联合。

?-room(office).
true ?-room(fdafd).
false ?-location(desk,office).
true
?-location(office,desk).
false

在查询目标中,我们可以使用使用变量。变量可以和任何条目匹配。

当联合成功之后,变量的值将和它所匹配的条目的值相同,这叫做变量的绑定(binding),当带变量的目标成功和数据库中的事实匹配之后,prolog将返回变量绑定的值。

?-room(X).
X = kitchen;
X = office;
X = hall;
X = 'dining room';
X = cellar.
no % 有的prolog 程序会显示no 但是SWI-prolog不会显示任何提示,只会默默的退出查询
?-

由于目标可以和多个条目匹配所有,变量可以绑定多个值。在prolog每次回答之后,输入“;”,可以让prolog继续查询,

?- location(Thing,Place).
Thing = nani,
Place = 'washing mechine' ; % 一次成功的查询
Thing = broccoli,
Place = kitchen ; %又一次成功的查询
Thing = crackers,
Place = kitchen ;
Thing = desk,
Place = office ;
Thing = apple,
Place = kitchen ;
Thing = flashlight,
Place = desk ;
Thing = 'washing mechine',
Place = cellar ;
Thing = computer,
Place = office.

查询的工作原理

当prolog试图与某一个目标相匹配时,例如 location/2,它就在数据库中搜索所有用location/2定义的子句。当找到一条与目标匹配的子句时,它就会为这条子句做上记号,当用户需要更多答案时,它就从那条做了记号的子句开始向下查询。

prolog的目标有四个端口来控制运行的流程。调用(call),退出(exit),重试(redo),失败(fail)。使用call进入目标,如果匹配成功,就到exit端口,如果失败就到fail端口,如果用户输入“;”(分号),那就又从redo端口进入目标。

call    开始使用目标搜寻子句

exit 目标匹配成功,在成功的子句上作记号,并绑定变量

redo  视图重新满足目标,首先释放变量,并从上次开始的记号开始搜索

fail    表示再找不到更多满足目标的子句

但是SWI-log进入调试模式(最后补上)

 ?- %         location/: [call,redo,exit,fail]
% The graphical front-end will be used for subsequent tracing
?- location(X,kitchen).
T Call: () location(_G161, kitchen)
T Exit: () location(broccoli, kitchen)
X = broccoli ;
T Redo: () location(_G161, kitchen)
T Exit: () location(crackers, kitchen)
X = crackers ;
T Redo: () location(_G161, kitchen)
T Exit: () location(apple, kitchen)
X = apple.

我感觉这个SWI-prolog 的调试信息不能很好的把顺序说明白,所以就复制一下文档中的debug信息。

?- location(X, kitchen). 

CALL: - location(X, kitchen) 
EXIT:() location(apple, kitchen)
X = apple;  REDO: location(X, kitchen)  
EXIT:() location(broccoli, kitchen) 
X = broccoli   REDO: location(X, kitchen) 
EXIT:() location(crackers, kitchen)  
X = crackers    FAIL - location(X, kitchen)
no  %括号中的数字表正在考虑的子句

SWI-prolgo进入调试模式方式:

菜单栏--debug--Edit spy points

第一步:在predicate栏输入自己想debug 的 谓词

第二步:点击输入栏右侧的 眼睛 图标。

第三步:点击 右上角的 debug 选框

第四步:像往常一样在SWI-prolog 输入想要查询的信息。继续查询的话使用“;”。

第二种:

两种调试方式

寻找 nani (1)的更多相关文章

  1. prolog 规则

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

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

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

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

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

  5. C语言 · 寻找数组中的最大值

    问题描述 对于给定整数数组a[],寻找其中最大值,并返回下标. 输入格式 整数数组a[],数组元素个数小于1等于100.输出数据分作两行:第一行只有一个数,表示数组元素个数:第二行为数组的各个元素. ...

  6. 【跟着子迟品 underscore】如何优雅地写一个『在数组中寻找指定元素』的方法

    Why underscore (觉得这部分眼熟的可以直接跳到下一段了...) 最近开始看 underscore.js 源码,并将 underscore.js 源码解读 放在了我的 2016 计划中. ...

  7. table寻找兄弟列的值

    function showCover(videoidtemp,curRow){ // curRow为当前元素.寻找当前元素的父元素,寻找父元素中class为tdd的元素..html() 是单元格td中 ...

  8. nyoj 448 寻找最大数(贪心专题)

    寻找最大数 时间限制:1000 ms  |  内存限制:65535 KB 难度:2   描述 请在整数 n 中删除m个数字, 使得余下的数字按原次序组成的新数最大, 比如当n=920813467185 ...

  9. php glob()函数实现目录文件遍历与寻找与模式匹配的文件路径

    采用PHP函数glob实现寻找与模式匹配的文件路径,主要讨论glob()函数的作用和用法,利用glob函数读取目录比其它的要快N倍,因为glob函数是内置函数处理起来自然要快. 一,函数原型 arra ...

随机推荐

  1. mybatis实战教程(mybatis in action)之四:实现关联数据的查询

    有了前面几章的基础,对一些简单的应用是可以处理的,但在实际项目中,经常是关联表的查询,比如最常见到的多对一,一对多等.这些查询是如何处理的呢,这一讲就讲这个问题.我们首先创建一个Article 这个表 ...

  2. IOS WebView修改contentInset 导致webview长按弹出菜单跳动的解决方法

    最近在项目中需要用到webview 加载H5 并且在webview 底部使用原生UI添加其他空间比如广告.或者评论(Scrollview) 最初使用修改webview中scrollview 的cont ...

  3. Maven私有仓库搭建和使用

    下载和安装 下载地址: http://www.sonatype.com/nexus-repository-oss 安装: Linux版的无需安装,直接解压即可,然后进入bin目录下,运行./nexus ...

  4. mysql处理高并发,防止库存超卖

    先来就库存超卖的问题作描述:一般电子商务网站都会遇到如团购.秒杀.特价之类的活动,而这样的活动有一个共同的特点就是访问量激增.上千甚至上万人抢购一个商品.然而,作为活动商品,库存肯定是很有限的,如何控 ...

  5. 《前端们,贺老 Live 面试你了!》所引发的思考与实践

    贺老在知乎live中提到了一个这样的问题: 产品经理提出了一个需求:用户点击文章阅读,返回之后阅读其他文章.当用户看得多了,容易点到自己看过的文章,造成时间浪费.所以想给点击过的文章加一个标记,如:& ...

  6. AMap编辑折线、多边形、圆

    <!doctype html> <html> <head> <meta charset="utf-8"> <meta http ...

  7. localStorage、sessionStorage在无痕模式下被禁用

    在移动web开发中,经常会使用到localStorage去缓存一些数据,一般情况下,我们只需要按照下面的代码去使用就不会有 问题. if(window.localStorage){ localStor ...

  8. 【javascript 面试笔试】1、几道笔试题

    今天想起来几道javascript的面试题,大家做做看看,有别的思路可以在下面写出来,大家交流一下 (1) 将多维数组转化成一个一位数组,例如[1,[2,3],[4,5,[6,7]]]转化成[1,2, ...

  9. iptables删除规则

    查看nat规则: iptables -t nat -nL --line-number 添加规则是-A和-I,-A是添加到末尾,-I是添加到指定位置,默认添加到最前面.删除使用-D,也就是原来“ipta ...

  10. disposition

    该文为堕落的天使不再来原创.欢迎转载. 在尽心web开发时,可能遇到以下几种需求:(disposition配置) 希望某类或者某已知MIME 类型的文件(比如:*.gif;*.txt;*.htm)能够 ...