PIE 阻断回溯——Cut
PIE(Prolog Inference Engine)通常是搜索所有的解。举个例子,

当然dialog窗口中一开始调用 run. 只会显示一个解(虽然事实上会得到两个解),在前面加上 X=1,就可以将两个解都显示出来。
有时候我们只需要得到一个解就行,此时如果让PIE算出所有的解,显然会浪费时间降低效率。这时我们就可以使用 cut 来解决这个问题。
假设有如下规则,rule
r1 :- a,b,c.
有三个 subgoal,分别是 a,b,c。PIE推断的时候依次计算a,b,c,当c失败时,可能会回溯b(如果b有回溯点的话),甚至会回溯到a。现在在这条rule中加上一个 cut (使用 ! 符号)
r1 :- a,b,!,c.
可以将!看作一个subgoal。现在在b和c直接有一个cut,这导致在c之前的所有 subgoal(这里是a 和 b)将不会被设置回溯点,对PIE来说,计算subgoal a 和 b 的第一个解已经足够了,不会再计算满足 a 和 b 的其他解。当然,PIE还是可以计算搜索满足c的很多个解。
Cut的作用
1)在一个rule中,位于 ! 之前的subgoal不会被设置回溯点。
2)在几个定义相同rule的规则中(定义一个rule可能会有多个从句clause),某一个rule中的 ! 会导致其他从句中不会被设置回溯点。
看一个实际的例子,还是上图中的那个例子,在run规则中加入一个cut,则只有一个解
run :-
person(Name,"pianotuner",Amount),
Amount < , !
write(Name).
这是一个阻断其他subgoal被回溯的例子。下面再看一个其他从句被阻断的例子
cut会告诉PIE已经选择了一个正常的从句来计算推导,故而没有必要再选择其他从句来计算。例如,考虑如下代码,
r():- ! , a , b , c.
r():- ! , d.
r():- ! , c.
r(_):- write("This is a catchall clause.").
这里有四个从句定义了规则r。Prolog调用 r 并传入一个整形参数,假设调用的是 r(1),Prolog搜索程序代码,以找到满足r(1)的解。考虑到对r(1)而言,可能有不止一个解,故Prolog在r(2)处设置一个回溯点,然后进入r(1)进行计算,进入r(1)后Prolog首先就看到!符号,这个cut会导致移除所有其他从句被设置回溯点的可能性,然后Prolog依次计算a,b,c,并且不会回溯到其他r从句中。注意到上面最后一个从句非常类似其他语言中的异常捕获,由于cut的作用也使得在进入r(1)进行计算后,Prolog不应该再调用异常捕获从句。
上面这组规则还可以写成如下形式,
r(X) :- X = , ! , a , b , c.
r(X) :- X = , ! , d.
r(X) :- X = , ! , c.
r(_) :- write("This is a catchall clause.").
当然,前一种写法程序执行效率更高,并且可读性也更好。
PIE 阻断回溯——Cut的更多相关文章
- pyhton matplotlib可视化图像基础(二维函数图、柱状图、饼图、直方图以及折线图)
//2019.07.22pyhton中matplotlib模块的应用pyhton中matplotlib是可视化图像库的第三方库,它可以实现图像的可视化,输出不同形式的图形1.可视化图形的输出和展示需要 ...
- Graph Cut and Its Application in Computer Vision
Graph Cut and Its Application in Computer Vision 原文出处: http://lincccc.blogspot.tw/2011/04/graph-cut- ...
- 【CF MEMSQL 3.0 C. Pie Rules】
time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standa ...
- POJ 1416 Shredding Company 回溯搜索 DFS
Shredding Company Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 6173 Accepted: 3361 ...
- 内核中dump_stack的实现原理(1) —— 栈回溯
环境 Aarch64 Qemu aarch64-linux-gnu-gcc linux-4.14 概述 栈回溯的目的是将函数的调用栈打印出来,对于分析函数调用和debug系统异常会很有帮助 ...
- 3、回溯算法解题套路框架——Go语言版
前情提示:Go语言学习者.本文参考https://labuladong.gitee.io/algo,代码自己参考抒写,若有不妥之处,感谢指正 关于golang算法文章,为了便于下载和整理,都已开源放在 ...
- [No0000A2]“原始印欧语”(PIE)听起来是什么样子?
"Faux Amis"节目中经常提到"原始印欧语"(PIE)——"Proto-Indo-European". 我们说过,英语,法语中的&qu ...
- POJ Minimum Cut
Minimum Cut Time Limit: 10000MS Memory Limit: 65536K Total Submissions: 9302 Accepted: 3902 Case ...
- N皇后问题—初级回溯
N皇后问题,最基础的回溯问题之一,题意简单N*N的正方形格子上放置N个皇后,任意两个皇后不能出现在同一条直线或者斜线上,求不同N对应的解. 提要:N>13时,数量庞大,初级回溯只能保证在N< ...
随机推荐
- Linux环境进程间通信(二):信号(下)
linux下进程间通信的几种主要手段: 管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允 ...
- linux网络编程(一)
一.概念介绍 网络程序分为服务端程序和客户端程序.服务端即提供服务的一方,客户端为请求服务的一方.但实际情况是有些程序的客户端.服务器端角色不是这么明显,即互为客户端和服务端. 我们编写网络程序时,一 ...
- python学习之路四(类和对象1)
#encoding:utf-8 ''' Created on 2013-7-29 @author: lixingle ''' #CLass............................... ...
- 【转载】Stack Overflow: The Architecture - 2016 Edition
转载:http://www.infoq.com/cn/news/2016/03/Stack-Overflow-architecture-insi?utm_source=tuicool&utm_ ...
- [Windows Azure] 使用 Windows Azure 快速搭建 Redis 服务器
[Windows Azure] 使用 Windows Azure 快速搭建 Redis 服务器 Redis相信玩开源,大数据的朋友们并不陌生,大家最熟悉的使用者就是新浪微博,微博的整体数据缓存都是 ...
- [wp8游戏] cocos2d-x v2.2 + VS2013 环境搭建
[wp8游戏] cocos2d-x v2.2 + VS2013 环境搭建 by:唐小崇 http://www.cnblogs.com/tangchong 从cocos2d-x v2.1.4 以来,co ...
- WP8开发札记(二)让程序支持锁屏运行
我们都知道WP8是采用墓碑机制来管理应用程序的. 当我们把手机锁屏了,默认情况下,App就触发了deactivated 事件,准备被墓碑化了. 但是,有些时间我们不想让程序就此终止运行.(比如说,你开 ...
- spring和redis的整合
spring和redis的整合-超越昨天的自己系列(7) 超越昨天的自己系列(7) 扯淡: 最近一直在慢慢多学习各个组件,自己搭建出一些想法.是一个涉猎的过程,慢慢意识到知识是可以融汇贯通,举一反三 ...
- 数模学习笔记(四)——AHP
1.层次分析法是对复杂.较为模糊的问题作出决策的简易方法. 2.步骤: (i)建立递阶层次结构模型:最高层(目标层),中间层(准则层),最底层(措施层) (ii)构造出各层次中的所有判断矩阵 各准则在 ...
- autotools入门笔记(二)——创建和使用静态库、动态库
带有静态库或者动态库的工程的构建过程与上一节()只包含一个源文件的工程的构建过程是类似的.只是对于复杂的工程,如果包含多个还有源文件的目录时,需要对每个包含源文件的目录执行构建过程,另外创建和使用库文 ...