Cut (邏輯編程)

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).