procedure DestroyVariable;
constructor Create;
destructor Destroy; override;
procedure ClearVariable;
function CreateCopy:TPrologVariable; //создает точную копию переменной
//Имя переменной переносится и в копию
procedure AssignVariable (v:TPrologVariable); //присваивает значение
//переменной. Имя переменной не меняется
end;
TVariablesArray=array of TPrologVariable;
TPrologListType=(pltStdList,pltHeadTail);
//pltStdList - Элементы списка хранятся в Elements
//pltHeadTail - представлен в виде головы и хвоста(используются только
//два элемента массива elements
TPrologVariableList=class(TObject)
ListName :string; //имя типа списка
ElemName :string; //Имена типа элементов
ListType :TPrologListType; //Тип списка.
Elements :TVariablesArray; //Элементы находятся в Data
DividerPos :integer; //позиция разделителя в случае ListType=pltHeadTail
//указывает, после какого элемента стоит разделитель
procedure ConvertList;
TPrologVariableStruct=class(TObject)
StructName :string; //имя типа структуры
ElemTypes :array of string; //имена типов элементов
Elements :array of TPrologVariable; //Элементы находятся в Data
TPrologVariables=class(TObject)
VarArr :array of TPrologVariable;
function Count:integer;
function High:integer;
procedure AddVariable(v:TPrologVariable);
procedure DeleteVariable(n:integer); overload;
procedure DeleteVariable(vName:string); overload;
procedure DeleteLastVariable;
function AddNewVariable:TPrologVariable;
function VariableByName(vName:string):TPrologVariable;
function GetVariable(ind:integer):TPrologVariable;
procedure SetVariable(ind:integer; v:TPrologVariable);
procedure ClearAndDestroyVariables;
property Variables[ind:integer]:TPrologVariable read GetVariable
write SetVariable; default;
TSubTermPredicate=class(TObject)
Name :string;
StandardPredicate :Boolean; //True - если предикат стандартный
Params :TVariablesArray;
NoInverse :Boolean; //признак отсутствия инверсии
TSubTermExtData=class(TObject)
TExpressionOperation=
(eoPlus, eoMinus, eoMultiply, eoDivide, eoEqual,
eoGT, eoLT, eoGE, eoLE, eoVariable, eoFunction,
eoAnd, eoOR, eoNotEqual);
TSubTermExpression=class(TObject)
Operation :TExpressionOperation;
VarName :String; //имя перменной
FuncName :string; //имя функции
StringStr :string; //строка для строки константы
NumberInt :integer; //число для целой контанты
NumberReal :Extended; //число для реальной контанты
BooleanVal :Boolean; //Число для логической константы
Operand :TPrologVariable;
LeftHand :TSubTermExpression; //Указатель на данные тип
//TSubTermExpression, TPrologVariable
RightHand :TSubTermExpression;
FuncParams :array of TSubTermExpression;
TPrologTermType=(pttExpression,pttPredicate,pttExtData,pttCutting);
TPrologTerm=class(TObject)
TermType :TPrologTermType; //тип терма
Data :pointer; //указатель на объектом с содержимым терма
x,y :integer;
TTermsArray=array of TPrologTerm;
TProgramDomain=class(TObject)
//Внутренний формат доменов
iType :TDomainTypes;
Params :TStrings;
ListParam :string;
TProgramExtData=class(TObject)
Fields :TStrings;
FieldsTypes :TStrings;
FieldsLengths :TStrings;
FileName :string;
Table :TTable;
DataSource :TDataSource;
function Open:Boolean;
procedure Close;
TPredicateClause=class(TObject)
Terms :TTermsArray;
x,y, Endx, EndY :integer;
TProgramPredicate=class(TObject)
Text :TStrings;
Lexems :TLexemsArray;
Clauses :array of TPredicateClause;
TFileOpenMode=(fomRead,fomWrite,fomNotOpened);
TPrologFile=class(TObject)
HandlerNumb :integer;
OpenMode :TFileOpenMode;
FileVar :TextFile;
procedure OpenRead(FileName:string);
procedure OpenWrite(FileName:string);
function EndOfFile:Boolean;
procedure ReadFile(var st:string);
procedure WriteFile(st:string);
TVariableSize=record
iType :TPrologVariablesTypes;
size :integer;
const
SimplePrologTypesCount=4;
SimplePrologTypes:set of TPrologVariablesTypes=
[vtString, vtInteger, vtBoolean, vtReal];
PrologVariablesSizes:array [0..5] of TVariableSize=
((Name:'STRING'; iType:vtString; Size:SizeOf(string)),
(Name:'INTEGER'; iType:vtInteger; Size:SizeOf(integer)),
(Name:'BOOLEAN'; iType:vtBoolean; Size:SizeOf(Boolean)),
(Name:'REAL'; iType:vtReal; Size:SizeOf(Extended)),
(Name:'LIST'; iType:vtList; Size:SizeOf(TPrologVariableList)),
(Name:'STRUCT'; iType:vtStruct; Size:SizeOf(TPrologVariableStruct)));
Интерфейсная часть модуля с функциями и предикатами интерпретатора.
unit PrologRunTime;
interface
Uses SysUtils,CompileUnit, ProgramClasses, CommonFunctions;
type
TErrorCode=(ecType, ecNo, ecOverflow, ecDivideZero, ecExpressionValue,
ecArgsCount, ecArgType, ecTan, ecRealAsInteger, ecTypeInExtData,
ecListTail,ecPredicateParams,ecExtDataAbsent, ecExtDataDelete,
ecRangeError,ecConvertError,ecFileOpenError,ecFileCloseError,
ecFileAccessError,
ecCloseProgram,
ecStopPrologProgram);
//ecType - ошибка типа
//ecNo - нет ошибок
//ecOverflow - переполнение
//ecDivideZero - деление на ноль
//ecExpressionValue - выражение возвращает нелогическое значение
//ecArgsCount - неверное количество аргументов у функции
//ecArgType - ошибка типа аргумента функции
//ecTan - ошибка выполнения операции тангенса
//ecRealAsInteger - ошибка конвертирования реального числа в целое
// возникает, когда функции требуется целое число, а у предлагаемого
// аргумента функции есть ненулевая дробная часть
//ecTypeInExtData - ошибка типа при вызове базы данных
//ecListTail - разделение списка на голову и хвост оказалось неуспешным
//ecCloseProgram - закрытие программы
//ecStopPrologProgram - остановка программы
//ecPredicateParams - неверные параметры предиката
TRunTimeError=class(TObject)
Code :TErrorCode;
PredicateName :string;
procedure SetError(err:TErrorCode);
procedure ShowOnScreen;
TOperatorFunction=function (
Oper1:TPrologVariable; Oper2:TPrologVariable):TPrologVariable;
TStdFunction=function (Args:TPrologVariables):TPrologVariable;
TStdPredicate=function (VarPacket:TPrologVariables; BackTracking:Boolean):Boolean;
function VariableToStr(v:TPrologVariable;
PrintName:Boolean=True; PrintCommas:Boolean=True;
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15