YAPAY ZEKA
Yapay zeka ile ilgili en önemli problem herkes için farklı bir şey ifade etmesi. Yapay zeka tanımımız netleştikçe ondan beklentilerimizin değişmesi de doğaldır. Burada daha çok belli bir dil üzerinde duracağım. LISP, bu dil yapay zekanın gelişmesinde temel rolü oynayan dildir. Yapay zeka uygulamaları için uygun başka diller, örneğin MicroPROLOG ve hatta işletim sistemleri, örneğin VAX ve PDP bilgisayarları için SmallTalk var ama bunların tümü LISP'in türevleri sayılabilir. LISP bir zıtlıklar dilidir. İlk akademik dillerden biri olarak hâlâ önünde uzanan bir gelecek var ve iyi bir uzman sistem oluşturucusu olarak parlak geçmişi nedeniyle yapay zeka dünyasıyla iç içe. LISP'in, yetmişli yıllarda tam bir mainframe derleyicisi (compiler) olarak tamamlandığından beri popülaritesi arttı. Beşinci kuşak bilgisayarların tasarımına dökülen kucak dolusu paradan ötürü, önümüzdeki beş yıl içinde, bir uzman sistemle bugün kelime işlemcileri ile olduğu kadar haşır neşir olmamız oldukça yüksek bir olasılık. Yapay zekanın bazı ticari uygulamaları şimdiden yaygınlık kazanmış durumda. Fabrikada, çalışmanın yoruculuğunu ve sıkıcılığını hava ve ısı akımını ayarlayarak azaltıyorlar örneğin. Bir doktor beyin patolojisi üzerinde tüm bilgisini LISP'i bir ön işlem paketi olarak kullanarak bir uzman sistemine geçirdi. Her gün bu çeşit uygulamaları çevremizde görmemiz mümkün. Aynı silikon devriminde olduğu gibi, yapay zeka da gözlerimizin önünde yavaş
Mary Branscombe yavaş gelişmeyi sürdürüyor. Micro'da LISP O halde micro temeli LISP uygulamaları devreye nereden giriyor? Üstüne üstlük, hızla gelişen bir bilgisayar bilimi alanında, bir dilin mikro bilgisayar temelli bir versiyonu ne yapabilir? Oldukça çok şey. Yapay zekayı incelemek için, dış dünyaya bakışımızı, “zeka” sahibi şeylere yaklaşımımızı ele almak zorundayız. Bir insanın kafasındaki zeka kavramı bir diğerininkiyle çakışmayabilir. Bazı insanlar bilgisayarın satrançta bir hamle yapabilmesini zeka göstergesi sayarken, bazıları da bunun hiçbir şey ifade etmediğini savunmaktadır. İşin aslı bir bilgisayarı satrançta bir uluslararası ustayı yenebilecek şekilde programlamanın mümkün olduğu! MicroPROLOG yapay zekada kullanılan diğer bir dil. LISP ile aynı programlama yapılarına sahip, yani yüklem mantığı olarak adlandırılan bir mantık sistemini kullanır. Buna karşılık, PROLOG Pascal ve Comal gibi dillerde tanıdığımız mantıksal programlama öncüllerine uygun olmakla birlikte, LISP konuya son derece yeni bir açıdan yaklaşmıştır. “Sembol manipülasyonu” kullanır ve bunun yapay zeka aleminde sınırsız uygulama alanları vardır. Birçok akıllı insanın düşüncesine göre, bizi zeki kılan yetenek, sembolleri algılayıp ortak bir faktör bulduktan sonra o sembolü başka bir şekilde temsil ve ifade edebilmemiz. Bunun diğer bir adı da öğrenebilme? “Güneş batıdan batıyor” gibi varsayımlarda bulunabilecek aşamaya geldiğimizde, bize verilen algı verilerine dayanarak, ya güneş dünyanın etrafında, ya da dünya güneşin etrafında dönüyor gibi postülalar ortaya atabiliriz. Bu sürece “yüklemsel (predicate) öğrenme” denir ve bilgisayar bilimi yolundaki en büyük engellerden biridir, çünkü sonra atacağımız adım araştırmamızı bir ya da başka bir doğrultuda sürükleyecektir. “Zeki makinayı” elde edebilmek için doğru seçimleri yapmalıyız. Bu tür öğrenme süreçlerinin tümden gelimsel süreçler ile mi olduğunu varsayıyoruz? (Öğrenmemiz ve akıl yürütmemiz bize karşılığında veri sunulan bir dizi soru aracılığıyla mümkün olmaktadır o zaman.) Diğer yandan çok miktarda sembolü manipüle edip bu informasyonu başka bir şekilde yeniden paketlemenin “zeka” göstergesi olduğunu varsayıyor muyuz?
Önemli Bir Sorun
LISP sembol manipülasyonuna yönelik bir bilgisayar dilidir. Alfanümerik karakterler gösterebilmek gibi bir yan özelliği vardır ve bu dille birisi bir arcade oyunu yazabilir ama asıl özelliği büyük veri akışlarını iş-
Gövdeler
LISP, Basic'ten yeni yapay zeka dilleri tarafından kullanılan bu bir dizi yüklem üzerine kurulmuş olmasıyla da ayrılır: (RENKLER (KIRMIZI BEYAZ MAVİ)) LISP bunların yazılması durumunda verdiğimiz veriyi aynen yazacaktır, ama tırnak işaretini kaldırırsanız LISP yorumcusu TANIMLANMAMIŞ hata mesajını verecektir. Değişkene SETQ denilen bir komutu kullanarak bir ad verebilirsiniz, bu değişkene BASIC dilindeki LET emri (statement) gibi bir değer verir.
SETO RENKLER '(KIRMIZI
BEYAZ MAVİ)
Görüldüğü gibi, değişkende depolanan değer, ya bir tırnak işaretini izleyen bir ifade ya da bir LISP fonksiyonuna referans olabilir. (Bu BASIC'te bir “komut” ya da “anahtar sözcük” olarak bilinir.) Değişkenin adını tırnak işareti olmadan girersiniz. SETQ emrinin verdiği değer oluşturulacaktır. Aynı microPROLOG'ta olduğu gibi, LISP programlama yöntemlerimize tamamıyla yeni bir yaklaşım getiriyor. Bu anlamda LISP ve microPROLOG arasında birçok benzerlik var, bu benzerlik dilin kendisini oluşturması sürecine kadar uzanıyor ama akış şeması kavramını programcılık ideolojimize aşıladığı “birbirini izleyen akış” düşüncesinden uzaklaşmamız gerekiyor. Bu yaklaşım BASIC, COMAL gibi dillerde hâlâ devam ediyor. Bir informasyon listesini düşünün? Onda en sonuncusu dışında birbirini izleyen bir dizi veri olur. LISP listeleri uzunluklarından bağımsız olarak aynı şekilde ele alınabilecek bir nesneler grubu olarak görmek yanlıştır. Listelerin bir seferde bir öğe aşılarak katedilebileceği düşüncesi son derece yararlı oluyor. Bunun yanısıra LISP tanımlayıcı ve rakamların listelere serbestçe karışmasına da olanak veriyor. Her şeyi pointer'larla halledebilmenin bir yolu bu. Listelere gelince, bu pointer'lar tek bir veri birimini saptayacaktır. Buna hücre denir ve her yarısı başka bir pointer içermektedir. Soldaki pointer (hücredeki ilk olan) depolanmış listedeki ilk öğeye götürür, sağdaki de geriye kalanı işaret eder. Böylece (A listesi için tablo şekil 1'de görülebilir. Böyle listeler alt listeler halinde düzenlenebilir ya da derinlemesine düşey olarak tasarlanabilir. Bunu şekil 2'de görebilirsiniz. Herhalde şimdiye kadar LISP'in neden bu kadar iyi bir genel amaçlı database oluşturma dili olduğu anlaşılmıştır. Çünkü bir database'te içkin olan tüm fonksiyonlar ve data yapıları yapısında mevcuttur.
Testler ve Karşılaştırmalar Bir fonksiyonu, tek bir çağırma ile, yapılaştırılmış informasyonun inşa edilebileceği, depolanabileceği ya da alınabileceği şekilde tanımlayabilmek
LISP'in genel bir özelliğidir. Dahası, bazı insanların “zeka” dediğini kullanma yeteneğine sahip fonksiyonlar yazılabildikten, yani bir fonksiyondan çıkan datayı tartışıp o bulgulara göre sonra ne yapılacağı konusunda karar verebilen bir işlem olduktan sonra çok daha ilginç programlar yazılabilir. Diğer bir deyişle, LISP veriler üzerinde testler ve aralarında karşılaştırmalar yapmaya ihtiyaç duyar. En yaygın testler olan EQ, ATOM ve NULL Boolean nicelikleri “doğru” ve “yanlışı” veren değerler çıkartır. Acornsoft LISP'te, NIL “yanlışı” temsil eder. Onun yanısıra, bir data yapısı diyagramının sonunda bulunan boş listeyi de temsil eder. “Doğru” bir fonksiyondan gelen datanın “yanlış” olmadığı her durum sayılmaktadır. Bu nedenle T sözcüğünü bu niceliği tescil etmek üzere kullanabiliriz. (Aynı şekilde F de yanlışı temsil edebilir.) “Doğru” değerler verdikleri düşünülen LISP fonksiyonları predicate (yüklem) olarak bilinir. Ama kullanım alanları, COND, özel fonksiyonunu kullanarak oluşturulan conditional (koşullu) ifadelerle birliktedir. Bu çeşit ifadelerin genel ifadesi şöyledir: (COND (yüklem 1 ifade 1) (yüklem 2 ifade 2))
Şekil 1: LISP data yapı diyagramı
(T son ifade) İstenilen çoklukta yüklem ifade çiftleri olabilir. LISP bir COND ifade bulduğunda, verili yüklemleri sırayla incelemeye başlar. Verdiği değer, ilk yüklemle “doğru” bir değer vermek üzere eleştirilen ifadenin değeridir. Önceki örnekte, Sabit T nihai yüklem olarak kullanılıyor. Bunun değeri her zaman “doğru” olduğuna göre, buna tekabül eden son ifade hata olarak görülebilir. O halde diğer tüm yüklemlerde çıkacak sonuç “yanlış”. O zaman, parantezler olmadan koşullu biçim şöyle okunabilir:
EĞER yüklem 1 “doğru” ise O ZAMAN ifade 1'in değerini ver YADA yüklem 2 “doğru” O HALDE en son ifadenin değerini ver LISP'in bileşik yüklemlere ihtiyacı olduğu zaman, AND ve OR kullanarak onları oluşturabilir. Bu fonksiyonların her biri belli sayıda argümanla baş edebilir. Normal mantık yasaları bir sonucu varmalarını sağlayana kadar, bu birer birer değerlendirirler. Böylelikle AND argümanları listenin sonuna gelene kadar (ve T verene kadar) ya da argümanlarından biri NIL değerini verene kadar değerlendirmeyi sürdürecektir. OR değerlendirmeyi bir NIL olmayan argüman bulur bulmaz durdurup T verecektir. LISP kodunun COND, AND, OR ve NOT gibi karmaşık yapılarını gerektiren parçaları en iyi daha küçük fonksiyonların grupları olarak yeniden yazılabilirler.
Micro Üzerinde LISP Sistemi LISP kullanarak bir dizi fonksiyon yazdığınızda, bir hata yapmanız elzemdir. En nihayetinde programcılığın keyifli yönlerinden biri de budur. LISP bir hatayla karşılaştığında şöyle şeyler olur. Ya yanıtlarınızdan hiçbir anlam çıkmayacak, (en kötü hata cinsi) ya da şanslıysanız bir hata mesajı ile birlikte kafa karıştırıcı bir dizi LISP ifadesi alacaksınız.
Bu ifade listesine “back trace” -geriye dönük tarama- denir ve debugging (hataları düzeltme) işleminde size yardımcı olması beklenmektedir, ama bazı LISP sistemleri listeyi hatanın ne olabileceği ve nerede olabileceği konusunda makul tahminler yapmakta kullanır. Bir hata mesajı aldıktan sonra yapılabilecek ilk şeylerden bir hatanın gerçekten bir hata mı yoksa beklenmeyen bir sonuç mu olduğuna bakmak; bir insan yanlış yorumlaması mı? Data yapı diyagramını kullanarak programın mantığını çıkarttıktan sonra, asıl iş başlar. LISP, bir hatayı bulabilmeyi, LISP fonksiyonlarına verilen tüm nicelikleri ve sonuçların dökümü alınabildiğinden ötürü verilen tüm değerleri inceleyebileceğiniz için, son derece kolaylaştırmıştır.
Bir fonksiyonun mantıksal tutarlılığını inceleyemeyeceğiniz tek zaman, fonksiyon giriş noktalarında ve bir döngü yapısından direkt olarak çıkmak gibi yeniden giriş yapılarında sorun çıktığı zamandır. (Yeniden giriş yapısına örnek olarak, bir FOR NEXT döngüsü içinde GOTO vermek sayılabilir.)
Bunların hiçbiri para etmediyse, denen fonksiyonu çağırmanın zamanı gelmiş demektir. Bu, karmaşık bir hesapta değerlerin fonksiyonlar arasında nasıl geçtiğini anlamak için kullanılabilir. Onu kullanmanın amacı yanlış sonuçlar veren tek bir fonksiyon saptamak olabilir. Eğer yanlış fonksiyon basit bir hataysa, hatayı düzeltmek kolay olacaktır. Save edin ve yeniden
Programı deneyin. Tüm bunlar da işe yaramazsa, programcıya kalan uzun bir gece boyunca masa başında ter dökmektir.