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)。
參考資料
[編輯]- ^ Foundations of Logic Programming, Springer (1984).