Prolog Cut & Fail (Kesme ve Başarısızlık )

Cut (kesme)

Cut ‘! ‘ karakteri ile gösterilir.  Prolog alternatif çözümleri bulmak için geriye dönerek arama yapar (baktracting). Cut  alternatif çözüm arayışını durdurur. Örneğin; 1-3 kademesinde verilen rakamı yazıyla yazdırmak için aşağıdaki program yazılabilir:

            yaz(1) :-  write(‘bir’).

            yaz(2) :-  write(‘iki’).

            yaz(3) :-  write(‘üç’).

            yaz(X) :- X<1, write(‘Sınır dışı’).

            yaz(X) :- X>3, write(‘Sınır dışı’).

Bu program doğru çalışır ama herhangi bir X değeri için tüm satırlara bakılır.  Yani tüm alternatifler gözden geçirilir.  İstenen satır işlem gördükten sonra diğer satırlara bakılmaması Cut ile sağlanabilir:

yaz(1) :-  !, write(‘bir’).

            yaz(2) :-  !, write(‘iki’).

            yaz(3) :-  !, write(‘üç’).

            yaz(_) :- write(‘Sınır dışı’).

Burada arguman 1 ise ekrana “bir” yazar ve diğer cümlelere bakılmaz.  write yüklemi alternatif çözümler üretmediği yalnız bir değer yazdığı için deterministiktir.  Kesme işaretinin deterministik yüklemden önce veya sonra olması farketmez.

İki sayıdan büyük olanını veren max(X,Y,Z) yüklemi aşağıdaki gibi tanımlanabilir:

            max(X,Y,X) :- X>=Y.

            max(X,Y,Y) :- X<Y.

X ve Y değerlerine bağlı olarak bu kurallardan biri başarılı diğeri başarısız olacaktır. Eğer birinci kural başarılı ise alternatif çözüm için ikinciye bakmak gereksizdir.  Bu nedenle kesme isembolu kullanılarak program aşağıdaki şekilde tekrar yazılabilir:

            max(X,Y,X) :- X>=Y, !.

            max(X,Y,Y).

X>=Y olduğunda birinci kural işlem görür ve kesme sembolu diğer max yüklemlerine bakılmasını engeller.

Fail (başarısızlık)

Prolog verilen soruya cevap bulmak için arama yapar ve cevabı bulursa ekrana yazar.  Bulamazsa yani başarısız (fail) olursa geriye dönerek varsa alternatif çözüm yollarını dener. Aşağıdaki programı gözönüne alalım:

hayvan(kus).

hayvan(kedi).

hayvan(aslan).

yaz: hayvan(X), write(X), nl.

Programı yükleyip yaz dediğimiz zaman prolog sadece kuş yazar.  Eğer geri dönerek olası tüm çözümleri yazmasını istersek fail kullanarak kuralı aşağıdaki şekilde yazabiliriz:

yaz: hayvan(X), write(X), nl, fail.

Fail prologa başarısız olduğunu başka bir çözüm bulmasını söyler.  Böylece prolog tüm olasılıkları denemek zorunda kalır.  Bakılacak çözüm kalmadığında program başarısızlıkla “no” yazıp durur.  Eğer programın bu işlemlerden sonra başarı olduğunu belirtmek istiyorsak son satıra “yaz” ekleyerek programın “yes” ile sonlanmasını sağlayabiliriz:

hayvan(kus).

hayvan(kedi).

hayvan(aslan).

yaz: hayvan(X), write(X), nl, fail.

            yaz.