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. Best Practices for Performance_4.Optimizing Battery Life 获取充电状态、电池信息,"sticky"类型的广播

    http://developer.android.com/training/monitoring-device-state/index.htmlhttp://developer.android.com ...

  2. Bootstrap,Font Awesome等组件中 .woff字体报404错的解决办法

    参考资料:http://www.zhidao91.com/glyphicons-halflings-regular-woff-404-not-found/ http://shiyousan.com/p ...

  3. js生成GUID

    //表示全局唯一标识符 (GUID). function Guid(g) { var arr = new Array(); //存放32位数值的数组 if (typeof(g) == "st ...

  4. Google Developing for Android 三 - Performance最佳实践

    Google Developing for Android 三 - Performance最佳实践 发表于 2015-06-07   |   分类于 Android最佳实践 原文 Developing ...

  5. 升级到VS2013.Update.4的问题

    升级到VS2013.Update.4后,编译VS2010的解决方案出错,提示AxImp.exe找不到,到网上搜索后,没有找到能用的法子: 修复VS2013后也无法解决: 折腾2个小时后终于找到问题了: ...

  6. dubbo入门示例

    前提准备: 在本次实验之前,需要准备一下几个包: Spring中的aop.beans.context.core.expression以及struts中的commons-logging.javassis ...

  7. python学习笔记(三)

    1.闭包:闭包是一个包含有环境变量取值的函数对象.环境变量取值被保存在函数对象的__closure__属性中.将函数作为某另一个函数的返回结果. 2.可以继续调用decorator来修饰函数或者类,而 ...

  8. 转:SAAS 测试

    基于SaaS云计算网络性能测试指标研究 来源:中国软件评测中心  作者:马子明  投稿时间:2011-04-02 1.基于SaaS的云计算 SaaS(Software as a Service,软件即 ...

  9. 如何用Visual Studio 2013 (vs2013)编写C语言程序 (转)

    http://blog.sina.com.cn/s/blog_964ee6730101jvvi.html

  10. typedef 揭秘

    typedef用来声明一个别名,typedef关键字后面是一个声明.语法上typedef属于存储类声明说明符 一.引言 如果你理解typedef的简单形式: typedef int PARA; 这种形 ...