- •Введение
- •1. История Пролога
- •2. Синтаксис и семантика Пролог-программ
- •2.1. Объекты данных1
- •2.2. Декларативный смысл Пролог-программ
- •2.3. Основные определения
- •3. Практическое программирование на Прологе
- •3.1. Структура Пролог-программы
- •3.2. Некоторые предопределенные термы
- •3.3. Свободные и связанные переменные
- •3.4. Внутренняя бд Пролога
- •3.5. Обработка условий и организация циклов в Prolog’е
- •3.5.1. Обработка условия
- •3.5.2. Использование предиката типа repeat
- •3.6. Списки в Прологе
- •3.6.1. Примеры списков
- •3.6.2. Разделение списков на голову и хвост
- •3.6.3. Некоторые полезные программы для работы со списками
- •1. Слияние списков.
- •2. Сортировка списков
- •3.7. Ввод и вывод
- •3.7.1. Файловая система
- •Операции с именами файлов
- •Чтение и запись
- •3.8. Строки и функции работы со строками
- •4. Простенькая экспертная система
- •Игрушечная эс «Кто чем увлекается?»
- •5. Базовые понятия и термины Пролога
- •5.1. Объекты
- •5.2. Внутренние дела Пролога
- •5.3. Что такое шаблоны?
- •5.4. Управление поиском
- •Литература
Операции с именами файлов
Для работы с именами файлов используются предикаты:
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.