Последний раз редактировалось igrokk 02.05.2013, 21:58, всего редактировалось 1 раз.
Вот теория по этой лабе которую нам в институте дали:
Теоретическая часть
1. Предикаты вывода.
В Прологе имеются три стандартных предиката для вывода: write, nl, writef. Предикат write(P1, P2,...Pn) имеет произвольное число аргументов P1,P2..Pn. Эти аргументы могут быть либо константами, либо связанными переменными. Предикат nl (new line - новая строка) обеспечивает переход на новую строку на экране. Внутри строки вместо nl записывается \n. Предикат writef позволяет выполнить форматированный вывод.
Пример. Следующие подцели:
pupil (Name, Class), write (Name," успешно перешёл в ",Class," класс."), nl, write ("-------------------------------"). могут привести к выводу на экран такого результата: Орлов успешно перешел в 7 класс. ------------------------------------------- Пример.
% "Распечатка списка без квадратных скобок. domains intlist = integer* namilist = symbol* predicates writelist (intlist) writelist (nameilist) clauses writelist ([ ]). Writelist ([ H | T ]) :- write (H," "), writelist (T).
Цель для вывода списка целых чисел: goal writelist ( [1,2,3,4] ). Поработайте с этой программой и выведите на экран список целых чисел и список фамилий. Обратите внимание на использование в программе рекурсии.
В предикате форматированного вывода Writef (FormatString,P1,P2,...,Pn) (i,i,...i) строка форматирования FormatString содержит обычные символы и форматные спецификаторы. Форматные спецификаторы имеют форму %-m.pq. Символы спецификаторов формата, следующие за знаком процента, являются необязательными и имеют следующее значение: дефис (-) показывает, что поле выравнивается слева (по умолчанию выравнивается справа); m - десятичное число, определяющее минимальную длину поля; p - десятичное число, описывающее точность представления с плавающей точкой, либо максимальное число символов, печатаемых в строке; q - описывает форматы, отличные от форматов, принятых по умолчанию для данного объекта. Значения q: f -вещественные с фиксированной точкой (пример: 123.4), e -вещественные в экспоненциальной форме (пример: 1.234e2), g -вещественные в формате f или e (формат по умолчанию), d -символьные или целые как десятичные числа, u -символьные или целые как беззнаковые целые, x -символьные или целые как шестнадцатиричные числа, c -символьные или целые как символы, X -длинное шестнадцатеричное число, s -строки (symbol и string). Поработайте с программой “Демонстрация предиката writef”. % :Демонстрация предиката writef. goal A = 330.12, B = 4.3333375, writef ("A = % 8.4e ", A), nl, writef("B = %-7.4”, B).
Результаты вывода: A = 3.3012E+02 B = 4.3333. Предикаты ввода
Пролог имеет пять стандартных предикатов ввода: readln, readint, readreal, readchar (для чтения строк символов, целых, вещественных и символьных значений) и readterm (для чтения составных объектов). Все эти предикаты могут быть переопределены для чтения из файлов. Имеются и другие предикаты, относящиеся к категории чтения: Буквы “o” и “i” после предикатов обозначают выходные и входные значения переменных в рассматриваемых ниже предикатах.
readln (Line) - (o). Читает текстовую строку до 127 символов. Домен для переменной Line должен быть строкового либо символьного типа. Переменная Line должна быть свободна. Буква (о) означает, что переменная в скобках - выходная величина. ======================================================= readint (X) - (o) Считывает целое значение. Домен для переменной X должен быть целого типа, а X перед вызовом должна быть свободна. ======================================================= readreal (X) - (o), readchar (CharParam) - (o) Предикат readreal cчитывает вещественные числа аналогично readint, считывающему целые. Предикат readchar считывает один символ с текущего устройства ввода. ======================================================= file_str (Filename,Text) - (i,o), (i,i) Читает символы из файла и переносит их в переменную или создает файл и записывает в этот файл строку. Если перед вызовом file_str переменная Text свободна, file_str читает символы из файла Filename, пока не встретится символ конца файла. Содержимое файла Filename пересылается в переменную Text. Например, вызов file_str("t.dat", Myext) свяжет Myext с содержимым файла t.dat. Читаемый файл не может превышать 64 Кбайт. ======================================================= inkey (Char) - (o) Читает символ с клавиатуры. Если, когда вызывается inkey, клавиша нажата или символ содержится в буфере клавиатуры, то inkey возвратит аргумент, которому присвоено значение символа. ======================================================== keypressed Проверяет, была ли нажата клавиша на клавиатуре. Предикат keypressed завершается успешно, если клавиша нажата или символ присутствует в буфере клавиатуры.
Разберите и выполните программу чтения в список целых чисел. Эта программа демонстрирует использование предиката readint. Она читает одно целое число на строке, пока вы не введете не целое ( не нажмете клавишу Х ). После этого список будет выведен на экран. Преобразуйте эту программу для чтения в список фамилий писателей.
% Чтение целых чисел и преобразования их в список. domains list = integer* predicates readlist (list) goal makewindow (1,7,7,"Список целых чисел",5,5,15,70), write ("Введите в список целое число: "), nl, write ("Нажмите клавишу Х для окончания ввода."), readlist (TheList), write( "\nСписок : ", TheList). clauses readlist ( [H|T ]) :- write("\16"), %Печать символа-приглашения. readint (H), !, readlist (T). readlist ([ ]).
Файловая система Пролога Рассмотрим файловую систему Пролога и стандартные предикаты для работы с файлами. Обычно текущим устройством чтения является клавиатура, а текущим устройством записи - экран дисплея. Однако вы можете назначить другие устройства. Например, ввод может осуществляться из файла, а вывод посылаться на устройство печати. Для доступа к файлу сначала нужно открыть его. Файл может быть открыт для чтения, для записи, для добавления, для модификации. Файл, открытый для любого действия, отличного от чтения, должен быть закрыт, когда этот вид операций завершается. В противном случае внесенные в файл изменения могут быть потеряны. Можно открыть несколько файлов одновременно. Когда Пролог открывает файл, он связывает символическое имя с действительным именем файла операционной системы ДОС. Символическое имя используется для направления ввода и вывода. Символические имена файлов должны начинаться с маленькой буквы и должны быть объявлены в описании домена file.
Например: file = file1; source; auxiliary
Пролог распознает семь зарезервированных символических имен файлов. Открывать и закрывать их не требуется.
com1 -запись в стандартный коммуникационный порт; keyboard - чтение с клавиатуры (по умолчанию); printer - запись в параллельный порт устройства печати; screen - запись в экранный монитор (по умолчанию); stdin - чтение из стандартного ввода ДОС; stdout - запись в стандартный вывод ДОС; stderr - запись на стандартное устройство для вывода ошибок ДОС.
Предикаты открытия и закрытия файлов Разберите и выполните программу записи текста с клавиатуры в файл. Программа помещает символы, набираемые с клавиатуры, в файл tryfile.one пока не будет введен знак ‘#’. Набираемые символы на экран дисплея не выводятся.
% Запись текста с клавиатуры в файл. domains file = myfile predicates readloop goal openwrite(myfile,"tryfile.one"), writedevice(myfille), readloop, losefile (myfile). clauses readloop :- readchar (X), X<>' # ', !, write (X), readloop. readloop.
filepos(SymbolicFileName, FilePosition, Mode) - (i, i, i),(i, o, i) ================================================== Может управлять позицией, где производится чтение или запись. Если FilePosition - связанная переменная, предикат может изменить позицию чтения и записи для файла. Если при вызове FilePosition является свободной переменной, то SymbolicFileName возвращает текущую позицию в файле. FilePosition дожна иметь вещественное значение (любая дробная часть игнорируется). Mode является целым числом и указывает, как должно интерпретироваться значение FilePosition:
Mode FilePosition ---- ----------------------------------------------------------------- 0 Относительно начала файла. 1 Относительно текущей позиции. 2 Относительно конца файла. (Конец файла соответствует позиции 0.)
Когда возвращается FilePosition, filepos возвращает позицию относительно начала файла. Замечание: При использовании filepos новая строка в файле считается как два символа. Создайте текстовый файл. Разберите и выполните следующую программу:
% Чтение выбранных позиций в файле. Файл prog9_5.pro. % Программа запрашивает имя файла, затем показывает содержимое % позиций файла, причем номера позиций вводятся с клавиатуры.
domains file = input predicates inspect_positions goal write("Введите имя файла : "), readln (FileName), openread (input, FileName), inspect_positions. clauses inspect_position :- readdevice(keyboard), nl, write ("Номер позиции : "), readreal (X), readdevice (input), filepos (input,X,0), readchar (Y), write ("Символ: ",Y), inspect_positions. ======================================================
Создайте файл с предикатами. Разберите следующую программу и поработайте с ней. % Чтение данных из файла. domains nam,addr = string one_data_record = p(name,addr) file = file_of_data_records predicates person (name, addr) moredata(file) clauses person (Name, Addr) :- openread (file_of_data_records,"dd.dat"), readdevice (file_of_data_records), moredata (file_of_data_records), readterm (one_data_record, p(Name,Addr)). moredata (_). moredata (File):- not(eof (File)), moredata (File).
Если файл dd.dat содержит факты: р("Петр","Невский34-28"), р("Олег","Литейный 45-30"), то после выполнения программы может протекать диалог goal: p (“Петр”, Adress). Address = Невский 34-28 1 Solution
С фактами, которые описываются предикатами базы данных, можно работать благодаря домену dbasedom (который автоматически объявляется Прологом) или любому, определенному пользователем, имени домена базы данных.
-- 02.05.2013, 22:58 --
Помогите народ( весь интернет перерыл подобного не нашел чтобы под мою похоже было
|