Списки, строки, файлы

Автор работы: Пользователь скрыл имя, 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

Файлы: 1 файл

пояснительная.docx

— 507.69 Кб (Скачать файл)

[ ]

[конкретный, человек, [любит,  ловить, рыбу]]

[а, 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('+'),s("раму"),

i(48),c('!')]

 

Дадим рекурсивное определение  списка: список — это структура данных, определяемая следующим образом:

  1. пустой список ([ ]) является списком;
  2. структура вида [H|T] является списком, если H — первый элемент списка (или несколько первых элементов списка, перечисленных через запятую), а T — список, состоящий из оставшихся элементов исходного списка.

 

 

    1. Строки

 

Под строкой в Прологе понимается последовательность символов, заключенная в двойные кавычки.

При прогарммировании на Прологе символы могу быть записаны при помощи кодов 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”

 

 

    1. Файлы

 

Турбо Пролог обеспечивает все возможности обработки информации, содержащейся в файлах на внешних носителях. В языке ТП содержится ряд стандартных предикатов, обеспечивающих создание, открытие и закрытие файлов, чтение из файла и запись в файл.

Для открытия файлов в ТП существует четыре предиката:

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. СТРУКТУРНАЯ СХЕМА ПРОГРАММЫ

 

Структурная схема программы  представлена на рисунке А1 графической  части проекта. Схема состоит  из следующих элементов:

      1. Создание и отображение пользовательского меню
    1. Вызов процедуры разбиения строки и вывод содержимого на экран
      1. Процедура разбиения строки по две приблизительно одинаковые по границе слова
    2. Процедура вызова и отображения количества цифр в строке
  1. Процедура подсчета в строке количества числовых символов
    1. Процедура поиска максимального цифрового элемента в списке
  2. Процедура создания списка из введенных значений
  3. Процедура поиска максимального элемента в списке
  4. Создание нового списка в котором отсутствует первый максимальный элемент
    1. Процедура поиска в списке чисел, кратных заданному
  5. Процедура создания списка из введенных значений
  6. Процедура поиска чисел, кратных заданному
    1. Процедура вызова процедуры записи трех файлов в один
  7. Процедура вывода на экран и записи трех файлов в один
    1. Процедура поиска и вывода на экран двух минимальных строк текстового файла
      1. Процедура создания списка из введенных значений
      2. Процедура поиска минимального элемента списка
      3. Процедура создания нового списка без первого максимального элемента
      4. Процедура чтения и вывода на экран двух минимальных строк файла
      5. Процедура выхода из программы

 

  1. ОПИСАНИЕ ПРЕДИКАТОВ

 

В подготовленной программе  используются следующие предикаты:

min(L,Min)(string*,string):(i,o) -  поиск минимального элемента посредством сравнения каждого последующего элемента с предыдущим списка L , и вставки его в переменную Min.

del_min(Min1,L,L1)(string,string*,string*):(i,i,o) – создание нового списка L1 из старого L без не записывая в него элемент Min1.

read_list1(L)(string*):(o)-предикат создания списка L методом построчного чтения из текстового файла(readln(df)).

read_write 1– предикат отвечающий за открытие файла для чтения, вывода его на экран, вызова процедур поиска двух минимальных строк файла и вывода их на экран.

read_write – предикат  читающий 3 файла, выводящий их на экран, записывающий их в 4 файл и выводящий его на экран.

kratn(N,L,L1)(integer,integer*,integer*):(i,i,o) – предикат ищущий в списке L числа кратные N и записывающий их в новый список L1.

max(L,Max)(integer*,integer):(i,o)- поиск максимального элемента посредством сравнения каждого последующего элемента с предыдущим списка L , и вставки его в переменную Max.

read_list(L)(integer*):(o)-предикат создания списка L методом построчного чтения того что ввел пользователь с клавиатуры.

del_max(Max1,L,L1)(integer,integer*,integer*):(i,i,o) – создание нового списка L1 из старого L без не записывая в него элемент Max1.

razbivka(S,S1,S2)(string,string,string):(i,o,o)- деление строки S на две приблизительно равные S1 и S2 по границе слова.

proverka(Str,N)(string,N):(i,o)-предикат исчет в строке Str каждый последующий цифровой элемент, и при получении оного прибавляет N+1.

сreatemenu – создает форму меню.

menu – заполняет меню содержимым и принимает выбор пункта пользователя с клавиатуры.

selects(Number)(integer):(i)-предикат выбора исполнения процедуры.

 

 

  1. ТЕКСТ ПРОГРАММЫ

 

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,25,80),

    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,

Информация о работе Списки, строки, файлы