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< ...
随机推荐
- Nginx 配置基于域名的虚拟
编辑配置文件 vi /etc/nginx/nginx.conf user www www; worker_processes 2; error_log logs/error.log not ...
- 查看TOMCAT内存使用情况 以及修改方法
查看TOMCAT内存使用情况 <% double total = (Runtime.getRuntime().totalMemory()) / (1024.0 * 1024); double m ...
- centos安装svn
原文链接:http://blog.csdn.net/liuyuan_jq/article/details/2110814 1.SVN简介由于前些年在版本的管理上采用的都是CVS系统,总体上而言还是很优 ...
- 用T4消除代码重复,对了,也错了
用T4消除代码重复,对了,也错了 背景 我需要为int.long.float等这些数值类型写一些扩展方法,但是我发现他们不是一个继承体系,我的第一个思维就是需要为每个类型重复写一遍扩展方法,这让我觉得 ...
- PostgreSQL 简明使用说明
原文地址:http://www.ruanyifeng.com/blog/2013/12/getting_started_with_postgresql.html 期间,作者有写错的地方,已经做更改了. ...
- [修]开启MySQL远程访问权限 允许远程连接
原文地址:http://www.cnblogs.com/XL-Liang/archive/2012/05/03/2481310.html 这个地址也许更有帮助:http://www.cppblog.c ...
- Android ListView多布局讲解
Listview优化是一个老生常谈的事情了,其优化的方面也有很多种,例如,布局重用.在getView()中减少逻辑计算.减少在页面滑动的时候加在图片,而是在页面停止滚动的时候再加在图片.而今天要介绍的 ...
- Linux 内核源码中likely()和unlikely()
ikely()与unlikely()在2.6内核中,随处可见,那为什么要用它们?它们之间有什么区别呢? 首先明确: if (likely(value))等价于if (value)if (likely( ...
- Mac下Android studio搭建Android开发环境【新手】
上学期用的还是windows,这学期新入手了mac,突然也想装个Android studio来玩玩.安装过程中出现了问题,记录如下. 先是装安卓studio的下载链接,不推荐去官网装,这里提供一个挺好 ...
- template template parameter
#include <iostream> using namespace std; template<typename T> class A { }; template<t ...