- •1 Описання формальної моделі алгоритма на основі рекурсивних функції
- •2 Описання аналітичної моделі алгоритму у вигляді елементарної машини тьюринга та композиції мт
- •3 Розробка аналітичної і програмної моделі алгоритму машини тьюринга, що розпізнає мову
- •4. Розробка аналітичної моделі алгоритму із використанням нормальних алгоритмів маркова
- •Додаток б
- •Додаток в
- •Додаток г
Додаток б
Лістинг програми
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, AdvEdit, Grids, AdvObj, BaseGrid, AdvGrid, ValEdit, Buttons,
Menus, ToolWin, ActnMan, ActnCtrls, ImgList, ComCtrls, AdvTrackBar,
DBAdvTrackBar, ExtDlgs, AdvGlowButton, AdvGlassButton, AdvSmoothTrackBar,Unit2;
type
TForm1 = class(TForm)
Tape: TAdvStringGrid;
StringGrid: TAdvStringGrid;
TapePopupMenu: TPopupMenu;
N1: TMenuItem;
N2: TMenuItem;
GroupBox1: TGroupBox;
GroupBox2: TGroupBox;
Alphabet: TAdvEdit;
StartState: TAdvEdit;
StatusBar1: TStatusBar;
GroupBox3: TGroupBox;
TrackBar: TTrackBar;
Label1: TLabel;
FinalState: TAdvEdit;
StringGrigPopupMenu: TPopupMenu;
N3: TMenuItem;
N4: TMenuItem;
N5: TMenuItem;
OpenTextFileDialog1: TOpenTextFileDialog;
ClearNSteps: TAdvGlowButton;
ChangeCurrent2: TAdvGlowButton;
ChangeCurrent1: TAdvGlowButton;
AddCommand: TAdvGlowButton;
RemoveCommand: TAdvGlowButton;
CrearStringGrigButton: TAdvGlowButton;
ReadFile: TAdvGlowButton;
CrearTapeButton: TAdvGlowButton;
ChangePosButton: TAdvGlowButton;
StartMT: TAdvGlowButton;
StepButton: TAdvGlowButton;
StopMT: TAdvGlowButton;
AdvEdit1: TAdvEdit;
AdvGlowButton1: TAdvGlowButton;
Button1: TButton;
AdvGlowButton2: TAdvGlowButton;
Memo1: TMemo;
AdvEdit2: TAdvEdit;
Memo2: TMemo;
procedure FormCreate(Sender: TObject);
procedure TapeKeyPress(Sender: TObject; var Key: Char);
procedure ChangeCurrPos(NewPos:integer);
procedure TapeClipboardBeforePasteCell(Sender: TObject; ACol, ARow: Integer;
var Value: string; var Allow: Boolean);
procedure StringGridClipboardBeforePasteCell(Sender: TObject; ACol,
ARow: Integer; var Value: string; var Allow: Boolean);
procedure N1Click(Sender: TObject);
procedure N2Click(Sender: TObject);
procedure ClearTape();
procedure ClearStringGrid();
procedure StartMTClick(Sender: TObject);
procedure DisableControls();
procedure StopMTClick(Sender: TObject);
procedure ChangePosButtonClick(Sender: TObject);
procedure Work(n:integer);
function InString(c:char;s:string):boolean;
procedure StepButtonClick(Sender: TObject);
procedure StringGridKeyPress(Sender: TObject; var Key: Char);
function GetWord(Str, Smb: string; WordNmbr: Byte): string;
procedure N4Click(Sender: TObject);
procedure N3Click(Sender: TObject);
procedure N5Click(Sender: TObject);
procedure ChangeCurrent2Click(Sender: TObject);
procedure ChangeCurrent1Click(Sender: TObject);
procedure AddCommandClick(Sender: TObject);
procedure RemoveCommandClick(Sender: TObject);
procedure CrearStringGrigButtonClick(Sender: TObject);
procedure ReadFileClick(Sender: TObject);
procedure ClearNStepsClick(Sender: TObject);
procedure AdvGlowButton1Click(Sender: TObject);
procedure CrearTapeButtonClick(Sender: TObject);
procedure AdvGlowButton2Click(Sender: TObject);
procedure ArrangementRep(Nabor: string; Place: Integer);
function itoabc(i: Integer):string;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
CurrPos,nsteps,M: integer;
CurrState: string;
stop,stopgen:boolean;
List : Array[1..20] of string;
implementation
{$R *.dfm}
procedure TForm1.TapeClipboardBeforePasteCell(Sender: TObject; ACol,
ARow: Integer; var Value: string; var Allow: Boolean);
begin
if InString(Value[1],Alphabet.Text) then
Value:=Value[1]
else
allow:=false;
end;
procedure TForm1.TapeKeyPress(Sender: TObject; var Key: Char);
begin
if InString(Key,Alphabet.Text) then
Tape.CurrentCell:=Key
else
if Key=#8 then
Tape.CurrentCell:='';
Tape.Select;
end;
function TForm1.GetWord(Str, Smb: string; WordNmbr: Byte): string;
var
SWord: string;
StrLen, N: Byte;
begin
StrLen := SizeOf(Str);
N:=1;
while ((WordNmbr>=N) and (StrLen<>0)) do
begin
StrLen:=Pos(Smb,str);
if StrLen<>0 then
begin
SWord:=Copy(Str,1,StrLen-1);
Delete(Str,1,StrLen);
Inc(N);
end
else
SWord:=Str;
end;
if WordNmbr<=N then
Result:=SWord
else
Result:='';
end;
procedure TForm1.Work(n:integer);
var finded:boolean;
i: integer;
sss:string;
begin
stop:=false;
Memo2.Clear;
sss:='q'+CurrState+' ';
for i:=0 to 2999 do
begin
if (Tape.Cells[i,0]<>'') and (Tape.Cells[i,0]<>' ') then
if i<>currpos then
sss:=sss+Tape.Cells[i,0]
else
sss:=sss+'['+Tape.Cells[i,0]+']';
end;
Memo2.Lines.Add(sss);
if n>0 then
StatusBar1.Panels.Items[0].Text:='Машина Тьюринга работает';
while (CurrState<>FinalState.Text) and (stop<>true) do
begin
if (n>0) and (TrackBar.Position>0) then
begin
sleep(TrackBar.Position);
Application.ProcessMessages;
end
else
if n=-1 then
stop:=true;
finded:=false;
for i:=1 to StringGrid.RowCount-1 do
begin
if (StringGrid.Cells[0,i]<>'') and (StringGrid.Cells[2,i]<>'') and (StringGrid.Cells[4,i]<>'') then
if (CurrState=StringGrid.Cells[0,i]) and (Tape.Cells[CurrPos,0]=StringGrid.Cells[1,i]) then
begin
Tape.Cells[CurrPos,0]:=StringGrid.Cells[3,i];
if (StringGrid.Cells[4,i]='l') or (StringGrid.Cells[4,i]='L') then
ChangeCurrPos(CurrPos-1)
else
if (StringGrid.Cells[4,i]='r') or (StringGrid.Cells[4,i]='R') then
ChangeCurrPos(CurrPos+1);
CurrState:=StringGrid.Cells[2,i];
StatusBar1.Panels.Items[1].Text:='Текущее состояние: '+CurrState;
inc(nsteps);
StatusBar1.Panels.Items[2].Text:='Сделано шагов: '+inttostr(nsteps);
finded:=true;
break;
end;
end;
sss:='q'+CurrState+' ';
for i:=0 to 2999 do
begin
if (Tape.Cells[i,0]<>'') and (Tape.Cells[i,0]<>' ') then
if i<>currpos then
sss:=sss+Tape.Cells[i,0]
else
sss:=sss+'['+Tape.Cells[i,0]+']';
end;
Memo2.Lines.Add(sss);
if not finded then
begin
ShowMessage('Ошибка! Не найдена команда!');
stop:=true;
end;
if (CurrPos<0) or (CurrPos>2999) then
begin
ShowMessage('Ошибка! Лента хоть и бесконечная, но закончилась :)');
stop:=true;
end;
Tape.Refresh;
end;
StatusBar1.Panels.Items[0].Text:='Машина Тьюринга готова к запуску';
Memo2.Lines.SaveToFile('_sss.txt');
end;
procedure TForm1.StartMTClick(Sender: TObject);
begin
DisableControls();
Work(1);
DisableControls();
end;
function TForm1.InString(c:char;s:string):boolean;
var i:integer;
begin
Result:=false;
for i:=1 to length(s) do
begin
if c=s[i] then
begin
Result:=True;
break;
end;
end;
end;
procedure TForm1.StepButtonClick(Sender: TObject);
begin
Work(-1);
end;
procedure TForm1.StopMTClick(Sender: TObject);
begin
stop:=true;
end;
procedure TForm1.ChangePosButtonClick(Sender: TObject);
begin
ChangeCurrPos(Tape.Selection.Left);
end;
procedure TForm1.AddCommandClick(Sender: TObject);
begin
StringGrid.InsertRows(StringGrid.Selection.Top+1,1);
StringGrid.SelectCells(0,StringGrid.Selection.Top+1,0,StringGrid.Selection.Top+1);
StringGrid.ScrollInView(0,StringGrid.Selection.Top);
StringGrid.Refresh;
end;
procedure TForm1.RemoveCommandClick(Sender: TObject);
begin
StringGrid.RemoveSelectedRows;
end;
procedure TForm1.CrearStringGrigButtonClick(Sender: TObject);
begin
ClearStringGrid();
end;
procedure TForm1.CrearTapeButtonClick(Sender: TObject);
begin
ClearTape();
end;
procedure TForm1.ReadFileClick(Sender: TObject);
var
myFile : TextFile;
str1,word : string;
i: byte;
begin
if OpenTextFileDialog1.Execute then
begin
ClearStringGrid();
AssignFile(myFile,OpenTextFileDialog1.FileName);
ReSet(myFile);
ReadLn(myFile, str1);
Alphabet.Text:=str1;
while not Eof(myFile) do
begin
ReadLn(myFile, str1);
for i:=0 to 4 do
begin
word:=GetWord(str1,' ',i+1);
if i in [0,2] then
StringGrid.Cells[i,StringGrid.RowCount-1]:=word
else
if ((i in [1,3]) and (word='[space]')) or ((i=4) and not InString(word[1],'lreLRE')) then
StringGrid.Cells[i,StringGrid.RowCount-1]:=''
else
StringGrid.Cells[i,StringGrid.RowCount-1]:=word[1];
end;
StringGrid.AddRow;
end;
CloseFile(myFile);
StringGrid.RemoveRows(StringGrid.RowCount-1,1);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Form2.Top:=Form1.Top;
Form2.Left:=Form1.Left+Form1.Width+15;
if Form2.Visible then
Form2.Hide
else
Form2.Show;
end;
procedure TForm1.ArrangementRep(Nabor: string; Place: Integer);
var
i: Integer;
begin
if Place > M then
begin
Memo1.Lines.Add(Nabor);
end
else
for i := 1 to length(AdvEdit1.Text) do
begin
Application.ProcessMessages();
ArrangementRep(Nabor + itoabc(i), Place + 1);
end;
end;
function TForm1.itoabc(i: Integer):string;
var abc:string;
begin
abc:=AdvEdit1.Text;
Result:=abc[i];
end;
procedure TForm1.AdvGlowButton1Click(Sender: TObject);
var t:int64;
i,j,nmax:integer;
abc:string;
//t:TDateTime;
begin
DisableControls();
AdvGlowButton1.Enabled:=not AdvGlowButton1.Enabled;
AdvGlowButton2.Enabled:=not AdvGlowButton2.Enabled;
AdvEdit1.Enabled:=not AdvEdit1.Enabled;
AdvEdit2.Enabled:=not AdvEdit2.Enabled;
StopMT.Enabled:=not StopMT.Enabled;
stopgen:=false;
t:=GEtTIckCount;
M:=0;
Form2.EasyGraph1.Series[0].Clear;
Form2.EasyGraph1.Series[1].Clear;
while ((GetTickCount-t)<(strtofloat(AdvEdit2.Text)*60000)) and (stopgen=false) do
begin
Memo1.Clear;
ArrangementRep('', 1);
nmax:=0;
i:=0;
while (i<Memo1.Lines.Count) and ((GetTickCount-t)<(strtofloat(AdvEdit2.Text)*60000)) and (stopgen=false) do
begin
Application.ProcessMessages();
ClearNStepsClick(Sender);
ChangeCurrent1Click(Sender);
ClearTape();
abc:=Memo1.Lines[i];
for j:=1 to length(abc) do
begin
Tape.Cells[CurrPos+j-1,0]:=abc[j];
end;
Work(1);
if nsteps>nmax then
nmax:=nsteps;
if stopgen=true then
break;
inc(i);
end;
Form2.EasyGraph1.Series[0].Add(M,nmax);
inc(M);
end;
AdvGlowButton1.Enabled:=not AdvGlowButton1.Enabled;
AdvGlowButton2.Enabled:=not AdvGlowButton2.Enabled;
AdvEdit1.Enabled:=not AdvEdit1.Enabled;
StopMT.Enabled:=not StopMT.Enabled;
AdvEdit2.Enabled:=not AdvEdit2.Enabled;
DisableControls();
end;
procedure TForm1.AdvGlowButton2Click(Sender: TObject);
begin
stopgen:=true;
end;
procedure TForm1.ChangeCurrent1Click(Sender: TObject);
begin
CurrState:=StartState.Text;
StatusBar1.Panels.Items[1].Text:='Текущее состояние: '+CurrState;
end;
procedure TForm1.ChangeCurrent2Click(Sender: TObject);
begin
CurrState:=FinalState.Text;
StatusBar1.Panels.Items[1].Text:='Текущее состояние: '+CurrState;
end;
procedure TForm1.ChangeCurrPos(NewPos:integer);
begin
Tape.ColorsTo[CurrPos,0]:=clNone;
CurrPos:=NewPos;
Tape.ColorsTo[CurrPos,0]:=clGray;
end;
procedure TForm1.ClearTape();
begin
Tape.Clear;
CurrPos:=1500;
Tape.ScrollInView(CurrPos,0);
Tape.ColorsTo[CurrPos,0]:=clGray;
end;
procedure TForm1.ClearNStepsClick(Sender: TObject);
begin
nsteps:=0;
StatusBar1.Panels.Items[2].Text:='Сделано шагов: '+inttostr(nsteps);
end;
procedure TForm1.ClearStringGrid();
begin
StringGrid.RemoveRows(2,StringGrid.RowCount-2);
StringGrid.ClearRows(1,1);
end;
procedure TForm1.DisableControls();
begin
AddCommand.Enabled:=not AddCommand.Enabled;
RemoveCommand.Enabled:=not RemoveCommand.Enabled;
ReadFile.Enabled:=not ReadFile.Enabled;
Tape.Enabled:=not Tape.Enabled;
StringGrid.Enabled:=not StringGrid.Enabled;
StartMT.Enabled:=not StartMT.Enabled;
StartState.Enabled:=not StartState.Enabled;
FinalState.Enabled:=not FinalState.Enabled;
StopMT.Enabled:=not StopMT.Enabled;
ChangePosButton.Enabled:=not ChangePosButton.Enabled;
CrearTapeButton.Enabled:=not CrearTapeButton.Enabled;
StepButton.Enabled:=not StepButton.Enabled;
TrackBar.Enabled:=not TrackBar.Enabled;
TrackBar.Enabled:=not TrackBar.Enabled;
ChangeCurrent1.Enabled:=not ChangeCurrent1.Enabled;
ChangeCurrent2.Enabled:=not ChangeCurrent2.Enabled;
CrearStringGrigButton.Enabled:=not CrearStringGrigButton.Enabled;
ClearNSteps.Enabled:=not ClearNSteps.Enabled;
Alphabet.Enabled:=not Alphabet.Enabled;
end;
procedure TForm1.StringGridClipboardBeforePasteCell(Sender: TObject; ACol,
ARow: Integer; var Value: string; var Allow: Boolean);
begin
if ((StringGrid.Selection.Left in [1,3]) and (InString(Value[1],Alphabet.Text))) or ((StringGrid.Selection.Left in [4]) and (InString(Value[1],'lreLRE'))) or (StringGrid.Selection.Left in [0,2]) then
Value:=Value[1]
else
allow:=false;
end;
procedure TForm1.StringGridKeyPress(Sender: TObject; var Key: Char);
begin
if ((StringGrid.Selection.Left in [1,3,4]) and (length(StringGrid.CurrentCell)>0)) or ((StringGrid.Selection.Left in [1,3]) and not InString(Key,Alphabet.Text)) or ((StringGrid.Selection.Left in [4]) and not (InString(Key,'lreLRE'))) then
if (Key<>#8) and (Key<>#3) and (Key<>#22) then
Key:=#0;
Tape.Select;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
ClearTape();
StringGrid.Cells[0,0]:='q';
StringGrid.Cells[1,0]:='a';
StringGrid.Cells[2,0]:='q''';
StringGrid.Cells[3,0]:='a''';
StringGrid.Cells[4,0]:='V';
CurrState:=StartState.Text;;
StatusBar1.Panels.Items[1].Text:='Текущее состояние: '+CurrState;
nsteps:=0;
StatusBar1.Panels.Items[2].Text:='Сделано шагов: '+inttostr(nsteps);
end;
procedure TForm1.N1Click(Sender: TObject);
begin
ChangeCurrPos(Tape.Selection.Left);
end;
procedure TForm1.N2Click(Sender: TObject);
begin
ClearTape();
end;
procedure TForm1.N3Click(Sender: TObject);
begin
RemoveCommandClick(Sender);
end;
procedure TForm1.N4Click(Sender: TObject);
begin
AddCommandClick(Sender);
end;
procedure TForm1.N5Click(Sender: TObject);
begin
ClearStringGrid();
end;
end.
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, EasyGraph, StdCtrls;
type
TForm2 = class(TForm)
EasyGraph1: TEasyGraph;
Button1: TButton;
Edit1: TEdit;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form2: TForm2;
implementation
{$R *.dfm}
procedure TForm2.Button1Click(Sender: TObject);
begin
EasyGraph1.Series[1].Func:=Edit1.Text;
end;
procedure TForm2.FormCreate(Sender: TObject);
begin
EasyGraph1.VisRect:=Rect2D (-1,-1,9,60);
Form2.EasyGraph1.Series.Add;
Form2.EasyGraph1.Series.Add;
Form2.EasyGraph1.Series[1].Color:=clBlue;
end;
end.
МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
ДОНЕЦЬКИЙ НАЦІОНАЛЬНИЙ ТЕХНІЧНИЙ УНІВЕРСІТЕТ
КАФЕДРА КОМП’ЮТЕРНИХ СИСТЕМ МОНІТОРИНГУ
ПОЯСНЮВАЛЬНА ЗАПИСКА ДО КУРСОВОГО ПРОЕКТУ
ПО КУРСУ «ТЕОРІЯ АЛГОРИТМІВ І ФОРМАЛЬНИХ МОВ»