Süni İntellekt (Sİ)

  Süni İntellekt (Sİ) (ing. Artificial Intelligence (AI)) — maşınların (qurğu və cihaz) insan zəkasını simulyasiya etməsidir. Belə maşınlar elə proqramlaşdırılır ki, insan kimi düşünə, onun davranışlarını təqlid edə bilsinlər.

süni_intellekt

   Sİ ilə işləyən maşınlar nitq tanıma, öyrənmə, planlama, problem həll etmə kimi mürəkkəb işlərin öhdəsindən gəlməyi bacarır. Süni İntellektin ideal xüsusiyəti onun rasional davranması və qarşıya qoyulan konkret məqsədə çatmaq üçün doğru qərar qəbul etməsidir.

Süni İntellekt iki əsas kateqoriyaya bölünür:

  • Dar Süni İntellekt: İnsan zəkasının simulyasiyası olan və bəzən “Zəif Sİ” adlandırılan DSİ dar kontekstdə fəaliyət göstərir. DSİ konkret halda götürülmüş tək bir işin öhdəsindən məharətlə gəlməyi bacarsa da, insan zəkasının potensialından çox uzaqdır.
  • Ümumi Süni İntellekt: Bəzən “Güclü Sİ” də adlandırılan ÜSİ insan zəkasına yaxın intellektə sahib olan maşınlardır. Onların öz “ağıllarından” istifadə edərək istənilən problemi həll etmə qabiliyətləri vardır. Fantastik filmlərdən bizə tanış gələn robotlar ÜSİ ilə işləyirlər.

 

Proqram Xətası

  Proqram Xətası (ing. Software Bug) — kompüter proqramı və ya sistemdə baş verən xətadır. Bu cür xətalar yanlış və ya gözlənilməyən/nəzərdə tutulmayan nəticələrə gətirib çıxarır.

   İngilis dilində bug sözü həm də böcək mənasını verir. Amerikalı mühəndislər bir əsrdən çoxdur ki, maşındakı kiçik qüsurları “böcəklər” adlandırırlar. Tomas Edison 1870-ci illərdə elektrik dövrələrindəki nöqsanlardan “böcək” olaraq bəhs edirdi.

   Hesablama texnologiyasında bu terminin istifadəsi və məşhurlaşması 9 Sentyabr 1947-ci ildə baş verən bir hadisəylə bağlıdır. Amerikalı riyaziyyatçı və kompüter proqramçısı Grace Hopper və onun komandası Mark II kompüteri ilə çalışarkən maraqlı bir hadisə baş verir. Kompüterin kontakt releləri arasında bir güvə ilişib qalır və sistemin dayanmasına səbəb olur. Komanda üzvləri hadisəni qeydə alır və Grace Hopper (sonradan ABŞ Hərbi Dəniz Qüvvələrinin kontr-admiralı olur) xanıma  xəbər verirlər. O da kompüterin qeydiyat jurnalında tarixə keçəcək bir qeyd yazır:

“Xətanın tapılmasının ilk faktiki hadisəsi” (“First actual case of bug being found.”)

NMAH2000-03035.jpg

   Bu hadisədən sonra bug sözü hesablama texnologiyasında termin halına gəlir. Xətaların tapılması və aradan qaldırılması prosesi sazlama (debugging) adlanır. Müasir kompüter sistemləri bir çox xətaların müəyyən edilməsi və avtomatik aradan qaldırılması imkanlarına malikdir.

Alqoritm

  Alqoritm (ing. Algorithm) — verilmiş məsələni həll etmək üçün dəqiq təyin olunmuş sonlu sayda qaydalar ardıcıllığıdır. Bu qaydalar kompüterdə realizə olunabilən instruksiyalardır. Alqoritm istənilən növ məsələnin həlli üçün tərtib oluna bilər.

   Günümüzdə hesablama texnologiyasında geniş istifadə olunan bu termin IX əsrin məşhur fars riyaziyyatçısı Məhəmməd İbn Musa əl-Xarəzminin (783-850) adıyla bağlıdır.

Muhammad ibn Musa al-Khawarizmi

   Təxminən 825-ci ildə Əl-Xarəzmi onu riyaziyyat aləmində məşhur edən “Əl-kitab əl-müxtəsər fi hesab əl-cəbr vəl müqabələ” adlı kitabını yazmışdır. Yeri gəlmişkən bu gün istifadə etdiyimiz cəbr sözü də bu alimin adıyla bağlıdır. Əl-Xarəzmi öz kitabında mövqeli say sistemi, bu sistemdə hesablama qaydaları haqqında məlumat verir və ilk dəfə sıfırdan (0) istifadə edir. XII əsrin ilk yarısında onun kitabı latın dilinə tərcümə olunaraq “Algoritmi de numero Indorum” adıyla Avropaya daxil olur. Beləliklə də onluq say sistemində hesab qaydalarını alqoritm adlandırırlar. Bu gün istifadə etdiyimiz alqoritm anlayışı isə məsələləri həll etmək üçün istifadə olunan qaydalar (hesabi və məntiqi əməliyyatlar) ardıcıllığını ifadə edir.

Alqoritmin xassələri

  1. Diskretlilik xassəsi. Hər bir alqoritm məsələnin həll prosesini sadə addımların yerinə yetirilməsi ardıcıllığı şəklində ifadə edir və hər bir addımın yerinə yetirilməsi üçün sonlu zaman fasiləsi tələb olunur, yəni başlanğıc verilənlərlə icra olunan hesabi və məntiqi əməliyyatların yerinə yetirilməsi və nəticənin alınması zamana görə diskret yerinə yetirilir.
  2. Müəyyənlik xassəsi. Hər bir alqoritm dəqiq, birqiymətli olmalıdır. Bu xassəyə əsasən alqoritm yerinə yetirildikdə istifadəçinin və onun istifadə etdiyi kompüterdən asılı olmayaraq eyni nəticə əldə edilməlidir.
  3. Kütləvilik xassəsi. Müəyyən sinif məsələnin həlli üçün qurulmuş alqoritm bu sinfə aid olan yalnız başlanğıc qiymətləri ilə fərqlənən bütün məsələlərin həllini təmin etməlidir. Məsələn, ax2 + bx + c = 0 kvadrat tənliyi üçün qurulmuş alqoritm a, b, c – nin ixtiyari qiymətləri üçün məsələni həll edir.
  4. Nəticəlilik və sonluluq xassəsi. Alqoritm sonlu sayda addımdan sonra başa çatmalı və verilmiş məsələnin həlli tapılmalıdır

Alqoritmin təsvir üsulları

  1. Mətn
  2. Blok-sxem
  3. Cədvəl
  4. Alqoritmik dil

Alqoritmin tipləri

  1. Xətti
  2. Budaqlanan
  3. Dövrü

Bernulli ədədlərini hesablayan alqoritm

   İngilis riyaziyyatçısı Ada Lavleys (1815-1852) tərəfindən tərtib olunan Bernulli ədədlərinin hesablanması alqoritmi kompüter üçün yazılan ilk proqram hesab olunur.

Diagram_for_the_computation_of_Bernoulli_numbers

   Ada xanımın özü də təbii olaraq insanlıq tarixinin ilk proqramçısı adını daşıyır. Onun Çarlz Bebbicin analitik maşını ilə bağlı gördüyü işlər gənc xanımı məşhur etmişdir.

Ada_Lovelace

   Ada Lavleysin adının əbədiləşdirilməsi məqsədilə proqramlaşdırma dillərindən birinə onun adı verilmişdir.

Kompilyator

  Kompilyator (ing. compiler) proqramlaşdırma dillərində yazılmış instruksiyaları (qaynaq kodu) maşın dilinə tərcümə edən proqramdır.

   İnterpretatordan fərqli olaraq kompilyator bütün qaynaq kodunu bir dəfəyə maşın  dilinə çevirərək obyekt modulunu meydana gətirir. Əldə edilən binar kod əməliyat sistemi tərəfindən icra olunur.

   Kompilyatorun işi aşağıdaki altı mərhələdən ibarətdir:

  • Leksik analiz
  • Sintaktik analiz
  • Semantik analiz
  • Aralıq kod generasiyası
  • Kod optimallaşdırması
  • Kod generasiyası

Kompilyatorun ümumi iş prinsipi aşağıda təsvir olunmuşdur:

kompilyator

Kompilyatorların müsbət cəhətləri:

  1. Kompilyasiya edilən proqramların daha sürətli çalışması.
  2. Əldə edilən binar kodun çalışması üçün kompilyatora ehtiyac qalmaması.

Kompilyatorların mənfi cəhətləri:

  1. Əməliyyat Sistemlərindən asılı olması.
  2. Dəyişikliklər zamanı yenidən kompilyasiyaya ehtiyacın olması.

İnterpretator

   İnterpretator (ing. interpreter) proqramlaşdırma və ya skript dillərində yazılmış instruksiyaları (qaynaq kodu) aralıq dilə tərcümə edib sonra icra edən proqramdır.

   Kompilyatordan fərqli olaraq interpretator bütün qaynaq kodunu bir dəfəyə maşın  dilinə çevirərək obyekt modulunu meydana gətirmir. İnterpretator qaynaq kodunu sətir-sətir translasiya edərək icra edir.

İnterpretatorun ümumi iş prinsipi aşağıda təsvir olunmuşdur:

interpretator

İnterpretatorların müsbət cəhətləri:

  1. Əməliyyat Sistemlərindən asılı olmaması.
  2. Dəyişikliklər zamanı yenidən kompilyasiyaya ehtiyacın olmaması.

İnterpretatorların mənfi cəhətləri:

  1. Proqramın çalışması üçün kompüterdə interpretatorun olması.
  2. İşləmə sürətinin nisbətən aşağı olması.

Sətrin açılması

   Latın əlifbasının böyük hərflərindən ibarət sətirə baxacağıq. Məsələn: AAAABCCCCCDDDD. Bu sətirin uzunluğu 14-ə bərabərdir. Burada təkrarlanan simvollar silinərək  həmin simvolların təkrarlanma sayını göstərən ədəd və bu simvolun özü ilə əvəz edilir. Yuxarıda verilmiş sətir 4AB5C4D kimi göstərilə bilər. Təsvir edilən metodu  sətirlərin yığılması adlandıracağıq.

setrlerin-acilmasi

   Yığılmış sətiri götürərək,  onun ilkin sətirini bərpa edən proqramı tərtib edin.

Giriş verilənləri

   Giriş verilənləri bir yığılmış sətirdən ibarətdir. Həmin sətirlərin maksimum uzunluğu 80-i aşmır.

Çıxış verilənləri

  Bərpa edilən sətir.

Nümunələr
Giriş verilənləri Çıxış verilənləri
3A4B7D AAABBBBDDDDDDD
12AB AAAAAAAAAAAAB

   Proqramı özünüz tərtib etməyə çalışın. Əgər alınmasa, aşağıdakı həll ilə tanış olun.

setrlerin_acilmasi

Rekursiyalar

   Biz artıq bilirik ki, bir funksiya öz daxilində başqa funksiyanı çağıra bilər. Amma bilməmiz gərəkən daha bir şey var: funksiya özü özünü də çağıra bilər. Proqramlaşdırmada funksiyaların özü özünü çağırmasına rekursiya, bu cür funksiyalara da rekursiv funksiyalar deyilir.

   Gəlin verilmiş ədədin faktoriyalını (n!) hesablayan kiçik bir funksiya hazırlayaq. Riyaziyyatdan da bildiyiniz kimi n ədədinin faktorialı 1-dən n-ə qədər (daxil olmaqla) natural ədədlərin hasilinə bərabərdir. Məsələn, 5!=5*4*3*2*1. Və o da məlumdur ki, 1!=1 və 0!=1. Buradan belə bir məntiq yürütmək olur ki, n! hesablamaq üçün n*(n-1)! hesablamalıyıq, yəni 5!=5*4!. Belə olan halda 4! üçün 4*3!, 3! üçün 3*2!, 2! hesablamaq üçün də 2*1! hesablanmalıdır. 1! isə 1-ə bərabər olduğuna görə rekursiya burada bitmiş olur.

   O zaman rekursiv funksiya aşağıdakı kimi olacaq:

>>> def fakt(n):
        if n<=1:
                return 1
        else:
                return n*fakt(n-1)


>>> fakt(5)
120
>>>

   Rekursiv funksiyalardan istifadə edərkən diqqət etmək lazımdır ki, sonsuz rekursiya alınmasın. Adətən sonsuz rekursiyalara gətirib çıxaran aşağıdakı iki səbəb olur:

  1. Rekursiyadan çıxışın düzgün təşkil edilməməsi. Məsələn, yuxarıdakı faktorial funksiyasında if n<=1 şərti verilməsəydi, rekursiya mənfi ədədlərə doğru sonsuz şəkildə davam edərdi.
  2. Rekursiv çağırışda parametrlərin düzgün verilməməsi. Məsələn, əgər fakt(n) funksiyası fakt(n-1) əvəzinə elə fakt(n) funksiyasını çağırsaydı, yenə də sonsuz rekursiya alınardı.

   Gəlin daha bir misal işləyək. Verilmiş a ədədini n qüvvətinə yüksəldən funksiya təyin edək:

>>> def power(a,n):
        if n==1:
                return a
        else:
                return a*power(a,n-1)


>>> power(2,4)
16
>>> power(8,3)
512
>>>

 Biz ən başda qeyd etdik ki, rekursiv funksiyalar özü özünə müraciət edən funksiyalardır. Amma bu müraciətlərin sayı (rekursiyanın dərinliyi) sonsuz ola bilməz. Hətta səhvən sonsuz rekursiya təşkil etsək belə praktiki olaraq funksiya sonsuz sayda icra olunmayacaq. Rekursiyanın dərinliyi ilə bağlı aşağıdakıları bilmək vacibdir:

  1. Rekursiyanın dərinliyinə məhdudiyyət qoyulmuşdur. Default olaraq (susmaya görə) rekursiv funksiya 1000 dəfə özü özünə müraciət edə bilər. 
  2. Bu məhdudiyyət sys.setrecursionlimit() funksiyasından istifadə edilməklə dəyişdirilə bilər. Cari limitə baxmaq üçün isə sys.getrecursionlimit() funksiyası çağırılmalıdır.
  3. Buna baxmayaraq rekursiyanın dərinliyi əməliyyat sistemi tərəfindən təyin olunan stekin ölçüsü ilə məhdudlaşdırılır.

  Son olaraq onu da deyək ki, rekursiv funksiyalar ümumilikdə proqramın məhsuldarlığını azaltdığı üçün onlara yalnız zərurət halında müraciət etmək lazımdır.

Məntiq operatorları

   Yuxarıda qeyd etmişdik ki, nəticəsi doğru (True) və ya yalan (False) olan ifadələr məntiqi ifadələrdir. Biz sadə məntiqi ifadələrdən xüsusi məntiqi birləşdiricilərin köməyilə daha mürəkkəb məntiqi ifadələr əldə edə bilərik. Bu məntiqi birləşdiricilərə məntiq operatorları deyilir. 

   Python proqramlaşdırma dilində məntiq operatorları kimi and (və), or (və ya) və not (deyil) operatorlarındn istifadə olunur. 

   Sadə məntiqi ifadələrin məntiq tipində nəticəsi (qiyməti) olduğu kimi, mürəkkəb məntiqi ifadələrin də məntiqi nəticəsi (qiyməti) vardır. Mürəkkəb məntiqi ifadələrin nəticəsi onu təşkil edən sadə məntiqi ifadələrin nəticələrindən (qiymətlərindən) və bu ifadələri birləşdirən məntiqi birləşdiricilərin növündən, yəni istifadə olunan məntiq operatorundan asılıdır. 

  Gəlin bu dediklərimizi aşağıdakı cədvəllərdə göstərək:

ifadə1 ifadə2 ifadə1  and  ifadə2  ifadə1  or  ifadə2
 False  False  False  False
 False  True  False  True
 True  False  False  True
 True  True  True  True
ifadə not  ifadə
 False  True
 True  False

   Riyaziyyatda bu cədvəllərə doğruluq cədvəlləri deyilir. Birinci cədvəldən də gördüyünüz kimi ifadə1 and ifadə2 mürəkkəb məntiqi ifadəsinin qiyməti yalnız o halda True (doğru) olur ki, onu təşkil edən ifadə1ifadə2 eyni zamanda True qiymətini almış olsun, qalan digər hallarda  isə mürəkkəb məntiqi ifadənin qiyməti False (yalan) olur. 

   Yenə birinci cədvəldən aydın olur ki, ifadə1 or ifadə2 mürəkkəb məntiqi ifadəsinin qiyməti o halda True (doğru) olur ki, onu təşkil edən ifadə1 ifadə2 ifadələrindən heç olmazsa biri True qiymətini almış olsun, qalan yeganə halda (hər ikisi False olduqda)  isə mürəkkəb məntiqi ifadənin qiyməti False (yalan) olur.

   İkinci cədvəldə göstərilən not (məntiqi inkar, deyil) operatoru verilmiş məntiqi ifadənin inkarını əldə etməyə imkan verir. Əgər ifade qiymət olaraq True almışsa, o zaman not ifade bizə False qiymətini verəcək. Eyni qayda ilə əgər ifade qiymət olaraq False almışsa, bu zaman da not ifade bizə True qiymətini verəcək. Burad diqqət yetirsəniz görərsiniz ki, not operatoru yalnız bir ifadə ilə işləyir. Belə operatorlara unar operator deyilir. 

   İndi isə məntiq operatorlarını misallar üzərində nəzərdən keçirək:

>>> a=5
>>> b=10
>>> c=2.5
>>> p="Bakı"
>>> a>3 and b<=15 True >>> p=="Bakı" or p=="bakı"
True
>>> not c==2.5
False
>>>

   Yuxarıdakı misallara bənzər sadə məntiqi ifadələrdən müxtəlif kombinasiyalı mürəkkəb məntiqi ifadələr qurun və proqramını yazaraq sınaqdan keçirin. Alınan nəticələri doğruluq cədvəlləri ilə yoxlayın.

Üzvlük operatorları

   Bir qiymət və ya dəyişənin verilmiş ardıcıllıq (sətir, siyahı və kortej) və ya kolleksiyanın (çoxluq və lüğət) üzvü olub-olmadığını yoxlamaq üçün üzvlük operatorlarından istifadə olunur. Python proqramlaşdırma dilində iki üzvlük operatoru mövcuddur: in (daxildir) və not in (daxil deyil):

Gəlin aşağıdakı misalları nəzərdən keçirək:

>>> s = "Dərbənd"
>>> z= [1, 2, 3]
>>> k= ('a', 'b', 'c', 'd', 'e')
>>> f = "bənd"
>>> n = 4
>>> t = 'g'
>>> f in s
True
>>> n in z
False
>>> t not in k
True
>>>

   Gördüyünüz kimi, əgər dəyişənin aldığı qiymət ardıcıllıqda tapılırsa ifadənin nəticəsi True, əks halda False olur.

Pünhan babanın yaşı

   Havası təmiz, günəşi bol olan bir şəhərdə 13 yaşlı Adil yaşayır. Adilin xətrini dünyalar qədər istədiyi Pünhan adlı babası var. Günlərin bir günü Adil babasından yaşını soruşur. Pünhan baba deyir lki, mənim yaşım 40-dan az deyil. Amma sənə yaşımı deməyəcəm, gərək özün tapasan. Bununla belə sənə bir ipucu verə bilərəm.

Punhan Baba

   Mənim yaşım natural bir ədəddir. Amma cüt və ya tək olduğunu da deməyəcəm. Əgər yaşım cütdürsə, onu 2-yə böl, təkdirsə ona 1 əlavə et. Əldə etdiyin nəticə üzərində yenə eyni əməliyyatları icra elə, ta ki 1 alınana qədər. Yerinə yetirdiyin bu əməliyyatların sayı sənin yaşına bərabər olacaq. Artıq mənim yaşımı tapa bilərsən.

   Pünhan baba həm də Adilə söz verdi ki, əgər yaşını tapa bilsə, ona maşın sürməyi öyrədəcək. Adilə babasının yaşını tapmaqda kömək edin.

Giriş verilənlərinin formatı

   Tək sətirdə Adilin yaşı olan 13 ədədi verilir.

Çıxış verilənlərinin formatı

   Pünhan babanın yaşını tək sətirdə çap etmək lazımdır.

   Proqramı özünüz tərtib etməyə çalışın. Əgər alınmasa, aşağıdakı həll ilə tanış olun.

Punhan_Baba