unit
ESUnit;
interface
uses
Windows,
Messages,
SysUtils,
Variants,
Classes,
Graphics,
Controls,
Forms,
Dialogs,
StdCtrls,
Inputform,
Spin,
Grids;
type
TfrmExpertSystem
=
class(TForm)
btnStart:
TButton;
Label1:
TLabel;
sgValues:
TStringGrid;
Label2:
TLabel;
edOutcome1:
TEdit;
Label3:
TLabel;
edOutcome2:
TEdit;
edVars:
TEdit;
Label4:
TLabel;
procedure
btnStartClick(Sender:
TObject);
procedure
sgValuesSetEditText(Sender:
TObject;
ACol,
ARow:
Integer;
const
Value:
String);
procedure
FormCreate(Sender:
TObject);
procedure
edOutcome1Change(Sender:
TObject);
procedure
edOutcome2Change(Sender:
TObject);
procedure
edVarsChange(Sender:
TObject);
private
{
Private declarations }
vars:integer;
svars:array
of
string;
values:array
of
integer;
rules:array
of
integer;
outcome1,outcome2:string;
procedure
ShowGrid;
public
{
Public declarations }
procedure
print(AStr:string);
function
Input:string;
end;
var
frmExpertSystem:
TfrmExpertSystem;
implementation
procedure
TfrmExpertSystem.print(AStr:string);
begin
end;
function
TfrmExpertSystem.Input:string;
var
frm:TfrmInput;
begin
frm:=TfrmInput.Create(self);
frm.ShowModal;
Result:=frm.edInput.Text;
end;
{$R
*.dfm}
function
YNBoolToInt(s:string):Integer;
begin
if
UpperCase(s)='Y'
then
result:=1
else
result:=0;
end;
function
IntToYNBool(s:integer):string;
begin
if
s>=1
then
result:='Y'
else
result:='N';
end;
procedure
TfrmExpertSystem.btnStartClick(Sender:
TObject);
var
s:string;
decision:integer;
i:integer;
begin
//поиск
решения
decision:=0;
for
i:=Low(values)to
High(values)
do
begin
decision:=decision+values[i]*rules[i];
end;
//сообщить
пользователю результат решения
if
decision>0
then
s:='Возможный
исход '+outcome1
else
s:='Возможный
исход '+outcome2;
s:=s+'.
Это верно?';
if
messageDlg(s,mtConfirmation,[mbYes,mbNo],0)=mrNo
then
begin
//корректировка
правил
if
decision>0
then
for
i:=Low(rules)
to
High(Rules)
do
Rules[i]:=rules[i]-Values[i]
else
for
i:=Low(rules)
to
High(Rules)
do
Rules[i]:=rules[i]+Values[i];
end;
ShowGrid;
end;
procedure
TfrmExpertSystem.sgValuesSetEditText(Sender:
TObject;
ACol,
ARow:
Integer;
const
Value:
String);
begin
case
ACol
of
1:svars[ARow-1]:=Value;
2:values[ARow-1]:=YNBoolToInt(Value);
3:rules[ARow-1]:=StrToInt(Value);
end;
end;
procedure
TfrmExpertSystem.FormCreate(Sender:
TObject);
begin
sgValues.Cells[1,0]:='Утверждение';
sgValues.Cells[2,0]:='Есть';
sgValues.Cells[3,0]:='Правило';
sgValues.ColWidths[0]:=25;
sgValues.ColWidths[1]:=300;
edVarsChange(nil);
end;
procedure
TfrmExpertSystem.ShowGrid;
var
i:integer;
begin
for
i:=Low(svars)
to
high(svars)
do
begin
sgValues.Cells[1,i+1]:=svars[i];
sgValues.Cells[2,i+1]:=IntToYNBool(values[i]);
sgValues.Cells[3,i+1]:=IntToStr(rules[i]);
end;
end;
procedure
TfrmExpertSystem.edOutcome1Change(Sender:
TObject);
begin
outcome1:=edOutcome1.Text;
end;
procedure
TfrmExpertSystem.edOutcome2Change(Sender:
TObject);
begin
outcome2:=edOutcome2.Text;
end;
procedure
TfrmExpertSystem.edVarsChange(Sender:
TObject);
var
LastVars,
i:integer;
begin
LastVars:=Vars;
//Установим
новое количество
vars:=StrToInt(edVars.Text);
SetLength(values,vars);
SetLength(rules,vars);
SetLength(svars,vars);
//реинциализация
массива
if
Vars>LastVars
then
for
i:=vars
to
LastVars-1
do
begin
values[i]:=0;
rules[i]:=0;
end;
sgValues.RowCount:=vars+1;
ShowGrid;
end;
end. |