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