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. 微信开发-ACCESS TOKEN 过期失效解决方案

    微信开发-ACCESS TOKEN 过期失效解决方案 起因:因为access_token的重要性,开发过微信的都知道,但是他有自己的生命周期,官方解释为:"有效期为7200秒",一 ...

  2. Spring IoC容器总结(未完)

    在面向对象系统中,对象封装了数据和对数据的处理,对象的依赖关系常常体现在对数据和方法的依赖上.这些依赖关系可以通过把对象的依赖注入交给框架或IOC容器来完成,这种从具体对象手中交出控制的做法是非常有价 ...

  3. Allegro 快捷键设置

    一.快捷键设置 Allegro可以通过修改env文件来设置快捷键,这对从其它软件如AD或PADS迁移过来的用户来说,可以沿用以前的操作习惯,还是很有意义的. Allegro的变量文件一共有2个:一个是 ...

  4. (document).height()与$(window).height()

    jQuery(window).height()代表了当前可见区域的大小,而jQuery(document).height()则代表了整个文档的高度,可视具体情况使用. 注意当浏览器窗口大小改变时(如最 ...

  5. 原生js获取元素style属性

    function getStyle(ele,attr){ if( ele.currentStyle ){ return ele.currentStyle[attr]; // ie } else { r ...

  6. css属性在各种浏览器上的兼容性

    transform:在360急速浏览器不支持,在IE兼容性上看IE浏览器的版本,IE9+是支持.

  7. 帝国cms 页面统计

    <script src=[!--news.url--]e/public/ViewClick/?classid=[!--classid--]&id=[!--id--]&addcli ...

  8. get application power

    1. http://blog.csdn.net/sjz_iron/article/details/8726661 http://www.16rd.com/home.php?mod=space& ...

  9. 十四、View Port 2.0

    1. 分为以下几类: (1) data classes: 用来访问scene中的geometry 和 shaders (2)scene override: 主要是用户自定义的drawing .shad ...

  10. strace 解决库依赖问题

    解决库依赖问题 starce 的另一个用处是解决和动态库相关的问题.当对一个可执行文件运行ldd时,它会告诉你程序使用的动态库和找到动态库的位置.但是如果你正在使用一个比较老 的glibc版本(2.2 ...