Конечный автомат (ДКА).

| Нет комментариев | Нет трекбэков

Возможно многие слышали о детерминированных конечных автоматах. Это интересная тема, и я хотел бы изложить ее в виде небольшого и очень простого скрипта на perl, демонстрирующего принцип конечного автомата.

Итак, два основных понятия, которые важны при рассмотрении конечного автомата:

1. Состояние

2. Входные символы

Напомню что:

Детерминированным конечным автоматом (ДКА) называется такой автомат, в котором для каждой последовательности входных символов существует лишь одно состояние, в которое автомат может перейти из текущего.

И в качестве примера рассмотрим модель: вопрос - ответ. То есть наш автомат может находиться только в одном из этих стостояний: поиск ответа или получение вопроса.

При получении вопроса - автомат переходит в состоянии поиска ответа, выдает ответ на терминал и снова переходит в состояние ожидания вопроса. Входными символами в нашем примере будет какое-либо слово или фраза, по которой автомат будет искать ответ.


   1    #!/usr/bin/perl -w
   2    #
   3    use strict;
   4    
   5    # бесконечный цикл
   6    while(1) {
   7    state_answer(state_quest());
   8    }
   9    # состояние ожидания вопроса
  10    sub state_quest {
  11    print "\n> ";
  12    my $line=<STDIN>;
  13    chomp($line);
  14    exit 0 if $line=~/^exit/i;
  15    return $line;
  16    }
  17    # состояние поиска ответа
  18    sub state_answer {
  19        my $quest=shift;
  20        # ответы ищем в текстовом файле
  21        open(FILE,"<","base.txt") || die "$!\n";
  22        while(<FILE>) {
  23            chomp;
  24            print and return if /$quest/ig;
  25        }
  26    }

При получении в качестве вопроса команды exit - завершаем программу.

Теперь собственно зачем я это пишу - модель ДКА может очень пригодится в разработке. Особенно полезна она для обработки большого потока входных данных, и зачастую гораздо выигрышней модели с использованием threads (потоков), но из-за некоторой теоретической сложности зачастую отпугивает начинающих программистов.

Приведенный пример можно легко переложить на сервер обслуживающий подключения клиентов, у него два состояния: получение запроса - отдача контента.

Кстати, известный nginx работает как раз по этому принципу ;-)

 

 

Нет трекбэков

URL для трекбэков: http://perlmonks.org.ru/cgi-bin/MT/engine/mt-tb.cgi/20

Комментировать

Об этой записи

Сообщение опубликовано 24.05.2009 20:43. Автор — Monks.

Предыдущая запись — CGI::FormBuilder, Excel::Template, etc...

Следующая запись — Шаблоны с обратным вызовом. Reverse Callback Templating

Смотрите новые записи на главной странице или загляните в архив, где есть ссылки на все сообщения.

Страницы


 


 

Page copy protected against web site content infringement by Copyscape