Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ПРОЛОГ.doc
Скачиваний:
3
Добавлен:
21.11.2019
Размер:
311.81 Кб
Скачать

Операции с именами файлов

Для работы с именами файлов используются предикаты:

filenameext(FullName,Name,Mask)-(i,o,o),(o,i,i)

filenamepath(FullName,Path,Name)- (i,o,o),(o,i,i)

Примеры:

filenameext с шаблоном (i,o,o):

filenameext("myprog.vpr",Name,Ext),

write("Name=",Name, " Ext=",Ext),nl,

Выход:

Name=myprog Ext=.vpr

filenameext с шаблоном (o,i,i):

filenameext(FullName,"prolog",".err"),

write(FullName),nl,

filenameext(FullName1,"prolog.err",".exe"),

write(FullName1),nl.

Выход:

prolog.err

prolog.exe

filenamepath с шаблоном (i,o,o)

filenamepath("C:\\mycatalog\\myfile.txt",Path,Name),

write("Path=",Path," Name=",Name),nl,

Выход:

Path=C:\mycatalog\ Name=myfile.txt

filenamepath с шаблоном (o,i,i)

filenamepath(FullName,"C:\\mycatalog\\","anfile.txt"),

write(FullName),nl,

Выход:

C:\mycatalog\anfile.txt

Чтение и запись

Основные предикаты для чтения:

file_str(OSFileName,StringVariable) - читает файл целиком.

readchar(CharVariable) - читает один символ с устройства ввода (файл или клавиатура)

readint(IntegerVariable) - читает целое число в пределах (от -2147483648 до >2147483647 для 32 bit платформы). Ошибка возникает, если ввод не может быть преобразован в целое.

readln(StringVariable) - читает строку.

readreal(RealVariable) - читает реальное число.

Примеры правильного задания:

127

-127.457E-5

0.72

.99

Универсальный оператор записи – write. Пример:

write(“Это значения переменных. V=”,V,”,C=”,C),nl,

Переменные могут иметь любой тип.

Предикат nl служит для перевода строки.

3.8. Строки и функции работы со строками

Строка - любая последовательность символов, заключенная в кавычки.

Предикат concat - объединение строк.

Шаблоны (patterns) (i, i, o), (o, i, i), (i, o, i), (i, i, i).

Примеры с разными шаблонами.

% Шаблон (i, i, o)

Строка1="Это строка ",

Строка2="И это строка",

concat(Строка1,Строка2,ИтоговаяСтрока).

write(ИтоговаяСтрока),

%Выход: Это строка И это строка

% Шаблон (o, i, i)

concat(X,"И это строка","Это строка И это строка")

write(X)

%Выход: Это строка

% Шаблон (i, o, i)

concat("Это строка",X,"Это строка И это строка")

%Выход: И это строка

% Шаблон (i, i, i)

concat("Это строка"," И это строка","Это строка И это строка")

% Нет выхода. Утверждение истинно.

concat("Это строка"," А это строка не строка","Это строка И это строка")

% Утверждение ложно. "А это строка не строка" не является

% подстрокой "Это строка И это строка"

Предикат frontchar

frontchar (String, StartChar, EndString)

Шаблоны (i, o, o), (i, i, o), (i, o, i), (i, i, i), (o, i, i)

Примеры:

%Шаблон (i, o, o)

frontchar("Я Вас люблю!",Fc,ES),

write(Fc,"##",Es),

%Выход: Я## Вас люблю!

%Шаблон (i, i, o)

S="Я Вас люблю!",

frontchar(S,'О',ES),

%Предикат не успешен.

%Шаблон (i, o, i)

S="Ненавижу",

frontchar(S,X,"енавижу"),

write(X),

%Выход: Н

%Шаблон (i, i, i)

S="У-р-р-я-я-я!"

frontchar(S,'У',"-р-р-я-я-я!"),

%Предикат успешен

%Шаблон (o, i, i) -добавление символа в начало строки

frontchar(S,'Н',"енавижу"),

write(S),

%Выход: Ненавижу

Предикат frontstr - выбор лидирующей подстроки

%шаблон - (i,i,o,o)

frontstr(5,"ААААААА",StartS,EndS),

write(SrartS,"###",EndS),

Выход: ААААА###AA

St="МАМА",

frontstr(5,St,StartS,EndS),

Предикат не успешен.

Предикат fronttoken

token - это правильное «имя», беззнаковое число (integer|real), символ

(но не пробел).

Можно проверить является ли Ваша строка правильным именем, используя встроенный предикат isname. Например,

isname("75Слонов") - No (не имя),

isname("Windows_95") - Yes,

isname("Windows-95") - No.

Ниже приводится исходный текст полной программы на Visual Prolog'е

/**********************************************

Copyright (c) My Company

Project: TOKEN

FileName: TOKEN.PRO

Purpose: No description

Written by: Visual Prolog

Comments:

************************************************/

include "token.inc"

predicates

token()

clauses

token():-

fronttoken("all kids do fine",TOK,REST),

write("TOK = ",TOK," REST = ",REST),nl,

fronttoken("all+kids do fine",TOK1,REST1),

write("TOK = ",TOK1," REST = ",REST1),nl,

fronttoken("22all kids do fine",TOK2,REST2),

write("TOK = ",TOK2," REST = ",REST2),nl,

fronttoken("22.66all kids do fine",TOK3,REST3),

write("TOK = ",TOK3," REST = ",REST3),nl,

fronttoken("-22.66all kids do fine",TOK4,REST4),

write("TOK = ",TOK4," REST = ",REST4),nl,

fronttoken(".66all kids do fine",TOK5,REST5),

write("TOK = ",TOK5," REST = ",REST5),nl,

fronttoken("Иди ко мне!",TOK7,REST7),

write("Исходная строка >>> ","Иди ко мне!"),nl,

write("TOK = ",TOK7," REST = ",REST7).

goal

token().

% Выход:

TOK = all REST = kids do fine

TOK = all REST = +kids do fine

TOK = 22 REST = all kids do fine

TOK = 22.66 REST = all kids do fine

TOK = - REST = 22.66all kids do fine

TOK = . REST = 66all kids do fine

Исходная строка >>> Иди ко мне!

TOK = Иди REST = ко мне!

Последнее использование fronttoken демонстрирует, что Вы можете использовать этот предикат для парсирования текстов на русском языке, что не позволял TurboProlog v.2.0. Давайте, мы это и сделаем.

domains

слово=symbol

часть_речи=symbol

facts -f1

лексема(слово,часть_речи)

знак(symbol,symbol)

predicates

парсировать_предложение(symbol)

определить_нечто(symbol)

goal

assert(лексема("я","местоимение")),

assert(лексема("бы","частица")),

assert(лексема("на","предлог")),

assert(лексема("но","союз")),

assert(лексема("выходить","глагол")),

assert(лексема("вышел","глагол")),

assert(лексема("идет","глагол")),

assert(лексема("улица","существительное")),

assert(лексема("улицу","существительное")),

assert(лексема("дождь","существительное")),

assert(знак(",","запятая")),

assert(знак(".","точка")),

Предл="Я бы вышел на улицу, но идет сильный дождь.",

парсировать_предложение(Предл).

clauses

парсировать_предложение(Предл):-

fronttoken(Предл,Нечто,Остаток),!,

upper_lower(Нечто,Нечто1), % преобразование регистра

определить_нечто(Нечто1),

парсировать_предложение(Остаток);!.

определить_нечто(X):-

лексема(X,Часть_речи),!,

write("Слово = ",X," Часть_речи = ",Часть_речи),nl;

знак(X,Наименование),!,

write("Знак препинания = ",X," Наименование = ",Наименование),nl;

write("Элемент ",X," не определен"),nl.

Выход:

Слово = я Часть_речи = местоимение

Слово = бы Часть_речи = частица

Слово = вышел Часть_речи = глагол

Слово = на Часть_речи = предлог

Слово = улицу Часть_речи = существительное

Знак препинания = , Наименование = запятая

Слово = но Часть_речи = союз

Слово = идет Часть_речи = глагол

Элемент сильный не определен

Слово = дождь Часть_речи = существительное

Знак препинания = . Наименование = точка

Для поиска подстрок и отдельных символов используются предикаты

searchstring(SourceStr,SearchStr,Position) и

seachchar(SourceString,Char,FoundPos)

соответственно. Они возвращают позиции начала подстроки и символа.

Для выбора подстроки используется предикат substring(STRING,Pos,Len,SubStr),

для выбора символа – предикат subchar(String,Position,RetChar).

Длина строки определяется предикатом str_len.