跳转到内容

Cut (逻辑编程)

维基百科,自由的百科全书

这是Cut (逻辑编程)当前版本,由Tigerzeng留言 | 贡献编辑于2017年7月25日 (二) 04:00 半自动编辑:翻译ref章节标题)。这个网址是本页该版本的固定链接。

(差异) ←上一修订 | 最后版本 (差异) | 下一修订→ (差异)

Prolog编程中的cut操作,用!表示,该操作总能够成功,但是不能够回溯位于该操作左边的子句。Cut操作被广泛的用于减掉不希望回溯的分支,例如,避免找到程序不需要的额外的答案和避免额外的计算。

应当保守的应用cut操作,当程序不正确会有一种诱惑来插入cut来检验cut能否让程序正确。如果一个测试是不必须的因为有cut来保证这是真的,那么最好在合适的地方加上注释说明这一点。

Cut被某些人认为是有争议的逻辑程序控制方式[1],因为该操作是因为效率问题被加入的而且不是一个Horn clause.

Cut的类型

[编辑]

Green cut

[编辑]

如果一个cut操作只是为了提高性能,那么它就被称为green cut,例如:

 gamble(X) :- gotmoney(X),!.
 gamble(X) :- gotcredit(X), \+ gotmoney(X).

上述操作被称为green cut操作符。!只是简单的告诉Prolog解释器停止寻找其他的答案。但是你会注意到如果gotmoney(X)子句失败的话,那么解释器将会检查第二条规则。第二个规则中的gotmoney(X)似乎显得多余,因为只有当第一个规则失败的时候,第二个规则才会被查看,但是,显式地写上 \+ gotmoney(X),你就能确保第二个规则总是能正确地工作,即使在第一条规则被恰巧移除或改变的情况下也是正确的。

Green cut的目的是让程序变的效率更高,而不会改变程序的输出。

Red Cut

[编辑]

如果一个cut操作不是green的,那么它就是red cut,例如:

 gamble(X) :- gotmoney(X), !.
 gamble(X) :- gotcredit(X).

那么程序的运行结果将依赖于cut操作符的位置和关联子句的顺序,这些将决定这个程序的含义。如果任何情况下地一个关联子句被移除了(例如,剪切粘贴的时候的错误),第二个子句将不会表达和上述green cut例子中一样的意思,因为该子句将不能保证 \+ gotmoney(X)


参考资料

[编辑]
  1. ^ Foundations of Logic Programming, Springer (1984).