სასრული მანქანა

**სასრული მანქანა** ან სასრული ავტომატი — კომპიუტერული მეცნიერებების მათემატიკური მოდელი, რომელიც გამოიყენება როგორც კომპიუტერულ პროგრამებში, ასევე ალგორითმებსა და სხვადასხვა ლოგიკური სქემებში. ეს არის აბსტრაქტული მანქანა რომელსაც გააჩნია მდგომარეობები (states). ავტომატი არის მოცემულ დროს შესაბამის მდგომარეობაში. ის შეიძლება გადავიდეს ერთი მდგომარეობიდან მეორეში გარკვეულ დროს და ამას ეწოდება გარდამავლობა.

სასრული ავტომატების მოდელების გამოყენებით შესაძლებელია სხვადასხვა, უამრავი პრობლემების გადაჭრა, რომელთა შორისაა კომუნიკაციის პროტოკოლის დიზაინი, ენის დამუშავება (parsing) და სხვა საინჟინრო პროგრამები. ასევე დიდი გამოყენება აქვს ბიოლოგიისა და ხელოვნური ინტელექტში.

სასრული ავტომატის აბსტრაქტული მოდელი არის შედარებით სუსტი და არ გააჩნია ისეთივე შესაძლებლობა, როგორიც აქვთ სხვა მოდელებს, მაგალითად, ტურინგის მანქანას. უფრო რომ დავაზუსტოთ, არსებობს ამოცანები, რომელიც არ შეუძლია ამოხსნას სასრულმა ავტომატმა, მაგრამ ეს შეუძლია ტურინგის მანქანას, გამომდინარე იქიდან, რომ სასრულ ავტომატს აქვს შეზღუდული მეხსიერება.

## **მაგალითი: ტურნიკეტი** 
right

ტურნიკეტს აქვს ძალიან მარტივი მექანიზმი. მას გააჩნია სამი მოძრავი მხარი თანაბარ სიმაღლეზე. თავიდან არც ერთი არ მოძრაობს, ჩაკეტილ მდგომარეობაშია. როდესაც ხურდას ჩავაგდებთ მხარი გაიხსნება და აძლევს გამსვლელს საშუალებას დაატრიალოს 1/3-ით. ამის შემდეგ ტურნიკეტი ისევ დგება ჩაკეტილ მდგომარეოაბში და ელოდება ახალ გამსვლელს სანამ არ ჩააგდებს ხურდას.

ტურნიკეტს აქვს ორი მდგომარეობა(state): გახსნილი და დაკეტილი. მასზე მოქმედებს ორი შემავალი ინფორმაცია (input): ვაგდებთ ხურდას მხარი იხსნება, ხოლო დაკეტილი მდგომარეობაში კი არ რეაგირებს. ასევე არ აქვს მნიშვნელობა თუ რამდენჯერ მოხდება მხარის დატრიალება. როცა ხურდას ვაგდებთ, მანქანას შემავალი ინფორმაცია არის coin, ანუ დაკეტილიდან იცვლება გახსნილზე. ასევე გახსნილ მდგომარეობაში არ აქვს მნიშვნელობა დავამატებთ თუ არა ხურდას, ანუ დამატებითი ხურდა არც ცვლის მანქანის მდგომარეობას, ხოლო დატრიალების შემდეგ უბრუნდება ჩაკეტილ მდგომარეობას. ტურნიკეტის მანქანა შეიძლება წარმოვადგინოთ ცხრილის სახით: 

ეს ასევე შეიძლება წარმოვადგინოთ მიმართული გრაფით. თოთოეული მდგომარეობა იქნება გრაფის წვერო. წიბო გვიჩვენებს რომელი მდგომარეობდან რომელში გადადის.
ფაილი:Turnstile state machine colored.svg

## ** კლასიფიკაცია ** 
მანქანის მდგომარეობა შეიძლება დავყოთ ოთხ ძირითად სტადიად Transducers, Acceptors, Classifiers და Sequencers.
### **ენის მიღება და მისი ამოცნობა (Acceptors)** 
Acceptors - ანუ მიმღები სტადია, გვაძლევს ორ პასუხს დიახ ან არა, იმისდა მიხედვით იღებს თუ არა მანქანა შემოსულ ინფორმაციას (input). ყველა სასრული მანქანა ამბობს შესაძლებელია თუ არა შემოსული ინფორმაციის მიღება, როცა შემოსული ინფორმაცია პროცესირდება ანუ დასრულდება, თუ მანქანის მდგომარეობა არის მიმღები (accepting state,) მაშინ იღებს მოცემულ ინფორმაციას, წინააღმდეგ შემთხვევაში უარყოფს ანუ აკეთებს reject-ს. როგორც წესი შემოსული ინფორმაცია ეს არის სიმბოლოები. თვალსაჩინოებისთვის განვიხილოთ (სურათი 2) .
ფაილი:Fsm parsing word nice.svg

მანქანა გვიჩვენებს რომ იღებს მხოლოდ ერთ სიტყვას „nice”. ანუ მიმღები სტადია ეს არის მხოლოდ ნომერი 7.

მანქანას ასევე შეუძლია განსაზღვროს ენა, რომლის შემცველ ყველა სიტყვას იღებს და უარყოფს ყველა დანარჩენს რომელიც არ შედის ამ ენაში. ამ შემთხვევაში ჩვენ ვამბობთ რომ მანქანამ ეს ენა მიიღო. ყველა ენა რომელსაც სასრული მანქანა იღებს არის რეგულარული ენა - ენა არის რეგულარული თუ არსებობს რაღაც სასრული მანქანა რომელიც იღებს ამ ენას.
#### **დამწყები სტადია** 
დამწყები სტადია დიაგრამაზე გამოისახება მიმართული ისრით

#### **საბოლოო სტადია** 
მიმღები სტადია ან იგივე საბოლოო სტადია (final state or accepting state) გვაწვდის ინფორმაციას შემოსულ სტრინგზე და გვეუბნება, რომ ეს სტრინგი შედის თუ არა მოცემულ ენაში. ის ძირითად წარმოდგენილია ორი წრის საშუალებით. მაგალითისთვის განვიხილოთ დიაგრამა (სურათი 3):
ფაილი:DFAexample.svg 
დეტერმინისტული სასრული მანქანა ამოწმებს შემოსული ორობითი სტრიქონი შეიცავს თუ არა ლუწი რაოდენობის 0-ებს. 
S1 არის საწყისი მდგომარეობა, რომელიც გვიჩვენებს, რომ მოცემულ სტადიაში არის ლუწი რაოდენობის 0-ები. S1 ამასთანვე არის მიმღები სტადიაც. ეს მანქანა მიიღებს შემოსულ სტრიქონს მაშინ, როდესაც შემოსული ორობითი სტრიქონი შეიცავს ლუწ რაოდენობის 0-ებს (იღებს ასევე, თუ საერთოდ არ შედის 0). მაგალითად, ეს მანქანა მიიღებს შემდეგის სახის სტრიქონებს: 1, 111, 1111..., 00, 010, 1011101, და ა.შ.

### **დეტერმინისტული მანქანები** 
დეტერმინისტულ მანქანაში თითოეულ სტადიას აქვს მხოლოდ და მხოლოდ ერთი გადასვლა (transition) ყველა შესაძლო შემოსულ ინფორმაციაზე, ხოლო არა-დეტერმინისტულ მანქანაში, შემოსულმა ინფორმაციამ შეიძლება გამოიწვიოს ერთი ან ერთზე მეტი ან საერთოდ არანაირი გადასვლა მოცემული სტადიისათვის. განსხვავება უფრო თვალსაჩინოა პრაქტიკაში და არა თეორიაში. არსებობს ალგორითმი, რომლის საშუალებითც, ნებისმიერი არა-დეტერმინისტული მანქანა შესაძლებელია გარდაიქმნას უფრო რთულ დეტერმინისტულ მანქანაზე.

## **მათემატიკური მოდელი** 
ფორმალური განმარტება:
 დეტერმინისტული სასრული მანქანას შედგება ხუთი ძირითადი ნაწილისაგან (Σ, S, s0 ,δ , F) სადაც :
  
* ∑ არის შემომავალი ინფორმაცია ( რომელიც შედგება სასრული, არა ცარიელი სიმბოლოების სიმრავლისაგან)
* S ეს არის სასრული სტადიების სიმრავლე
* s0 საწყისი სტადია, რომელიც ეკუთვნის S-ს.
* δ სტადიების გარდამავლობის ფუნქცია : δ : S x ∑ −> S ( არა-დეტერმინისტული მანქანისთვის იქნება : δ : S x ∑ −> P(S)
* F არის საბოლოო სტადია, რომელიც ეკუთვნის S-ს.

როგორც დეტერმინისტულ ასევე არა-დეტერმინისტულ მანქანებში, ჩვეულებრივ δ არის ნაწილობრივი ფუნქცია ანუ *δ(Q,X)* არ არის განსაზღვრული Q Є S და X Є ∑ ამათი ყველა კომბინაციისათვის. თუ რაღაც სასრული მანქანა **M** არის Q სტადიაში, შემდეგი სიმბოლო არის X და δ(Q,X) არ არის განსაზღვრული, M მანქანა უარყოფს შემოსულ ინფორმაციას (ანუ მოცემულ input-ს აკეთებს reject-ს). ეს ნაკლებად გამოყენებადია როდესაც გვაქ მანქანის ტრანსფორმაცია, უფრო გამოიყენება ზოგად მანქანებში.

## იხილეთ აგრეთვე 
* https://en.wikipedia.org/wiki/Finite-state_machine
* http://www.icsd.aegean.gr/kaporisa/index_files/sipser.pdf