Автор работы: Пользователь скрыл имя, 16 Июня 2013 в 00:11, курсовая работа
Prolog — один из старейших и все еще один из наиболее популярных языков логического программирования, хотя он значительно менее популярен, чем основные императивные языки. Он используется в системах обработки естественных языков, исследованиях искусственного интеллекта, экспертных системах, онтологиях и других предметных областях, для которых естественно использование логической парадигмы. Так в данном курсовом проекте реализуется работа со списками, строками и файлами средствами языка Prolog.
ВВЕДЕНИЕ 5
1 Постановка задачи 8
2. теоретическая часть 9
2.1 Общие сведения 9
2.2 Списки 11
2.2 Строки 14
2.2 Файлы 16
3. Структурная схема программы 18
4. ОПИСАНИЕ ПРЕДИКАТОВ 19
5 ТЕКСТ ПРОГРАММЫ 20
6 ТЕСТИРОВАНИЕ ПРОГРАММЫ 26
7 РУКОВОДСТВО ДЛЯ ПОЛЬЗОВАТЕЛЯ 27
ВЫВОДЫ 29
ЛИТЕРАТУРА 30
[ ]
[конкретный, человек, [любит, ловить, рыбу]]
[а, V1, b, [X, Y]]
Переменные, входящие в списки, ничем не отличаются от переменных в любой другой структуре. Они в любой момент могут быть конкретизированы, так что умелое использование переменных может обеспечить образование «пустых мест» в списке, которые впоследствии могут быть заполнены данными.
Работа со списками основана на расщеплении их на голову и хвост списка. Голова списка — это первый аргумент функтора '.', который используется для конструирования списка. Хвост списка — это второй аргумент функтора '.'.В случае когда для записи списка используется скобочная форма записи, головой списка является первый его элемент. Хвост списка представляет список, состоящий из всех элементов исходного списка, за исключением первого его элемента.
Так как операция расщепления списка на голову и хвост очень широко используется, то в Прологе введена специальная форма для представления списка с головой X и хвостом Y. Это записывается как [X|Y], где для разделения X и Y используется вертикальная черта. При конкретизации структуры подобного вида X сопоставляется с головой списка, a Y — с хвостом списка.
Существует еще одна область применения списков — это представление строк литер. Иногда возникает необходимость в использовании строк литер для печати или ввода текста. Если строка литер заключена в двойные кавычки, то эта строка представляется как список кодов, соответствующих литерам строки.
Для кодировки литер используется код ASCII. Например, строка "system" преобразуется в Прологе в следующий список: [115, 121, 115, 116, 101, 109].
В разделе описания доменов списки описываются следующим образом:
DOMAINS
<имя спискового домена>=<имя домена элементов списка>*
Звездочка после имени домена указывает на то, что мы описываем список, состоящий из объектов соответствующего типа.
В классическом Прологе элементы списка могут принадлежать разным доменам, например: [monday, 1, "понедельник"].
В Турбо Прологе, в связи со строгой типизацией, все элементы списка должны принадлежать одному домену. Однако можно разместить в одном списке объекты разной природы, используя домен с соответствующими альтернативами.
Например, следующее описание:
DOMAINS
element = i(integer); c(char); s(string)
listE = element*
позволит иметь дело со списками вида
[i(–15), s("Мама"),c('A'),s("мыла"),c('
i(48),c('!')]
Дадим рекурсивное определение списка: список — это структура данных, определяемая следующим образом:
Под строкой в Прологе понимается последовательность символов, заключенная в двойные кавычки.
При прогарммировании на Прологе символы могу быть записаны при помощи кодов ASCII. Обратная связь, за которой следует код ASCII символа, интерпретируется как символ. Для представления одиночного символа выражение \N должно быть заключено в одинарные кавычки. Для представления строки символов их коды помещают друг за другом и вся строка заключается в двойные кавычки.
Стандартные предикаты для работы со строками
Определение длины строки
Str_len (строка, длина) (string, string) : (i, o) (i, i)
(i, o) – с параметром длина связывается количество символов в строке
(i, i) – выполняетсмя успешно, если строка имеет указанную длину.
Конкатенация строк
concat (Стр1, Стр2, Стр3) (string, string, string) : (i, i, o) (o, i, i) (i, o, i) (i, i, i)
(i, i, o) concat ("фут”, "бол”, X) X=”футбол”
(o, i, i) concat (X, "ball”, "football”) X= "foot”
(i, i, i) concat ("foot”, "ball”, "football”) True
Создание подстрок
frontstr (КопСтр, ВхСтр, ВыхСтр, Остаток) (integer, string, string, string) : (i, i, o, o).
Выходная строка получается из входной строки отрезанием начальных символов, количество которых определяется параметром КолСим. Остаток строки определяется параметром Остаток.
Разделение строки на две части
frontchar (строка, ПервСимвол, Остаток) (string, char, string) (i, o, o) (i, i, o) (i, o, i) (i, i, i)(o, i, i)
(i, o, o) frontchar ("Sad”, X, Y) X=’S’, Y=’ad’
(i, i, o) frontchar ("Sad”, ‘S’, X) X=’ad’
(i, o, i) frontchar ("Sad”, X, ‘ad’) X=’S’
(i, i, i) frontchar ("Sad”, ‘S’, ‘ad’) true
(o ,i, i) frontchar (X, ‘S’, ‘ad’) X=”Sad”
Используется для преобразования строки в список символов
convert (" ", [ ]).
convert (Str, [H|T]):- frontchar (Str, H, Ost), convert (Ost, T).
Прверка на строку
isname (строка) (string) : (i)
Имена испоьзуются для
обозначения символических
Формирование атомов из строк
fronttoken (Строка, Атом, Остаток) (string, string, string) : (i, o, o) (i, i, o) (i, o, i) (i, i, i) (o, i, i)
Атом – последовательность символов, имеющих смысл. Атомы могут быть : именем ТП, строчным представлением числа, отдельным символом (кроме пробела).
(i, i, o) fronttoken ("Go to cursor”, X, Y) X=”Go” Y=”to cursor”
Турбо Пролог обеспечивает
все возможности обработки
Для открытия файлов в ТП существует четыре предиката:
openwrite(log_name, DOS_name),
openread(log_name, DOS_name),
openmodify(log_name, DOS_name),
openappend(log_name, DOS_name).
Предикаты open... устанавливают связь между внешним (для Пролога) DOS-именем файла и его внутренним (логическим) именем, используемым в пределах программы. Предикат openwrite создает новый файл и открывает его для записи, предикат openread открывает существующий файл для чтения, предикат openmodify открывает файл для чтения и записи, а предикат openappend- для добавления информации в конец существующего файла.
Для активизации объявленных файлов используются предикаты writedevice и readdevice. Предикат writedevice (log_name) выполняет переадресацию вывода в указанный файл, а предикат readdevice (log_name) производит переадресацию ввода с указанного файла. Для завершения работы с открытым ранее файлом используется предикат closefile (log_name).
В ТП следующие имена стандартных устройств ввода-вывода зарезервированы:
screen - стандартный вывод на экран (stdout);
keyboard - стандартный ввод с клавиатуры (stdin);
printer - вывод на устройство печати;
com1 - ввод-вывод через порт.
Все остальные логические имена будут восприниматься ТПкак имена файлов. Логические имена файлов должны быть объявлены в разделе domains при помощи ключевого слова file, например:
file=inp_file1; inp_file2; out_file.
Строка объявления типа объектов file имеет две особенности. Во-первых, ключевое слово file расположено, в отличие от описателей других типов данных, в начале строки. Во-вторых, имена типов разделяются точками с запятой, а не запятыми. Объявлять перечисленные выше зарезервированные устройства ввод-вывода не требуется.
Для выдачи информации на текущее устройство вывода используются стандартные предикаты ТП:
write (A1, A2,...);
writef ("формат ", A1,A2,...),
здесь А1,А2,...-аргументы
% d - число со знаком (для типов char и integer);
% u - число без знака (для типов char и integer);
% X - шестнадцатеричное число (тип string);
% x - шестнадцатеричное число (для типов char и integer);
% S - строка символов ( типы symbol и string);
% c - одиночный символ (типы char и integer);
% g - действительное число в минимальном формате (тип real);
% e - экспоненциальная форма действительного числа;
% f - действительное число с фиксированной точкой.
Кроме того, в предикатах вывода могут использоваться следующие управляющие символы:
\n - переход на новую строку;
\t - табуляция вывода;
\xxx - вывод символа с кодом ххх.
Для приема информации различного типа с текущего устройства ввода в ТП существует группа предикатов:
readchar (char),
readint (integer),
readln (string),
readreal (real),
которые выполняют ввод значений в переменные типов char, integer,string и real соответственно.
Структурная схема программы представлена на рисунке А1 графической части проекта. Схема состоит из следующих элементов:
В подготовленной программе используются следующие предикаты:
min(L,Min)(string*,string):(i,
del_min(Min1,L,L1)(string,
read_list1(L)(string*):(o)-
read_write 1– предикат отвечающий за открытие файла для чтения, вывода его на экран, вызова процедур поиска двух минимальных строк файла и вывода их на экран.
read_write – предикат читающий 3 файла, выводящий их на экран, записывающий их в 4 файл и выводящий его на экран.
kratn(N,L,L1)(integer,integer*
max(L,Max)(integer*,integer):(
read_list(L)(integer*):(o)-
del_max(Max1,L,L1)(integer,
razbivka(S,S1,S2)(string,
proverka(Str,N)(string,N):(i,
сreatemenu – создает форму меню.
menu – заполняет меню содержимым и принимает выбор пункта пользователя с клавиатуры.
selects(Number)(integer):(i)-
domains
i=integer
s=string
il=integer*
sl=string*
file=tf;df
predicates
min(sl,s)
del_min(s,sl,sl)
read_list1(sl)
read_write1
read_write
kratn(i,il,il)
max(il,i)
read_list(il)
del_max(i,il,il)
razbivka(s,s,s)
proverka(s, i)
createmenu
menu
selects(i)
goal
createmenu.
clauses
%процедура создания окна и вызова меню
createmenu:-
makewindow(1,2,7,"Proga",0,0,
clearwindow,
menu.
%вывод содержимого меню и выбор действия
menu:-
cursor(2,0),
write(" 1 - Razbienie stroki po granice slova."),nl,
write(" 2 - Podschet kolichestva cifr v stroke."),nl,
write(" 3 - Dva naibolshih elementa v spiske."),nl,