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的更多相关文章

  1. pyhton matplotlib可视化图像基础(二维函数图、柱状图、饼图、直方图以及折线图)

    //2019.07.22pyhton中matplotlib模块的应用pyhton中matplotlib是可视化图像库的第三方库,它可以实现图像的可视化,输出不同形式的图形1.可视化图形的输出和展示需要 ...

  2. Graph Cut and Its Application in Computer Vision

    Graph Cut and Its Application in Computer Vision 原文出处: http://lincccc.blogspot.tw/2011/04/graph-cut- ...

  3. 【CF MEMSQL 3.0 C. Pie Rules】

    time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standa ...

  4. POJ 1416 Shredding Company 回溯搜索 DFS

    Shredding Company Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 6173   Accepted: 3361 ...

  5. 内核中dump_stack的实现原理(1) —— 栈回溯

    环境 Aarch64 Qemu aarch64-linux-gnu-gcc linux-4.14   概述     栈回溯的目的是将函数的调用栈打印出来,对于分析函数调用和debug系统异常会很有帮助 ...

  6. 3、回溯算法解题套路框架——Go语言版

    前情提示:Go语言学习者.本文参考https://labuladong.gitee.io/algo,代码自己参考抒写,若有不妥之处,感谢指正 关于golang算法文章,为了便于下载和整理,都已开源放在 ...

  7. [No0000A2]“原始印欧语”(PIE)听起来是什么样子?

    "Faux Amis"节目中经常提到"原始印欧语"(PIE)——"Proto-Indo-European". 我们说过,英语,法语中的&qu ...

  8. POJ Minimum Cut

    Minimum Cut Time Limit: 10000MS   Memory Limit: 65536K Total Submissions: 9302   Accepted: 3902 Case ...

  9. N皇后问题—初级回溯

    N皇后问题,最基础的回溯问题之一,题意简单N*N的正方形格子上放置N个皇后,任意两个皇后不能出现在同一条直线或者斜线上,求不同N对应的解. 提要:N>13时,数量庞大,初级回溯只能保证在N< ...

随机推荐

  1. [google面试CTCI] 2-3 只给定链表中间节点指针,如何删除中间节点?

    [链表] Q:Implement an algorithm to delete a node in the middle of a single linked list, given only acc ...

  2. WebLogic使用SSH架构部署遇到org.hibernate.hql.internal.ast.HqlTok

    其实这个问题在以前就遇到过,当时解决了,但今天在部署一个测试轻应用的时候一直没有想起来,特此记录一下. 这个问题出现在使用WebLogic(我使用的是10.3.5版本)发布SSH架构的应用.在操作数据 ...

  3. defer 与 async

    defer HTML4.01定义的 只适用于外部脚本(IE4~7会支持内嵌脚本的defer属性) 告诉浏览器立即下载,延迟执行,脚本会延迟到整个页面全部解析完毕之后才运行 HTML5规范要求脚本按照他 ...

  4. DropDownList单选与多选下拉框

    一.单选DropDownList传值 1.添加界面的DropDownList显示值问题 (1)在方法内添加ViewData的方法: var ad = new UnitsRepository(); Vi ...

  5. 新的IRepository接口+搜索和排序解耦(+基于Castle实现)

    新的IRepository接口+搜索和排序解耦(+基于Castle实现) 经过了上篇IRepository和IRepository<T>的讨论[文章地址为:http://www.cnblo ...

  6. java文件上传--基于ajaxFileUpload+struts2

    jQuery插件ajaxFileUpload可以实现ajax文件上传,使用非常简单. 下面做一个简单的demo(以上传图片为例),实现图片上传,图片显示,图片下载 注:以下的代码是在项目的基础上进行开 ...

  7. WordPress 4.3.1正式发布 修复了3个安全问题

    WordPress 4.3.1正式发布  修复了3个安全问题! 出于安全性考虑,建议大家进行升级! WordPress 4.3.1 安全维护版本已经发布,该版本是针对之前所有版本的安全更新,强烈建议大 ...

  8. 将 Servlet (HTTP POST/GET)请求发布到OSB

    转载地址:http://user.qzone.qq.com/32221895/blog/1406960844 ------------------------------------- 发帖要200字 ...

  9. spring添加通知配置

    在项目里添加的spring配置文件 <bean id="beforeMethod" class="com.wxw.core.common.AdviceBefore& ...

  10. Citrix 服务器虚拟化之一 网络部署Xenserver 6.2

    Citrix 服务器虚拟化之一  网络部署Xenserver 6.2 思杰的XenServer®是完整的服务器虚拟化平台. XenServer软件包中包含所有你需要创建和管理部署的虚拟x86计算机上运 ...