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.
4. Простенькая экспертная система
Задача этой главы заключается в том, чтобы проиллюстрировать использование Пролога для создания игрушечной экспертной системы.
Игрушечная ЭС «Кто чем увлекается?»
Мы хотим создать систему, которая отвечала бы на вопросы, сформулированные на русском языке, на тему увлечений (hobby) действующих лиц.
Начнем с простейшего варианта.
В простейшем варианте нам следует создать элементарную базу фактов типа увлечение(Кто, Что). Все вербальные варианты запросов система проинтерпретирует так:
1) если в тексте вопроса присутствует значение «Кто» (Петров, Сидоров,...), следует выдать все значения «Что»;
2) если в тексте вопоса присутствует значение «Что», следует выдать все значения «Кто»;
3) если в тексте запроса присутствуют «Что» и «Кто», то система интерпретирует запрос, как «Увлекается ли Кто Что?».
Ответ: «Да» или «Нет» в зависимости от содержания элементарной базы знаний.
В таком простейшем варианте ЭС (с единственным видом отношения между субъектом и объектом) можно не утруждать пользователя формулированием запроса в полном виде, играя в понимание, а предоставить ему возможность выбрать тип запроса и заполнить соответствующие поля.
Алгоритм обработки запросов очень прост. В самом сложном случае, когда их типы заранее не определены (через меню выбора типа), каждое слово запроса проверяется на принадлежность типам «Кто» или «Что» и, в зависимости от результата, формулируется ответ. «Закодируем» алгоритм обработки строки-запроса Запрос, полагая, что база знаний содержится в файле «hobbyNew. dbs».
Программа завершает работу, если в ответ на ее вопрос write(«Есть вопросы? (Д|Н|д|н)»), пользователь ответит 'Н' или 'н'. Предикат repeat используется в разделе goal для организации цикла по обработке вопросов.
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 |


