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. sap 取货币之间汇率

    FORM FRM_GET_KURSK USING PV_KURST "M PV_FCURR PV_TCURR PV_PRSDT CHANGING PV_KURSK. DATA: LV_RAT ...

  2. 跨平台开发之阿里Weex框架环境搭建(一)

    转载自:http://www.cnblogs.com/fozero/p/5995122.html 一.介绍 Weex是阿里今年6月份推出的跨平台解决方案,6月底正式开源.官网 https://alib ...

  3. 【学】AngularJS日记(2)

    数组循环放到新生成的li中 <ul ng-init="arr=[12,5,6,394,344]"> <li ng-repeat="item in arr ...

  4. 1.ARM的基础知识

    ARM简述 ARM公司既不生产芯片也不销售芯片,它只出售芯片技术授权.ARM技术具有很高的性能和功效,因而容易被厂商接受.同时,合作伙伴的增多,可获得更多的第三方工具.制造和软件支持,这又会使整个系统 ...

  5. [Maven]Maven 那点事儿

    0. 前言 Jason Van Zyl,在 Java 十大风云人物排行榜上或许会看到他. 这兄弟是干嘛的? 他就是 Maven 的创始人,人们都尊称他为"Maven 他爸". 毋庸 ...

  6. vuejs,router

    接下来我们要做的是vue的路由处理,首先当然是安装: npm install vue-router 接下打开我们的main.js,引入我们vue-router,然后在告诉vue我们要使用我们的vue- ...

  7. 安装中文版cacti监控华为交换机流量并实现95计费

    摘要:一. 装置yum源: 以网易yum源为例 1. 下载repo文件 下载地点:http://mirrors.163.com/.help/CentOS6-Base-163.repo 2.备份并调换体 ...

  8. Linux查找含有某字符串的所有文件

    转自:http://151wqooo.blog.51cto.com/2610898/1162118 如果你想在当前目录下 查找"hello,world!"字符串,可以这样: gre ...

  9. Drools mvel方言drl断点调试方法

    开发环境:myeclipse2014,  jdk1.8.0.91,drools6.4.0.Final, drools-eclipse-plugin,mvel2-2.2.6.Final问题描述:drl使 ...

  10. 方便的一站式svn/git服务器软件(linux)

    https://www.scm-manager.org/ The easiest way to share and manage your Git, Mercurial and Subversion ...