Mantıksal Programlama ile Kural Tabanlı Sorun Çözme Örneği

Programlama Paradigmaları

Mantıksal Programlama ile Kural Tabanlı Sorun Çözme Örneği

Programlama Paradigmaları
4 dk okuma süresi
Bu makale, mantıksal programlama paradigmasını ve Prolog kullanarak kural tabanlı bir problem nasıl modelleyip çözeceğinizi adım adım gösterir. Basit bir arıza teşhis örneği, çalıştırma adımları, tasarım kontrol listesi ve ileri düzey notlar içerir.
Mantıksal Programlama ile Kural Tabanlı Sorun Çözme Örneği

Mantıksal Programlama ile Kural Tabanlı Sorun Çözme Örneği

Mantıksal programlama, problemi kurallar ve gerçekler (facts) şeklinde tanımlayarak çıkarım (inference) yoluyla çözen bir yaklaşımdır. Bu yazıda mantıksal programlama kavramını, Prolog dilinin temel özelliklerini ve kural tabanlı bir sorunu Prolog ile nasıl modelleyip test edebileceğinizi pratik bir örnek üzerinden göstereceğim. Temel hedefimiz uygulamaya yönelik, adım adım bir kılavuz sunmaktır.

Mantıksal programlama nedir?

Mantıksal programlama, yazılım mantığını deklaratif bir şekilde ifade eder: ne yapılması gerektiğini (ne), nasıl yapılacağını (nasıl) değil, mantıksal ilişkilerle tanımlarsınız. Programlama öğeleri genellikle faktlar, kurallar ve sorgular olarak düzenlenir; bir çıkarım motoru bu bilgiden sonuç üretir (örnek bir kaynak için bakınız: HasCoding).

Prolog — kısa tanıtım

Prolog, mantıksal programlama paradigmalarında yaygın kullanılan bir dildir. Temel kullanım alanları bilgi temsil etme, kural tabanlı sistemler ve bazı yapay zeka uygulamalarıdır. Prolog’ın tarihçesi ve temel özellikleri hakkında kısa bir giriş için bkz. Index.

Kural tabanlı sistemler ve mantıksal programlama

Kural tabanlı sistemlerde kararlar kurallar aracılığıyla verilir; kurallar, koşul–sonuç çiftleri şeklindedir. Mantıksal programlama bu yapıya doğal uyar çünkü kurallar ve faktlar doğrudan dilin yapı taşları olarak kullanılır (buna dair genel bilgi: AppMaster). Prolog ile kural tanımları ve sorgular kullanarak sorunları çözmek mümkündür ve bu makale, bunu pratik bir örnekle gösterecek (ek teknik okuma için ayrıca bir örnek anlatım: Medium).


Pratik örnek: Prolog ile basit kural tabanlı arıza teşhisi

Aşağıdaki örnek, bir elektrikli lambanın farklı senaryolarda çalışıp çalışmadığını değerlendiren küçük bir kural tabanlı model sergiler. Amacımız: domain modelleme, kural yazımı ve sorgulamayla potansiyel arıza nedenlerini tespit etmektir.

lamp.pl adlı dosyaya koyulabilecek örnek Prolog kodu (açıklama satırları içerir):

% lamp.pl — senaryolu basit arıza teşhis örneği
% Senaryolar: s1 - her şey düzgün, s2 - switch kapalı

bulb_ok(s1).
power_on(s1).
switch_on(s1).
wiring_ok(s1).

bulb_ok(s2).
power_on(s2).
wiring_ok(s2). % s2'de anahtar kapalı, switch_on(s2) yok

% Lamba çalışması için tüm koşulların sağlanması gerekir
lamp_works(S) :- bulb_ok(S), power_on(S), switch_on(S), wiring_ok(S).

% Arıza nedenlerini belirleyici kurallar (negation-as-failure kullanımı)
lamp_broken_reason(S, bulb) :- \+ bulb_ok(S).
lamp_broken_reason(S, power) :- \+ power_on(S).
lamp_broken_reason(S, switch) :- \+ switch_on(S).
lamp_broken_reason(S, wiring) :- \+ wiring_ok(S).

Not: Prolog'da \+ operatörü "negation as failure" (başarısızlıktan türetilen olumsuzluk) anlamında kullanılır; bu, bir şeyin açıkça yanlış olduğundan değil, doğrulanamadığından dolayı olumsuz kabul edildiği anlamına gelir. Bu davranışa dikkat etmek gerekir çünkü veritabanındaki eksik bilgi farklı sonuçlara yol açabilir.

Örnek sorgular ve beklenen çıktı

?- lamp_works(s1). % s1 için tüm koşullar doğru
true.

?- lamp_works(s2). % s2'de switch_on(s2) yok
false.

?- lamp_broken_reason(s2, R).
R = switch.

Bu örnek iki senaryo ile nasıl farklı sonuçlar alabileceğinizi gösterir. Kural tabanlı yaklaşım, hangi faktların eksik olduğunu doğrudan raporlayarak teşhisi kolaylaştırır.

Çalıştırma ve test adımları (küçük rehber)

  • SWI-Prolog gibi bir Prolog yorumlayıcısı kurun: https://www.swi-prolog.org/.
  • Kod parçacığını lamp.pl olarak kaydedin.
  • Terminal/komut satırında swipl komutuyla Prolog kabuğunu açın veya doğrudan dosyayı yükleyin.
  • Kabuğa geçtikten sonra dosyayı yüklemek için: ?- [lamp]. veya ?- consult('lamp.pl'). yazın.
  • Sorgularınızı çalıştırın: ?- lamp_works(s1). veya ?- lamp_broken_reason(s2, R).

İleri düzey notlar ve tasarım ipuçları

  • Unification (terim eşleştirme) ve backtracking Prolog’un temel mekanizmalarıdır; kuralların yazımı sırasında bu mekanizmaları göz önünde bulundurun.
  • Negation-as-failure (\+) güçlüdür ama veritabanındaki eksik bilginin yanlış şekilde olumsuz kabul edilmesine yol açabilir; kritik durumlarda açık negatif fakları modellemeyi düşünün.
  • Prolog’da performans için kuralların toplanması, gereksiz genel kurallardan kaçınma ve tail recursion optimizasyonu gibi teknikler vardır. Büyük veri setlerinde indeksleme ve doğru fakt düzeni önem kazanır.
  • Kontrol operatörü (cut, !) kullanımı çözüm sayısını sınırlandırır; ancak mantığın değişmesine neden olabileceği için dikkatle kullanılmalıdır.

Tasarım rehberi: kısa kontrol listesi

  • Domaini küçük parçalara ayırın; her parça için açık faklar ve kurallar tanımlayın.
  • Her kural için beklenen giriş/çıkış durumlarını (örnek vakalar) yazılı testlerle kontrol edin.
  • Negatif durumları nasıl modellendiğinizi belgeleyin (eksik bilgi mi yoksa doğrulanmış negatif mi).
  • Kuralları modüler tutun; tekrar eden mantığı alt kurallara taşıyın.
  • Performans gereksinimi varsa, gerçek dünya verileriyle erken test yapın.

Yaygın tuzaklar

  • Çok genel kurallar: Örnekleri gereğinden fazla kapsayan kurallar beklenmedik sonuçlara yol açabilir.
  • Sonsuz rekürsiyon: Özellikle rekürsif kurallarda çıkış koşullarını açıkça tanımlayın.
  • Negation kullanımı: \+ operatörünü eksik bilgiyle karıştırmayın; gerekiyorsa açık negatif faklar ekleyin.

Sonuç

Mantıksal programlama, kural tabanlı sorun çözmede güçlü ve açıklanabilir bir yaklaşımdır. Prolog örnekleriyle küçük bir arıza teşhis sistemi kurarak kuralların nasıl çalıştığını, sorguların nasıl yürütüldüğünü ve olası hataların nasıl tespit edileceğini gördük. Bu yaklaşım, bilgi temelli sistemler, uzman sistemler ve bazı yapay zeka uygulamaları için uygundur; ancak uygulama öncesi domain modellemesi ve test takibi önemlidir (bakınız: HasCoding, Index).


Kaynaklar ve ileri okumalar