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< ...
随机推荐
- C语言变参函数的编写
1. 引言 一般我们编程的时候,函数中形式参数的数目通常是确定的,在调用时要依次给出与形式参数对应的实际参数.但在某些情况下我 们希望函数的参数个数可以根据需要确定,因此c语言引入可变参数函数.典型的 ...
- C# 添加敏感词
public class CheckStreamReader { //使用的数据: private static HashSet<string> hash = new HashSet< ...
- 新浪微博SDK在Eclipse引入
新浪微博SDK在Eclipse中的使用 新浪微博SDK在Eclipse中的使用 今天在看<Android开发应用实战>,全书都在讲一个android版的新浪微博客户端怎么做,于是按照书上步 ...
- jQuery判断元素是否显示与隐藏
jQuery判断一个元素是显示还是隐藏,jQuery使用is()方法来判断一个元素是否显示,反之则为隐藏 核心代码 if($("#username").is(":hidd ...
- 微信移动支付V3开发详细教程服务端采用.net mvc webapi(C#)
转自:http://www.kwstu.com/ArticleView/netmvc_201511132050268716 最近开发手机app需要实现移动支付功能,由于考虑支付安全将微信支付生成签名写 ...
- Oracal的Lpad函数
lpad函数是Oracle数据库函数,lpad函数从左边对字符串使用指定的字符进行填充.从其字面意思也可以理解,l是left的简写,pad是填充的意思,所以lpad就是从左边填充的意思. 语法格式如下 ...
- Exchange 2016 创建日程,远程服务器返回错误: (401) 未经授权
背景:在测试环境中一切正常,使用的是Exchange2013,上生产环境Exchange2016,部署后产生如下错误: Microsoft.Exchange.WebServices.Data.Serv ...
- NPinyin 中文转换拼音代码
Mono 3.2 测试NPinyin 中文转换拼音代码 C#中文转换为拼音NPinyin代码 在Mono 3.2下运行正常,Spacebuilder 有使用到NPinyin组件,代码兼容性没有问 ...
- 12、Python-网络编程
1.套接字1.1 socket模块套接字是网络编程中的一个基本组件,一般包括服务器端套接字和客户端套接字. 创建服务器端过程如下: import socket s = socket.socket() ...
- Python自动化测试 -ConfigParser模块读写配置文件
C#之所以容易让人感兴趣,是因为安装完Visual Studio, 就可以很简单的直接写程序了,不需要做如何配置. 对新手来说,这是非常好的“初体验”, 会激发初学者的自信和兴趣. 而有些语言的开发环 ...