Wytnij (programowanie logiczne)
Cięcie w Prologu jest celem zapisanym jako
! , co zawsze się udaje, ale nie można go cofnąć. Cięć można użyć, aby zapobiec niepożądanemu cofaniu się , które może dodać do zapytania niepożądane rozwiązania i/lub narzut związany z przestrzenią/czasem.
Cięcia należy używać oszczędnie. Chociaż nacięcia można wstawiać do kodów zawierających błędy, to jeśli test jest niepotrzebny, ponieważ nacięcie gwarantuje, że jest to prawda, dobrą praktyką jest umieszczenie tego w komentarzu w odpowiednim miejscu.
Niektórzy programiści nazywają to wycięcie kontrowersyjnym narzędziem kontrolnym, ponieważ zostało ono dodane wyłącznie ze względu na wydajność i nie jest klauzulą Horna .
typy
Zielone cięcie
Stosowanie cięcia, które tylko poprawia wydajność, określane jest jako zielone cięcie. Zielone cięcia służą do zwiększania wydajności programów bez zmiany danych wyjściowych programu. Na przykład:
hazard ( X ) :- mam pieniądze ( X ),!. hazard ( X ) :- mam kredyt ( X ), \+ mam pieniądze ( X ).
Nazywa się to operatorem zielonego cięcia . ! każe tłumaczowi przestać szukać alternatyw; jeśli jednak gotmoney(X)
zawiedzie, sprawdzi drugą regułę. Chociaż sprawdzanie gotmoney(X)
w drugiej regule może wydawać się zbędne, ponieważ pojawienie się Prologu zależy od wcześniejszego niepowodzenia gotmoney(X)
, w przeciwnym razie druga reguła nie byłaby oceniana w pierwszej kolejności. Dodanie \+ gotmoney(X)
gwarantuje, że druga reguła zawsze będzie działać, nawet jeśli pierwsza reguła zostanie przypadkowo usunięta, zmieniona lub przeniesiona po drugiej.
Czerwone cięcie
Cięcie, które nie jest zielonym cięciem , jest określane jako czerwone cięcie , na przykład:
hazard ( X ) :- mam pieniądze ( X ),!. hazard ( X ) : - dostałem kredyt ( X ).
Właściwe umieszczenie operatora cięcia i kolejność reguł są wymagane do określenia ich logicznego znaczenia. Jeśli z jakiegokolwiek powodu pierwsza reguła zostanie usunięta (np. przez przypadek ) lub przeniesiona po drugiej, druga reguła zostanie złamana, tj. nie będzie gwarantować reguły \+ gotmoney(X)
.