Cut (逻辑编程)

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

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

Cut被某些人认为是有争议的逻辑程序控制方式，因为该操作是因为效率问题被加入的而且不是一个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)。

参考资料 

逻辑编程