Программирование на языке Пролог
Особенности языка логического программирования Visual Prolog, характеристики его нестандартных доменов и командного меню. Рекурсия и итерация в языке Пролог, обработка структур данных. Организация многооконного меню и основы работы с файловой системой.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | лабораторная работа |
Язык | русский |
Дата добавления | 14.10.2014 |
Размер файла | 239,6 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
rel(number,list,list).
clauses
sort([],[]).
sort([X|T],S1):-sort(T,S2),rel(X,S2,S1).
rel(X,[Y|S1],[Y|S2]):-cord(X,Y),!,rel(X,S1,S2).
rel(X,S1,[X|S1]).
cord(X,Y):-X>Y.
goal
sort([3,6,2,9],S).
Результатом будет список S=[2,3,6,9].
Удаление дублирующих элементов
При работе со списками нередко возникают списки с дублирующими элементами. В связи с этим появляется задача удаления дубликатов из списка. Для ее решения можно предложить следующий предикат:
delete(S1,S2),
где S1 - исходный список, возможно содержащий дубликаты;
S2 - выходной список, без дублирующих элементов.
Если исходный список пустой, то выходной тоже пуст. Если же исходный список не пустой, то он представляется в виде головы и хвоста списка проверяется, принадлежит ли голова списка хвосту. Если да, то это значит, что в хвосте есть дубликат головы, и тогда выходной список формируется из хвоста списка. Если же нет, то это значит, что голова дубликатов не имеет. И тогда, и только тогда (ибо использована операция отсечения ('!') ) происходит переход ко второму предложению, включающему голову списка в выходной список и формирующему хвост выходного списка из хвоста исходного списка. Для проверки принадлежности элемента хвосту списка используется уже описанный ранее предикат member.
Пример. Удалить из списка дубликаты элементов.
domains
listsymb=symbol*
predicates
delete(listsymb,listsymb).
member(symbol,listsymb).
clauses
delete([],[]).
delete([X|S1],S2):-member(X,S1),!,delete(S1,S2).
delete([X|S1],[X|S2]):-delete(S1,S2).
member(X,[X|_]).
member(X,[_|T]):-member(X,T).
goal
delete([tom,mary,tom,pat,pat,tom],L).
Результатом будет список L=[mary,pat,tom].
Задание на лабораторную работу
1. Изучить способы обработки списков в Турбо-Прологе.
2. В соответствии с вариантом задания, определенным преподователем разработать и отладить пролог-программу задания.
3. Оформить отчет с указанием варианта задания, текстом программы и протоколом ее выполнения.
5. Использование структур
Цель работы
Изучение представления структур и организации ввода, вывода данных в Турбо-Прологе. Разработка пролог-программ обработки структур данных.
Структуры Пролога
Для представления структурированных (составных) данных в Прологе используются списки и структуры. Близким аналогом прологовских структур в алгоритмических языках (например Си и Паскале) являются записи. Важной особенностью структур, обуславливающее их широкое применение, является компактное представление сложно организованных данных.
Структуры - это объекты, которые состоят из нескольких компонент, возможно разных типов. Этими компонентами могут быть константы, переменные и, в свою очередь, структуры.
Структура состоит из функтора (имени) и последовательности компонент заключенных в круглые скобки и разделенных запятыми.
Число компонент структуры называется размерностью структуры или арностью структуры. Две структуры имеют идентичную организацию, если у них одинаковые функторы и размерность. Пролог допускает структуры с разным числом компонент и одинаковыми функторами. Это будут структуры с разной организацией.
Описание структур а Турбо-Прологе
Турбо-Пролог требует описания используемых структур. Это осуществляется в разделе domains введением имени домена (имени типа) для структур с идентичной организацией. При этом, после функтора в скобках указываются имена домен (типы компонент).
Например:
domains
data=date (day,month, year)
month=string
day, year= integer
person=person(name, address, telno)
address, telno=string
name=(string, string, string)
Введенные имена домен структур используются далее в программе при описании предикатов, имеющих в качестве аргументов эти структуры. Имя домена и функтор могут совпадать (person). Турбо-Пролог их различает из контекста.
Альтернативные домены
В общем случае описание типов структур в Турбо-Прологе выглядит следующим образом:
<domain> = <alternative1> (D11, D12,... ); <alternative2> (D21, D22,... ); ...,
где <domain> - имя типа /имя домена/ ;
<alternative1>, <alternative2>, ...- равноправные, но различные функторы;
(D1, D12,...),(D21, D22,...),...- список типов компонент структур (типы стандартные или определяемые пользователем).
Каждая альтернатива включает функтор и, возможно, список областей для соответствующих компонент. Альтернативные домены позволяют вводить общее имя типа данных для структур с разными именами (функторами). Это дает возможность определить единый предикат, обрабатывающий эти разнородные структуры. В случае отсутствия такой возможности пришлось бы определять свои предикаты обработки структур для каждой альтернативы.
Формирование списка структур
В программе в виде фактов info хранится информация о результатах тестирования ряда лиц. Тест содержал 11 вопросов. Порядок задания вопросов мог варьироваться. Тестируемый мог ответить на вопрос (верно или неверно) или не отвечать. Ответы на тест представлены в виде списка, содержащего 1, если ответ верен, и 0, если ответ неверен. У разных лиц списки могут быть различной длины: от пустого (не смог ответить ни на один вопрос) до списка, содержащего одиннадцать элементов. Информация: лицо и его ответы представлены в виде структуры. Требуется найти тех, кто ответил более чем на половину вопросов и сформировать из них список структур .
domains
test=t(name, result)
name=string
result=integer*
number=integer*
list=test*
predicates
info (number, test).
len(result).
p(test).
do(list).
clauses
info(1, t(“tom”,[1, 0, 1, 1, 0]).
info(2, t(“bob”, [ ]).
info(3, t(“ann”,[0, 0, 1, 1, 1, 1, 0]).
p(t(_, X)):-info(_, t(_, X)), len(X, N), N>3.
len([ ], 0).
len([H|T], N):-len(T, N1), N=N1+1.
do(L):-findall(X, p(X), L).
С помощью предиката р выявляются лица, ответившие более чем на половину вопросов. Предикат len используется для определения длины списка ответов. Цель программы предикат do формирует список структур, удовлетворяющих требованиям задачи.
Предикат управления курсором
В приведенной программе вводятся функторы для обозначения различных горизонтальных и вертикальных перемещений курсора по экрану. В примере используется встроенный предикат управления курсором cursor (Row, Column), который перемещает курсор в позицию (Row - строка, Column - столбец) экрана. Если Row и Column свободные переменные, то они получают значения текущей позиции курсора.
domains
step =integer
movement =up(step); down(step); left(step); right(step); no
predicates
move_cursor(movement).
clauses
move_cursor(up(step)):-cursor(R, C), R1=R-Step, cursor(R1, C).
move_cursor(down(step)):-cursor(R, C), R1=R+Step, cursor(R1, C).
move_cursor(left(step)):-cursor(R, C), C1=C-Step, cursor(R, C1).
move_cursor(up(step)):-cursor(R, C), C1=C+Step, cursor(R1, C1).
move_cursor(no):-cursor(R, C).
Функторы структур определяют направление перемещения курсора по экрану от его текущего положения up-вверх, down-вниз, left-влево, right-вправо, no-на месте. Величину перемещения определяет компонента структуры Step-шаг.
С помощью домена movement (движение), описывающего различные виды перемещения курсора по экрану, вводится предикат move_cursor -переместить курсор, осуществляющий перемещение курсора на указанное число позиций Step в указанном направлении (за счет выбора функтора).
Перемещение курсора выполняется следующим образом: определяется текущее положение курсора (cursor(R,C)), вычисляется новое положение курсора ((R1,C) или (R, C1)); производится перемещение курсора в новое положение (cursor(R1,C) или cursor(R,C1)).
Пример ввода и вывода элементов списка
Требуется ввести ряд целых чисел, сформировать из них список, вывести его на экран как единое целое и поэлементно .
domains
list=integer*
predicates
input(list, list).
read(list, list).
loop(list, list).
print(list).
work.
clauses
work:-input([ ], L), nl, nl, write(“Список L=“, L), nl, nl,
write(“Состоит из элементов:”), nl, print(L).
input(L,L2):-write(“Введите элемент:”), read(L,L1),
write(“Будите еще вводить ? (y/n):”), loop(L1,L2).
read(L,[X|L] ):-readint(X), ! .
read(L,L).
loop(L,L):-readchar(Ch), Ch=`n', ! .
loop(L1,L2):- nl, input(L1, L2).
print( [X|L] ):-write(X), nl, print(L).
print([ ]).
Предикат work осуществляет всю необходимую по условию задачи работу.
Предикат input(L1,L2) вводит данные и, включая их в исходный список L1, формирует выходной список L2. Ввод элемента и включение его в список осуществляется оператором read. Если при вводе элемента произошла ошибка, то исходный список сохраняется. Предикат input после ввода каждого элемента спрашивает о продолжении ввода. Если ввод окончен, то необходимо нажать клавишу ` n '. Анализ введенного символа и выбор последующих действий осуществляет оператор loop. Предикат print осуществляет поэлементный вывод списка.
Пример ввода структурных данных и их обработка
Требуется ввести для ряда лиц данные в виде структуры, содержащей имя и возраст, и подсчитать средний возраст.
domains
person=p(name, age)
name=string
age,sum=integer
mean=real
predicates
readperson(person).
run(sum, sum, sum, sum).
do(mean).
clauses
readperson (p(Name, Age)):-
write(“Имя:” ), readln(Name)<
write(“Возраст:” ), readint(Age) .
run(S, N1, S2, N2):-
write(“Будите вводить ? (y/n):”), readchar(Ch), nl,
Ch=` y ', !, readperson(p(_ , A)) ,
S1=S+A, N1=N1+1, run(S1, N1, S2, N2).
run(S, S, N, N) .
do(V):-run(0, S, 0 ,N), N<>0, !, nl, V=S/N .
do(0).
Всю работу, определяемую условием задачи, выполняет предикат do, аргументом которого и является искомый средний возраст, вычисляемый по введенным исходным данным .
Предикат readperson осуществляет ввод данных, касающихся одного лица, формирует из них структуру p(Name, Age).
Предикат run спрашивает о наличии сходных данных. Для подтверждения необходимо нажать клавишу ` y '. В противном случае следует нажать любую другую клавишу, что приведет к прекращению ввода. При наличии исходных данных, происходит их ввод с помощью предиката readperson. Введенный возраст (А) прибавляется к накапливаемой сумме возрастов: S - значение суммы до ввода текущего данного, S1- сумма после ввода и прибавления А к S, счетчик числа введенных данных увеличивается на единицу ( N - количество данных до ввода, N1 - после ввода).
В рассмотренном примере для ввода структуры вместо предиката readperson можно было бы воспользоваться встроенным предикатом readterm. Тогда изменение программы состояло бы в следующем: убрать из программы описание и определение предиката readperson; в предикате run заменить вызов readperson(p( _, A)) на readterm(person,p( _,A)); исходные данные набирать с указанием функтора (имени структуры), например p(“Сергей” , 18).
Задание на лабораторною работу
1. Изучить представление структур и организацию ввода / вывода данных в Турбо-Прологе.
2. В соответствии с вариантом задания, определенным преподавателем, составить пролог-программу.
3. Оформить отчет с указанием варианта задания, текста программы и протокола выполнения программы.
6. Организация многооконного меню и работа с файлами в Турбо-Прологе
Цель работы
Изучение файловой системы Турбо-Пролога, работы с файлами последовательного и прямого доступов, способов организации многооконных меню. Разработка пролог-программ обработки файлов с созданием среды пользователя с помощью многооконных меню.
Составными частями компьютера являются устройства ввода/вывода, используемые программой на Турбо Прологе во время ее работы.
Аналогично встроенный предикат WriteDevice (<имя устройства или логического файла>) осуществляет переадресацию каналов вывода информации на указанное устройство вывода или файл.
Пример.
readdevice(com1).
readdevice(dat.dat).
настраивают канал ввода на коммуникационный порт com1 и логический файл dat.dat соответственно, а предикаты
writedevice(screen).
writedevice(printer).
настраивают канал вывода на экран и принтер.
В Турбо-Прологе по умолчанию каналу ввода назначается устройство ввода - клавиатура, а каналу вывода - экран монитора. Если эти назначения не устраивают, то необходимо воспользоваться предикатами переадресации каналов ввода и вывода.
Чтобы иметь доступ к файлу, его надо открыть. Файл может быть открыт четырьмя способами:
- для чтения используется предикат
- для записи используется предикат
- для добавления используется предикат
- для модификации используется предикат
Файл, открытый для любых действий, кроме чтения, должен быть закрыт, когда действия закончены, в противном случае внесенные изменения могут быть утеряны. Для закрытия файла используется встроенный предикат closefile (<имя логического файла>).
Одновременно можно открыть несколько файлов, и канал ввода/вывода можно быстро переадресовать между открытыми файлами. Больше времени требуется на то, чтобы открыть и закрыть файл, чем на переадресацию канала ввода/вывода между ними.
После того, как файл открыт, Турбо-Пролог связывает имя логического файла с именем физического файла. Имя физического файла - это имя файла в операционной системе (ОС). Логическое имя файла Турбо-Пролог использует при переадресации канала ввода/вывода. Имя логического файла есть идентификатор и должно начинаться с маленькой буквы и объявлено в разделе domains после ключевого слова file. Объявление одного имени логического файла выглядит как
domains
file=<имя логического файла>,
domains
file=<имя логического файла1>;<имя логического файла2>...
В программе может быть только одно поле объявления файлов - file.
Турбо-Пролог автоматически заранее объявляет четыре имени:
- printer (относится к параллельно-печатающему порту);
- screen (относится к экрану монитора);
- keyboard (относится к клавиатуре);
- com1 (относится к последовательному порту связи).
Эти имена не должны появляться при объявлении файлов.
Организация обработки файлов
В наиболее общем виде запись информации в файл может быть представлена следующей последовательностью действий:
openwrite(datafile,"Dat.dat"),
writedevice(datafile),
<предикаты записи в файл>,
<любые предикаты>,
closefile(datafile).
Для чтения информации из файла может служить следующий фрагмент:
openread(datafile,"Dat.dat"),
readdevice(datafile),
<предикаты чтения из файла>,
<любые предикаты>,
closefile(datafile).
Кроме записи и чтения информации в файл, в Турбо-Прологе возможно выполнение модификации уже существующего файла (и запись и чтение) и добавление информации в конец файла. В наиболее общем виде эти действия можно представить следующими фрагментами.
Модификация файла:
openmodify (datafile,"Dat.dat"),
readdevice(datafile),
writedevice(datafile),
<предикаты для выборочного чтения и записи в файл>,
<любые предикаты>,
closefile(datafile).
openappend(datafile,"Dat.dat"),
writedevice(datafile),
<предикаты для дозаписи в файл>,
<любые предикаты>,
closefile(datafile).
Предикаты Турбо-Пролога для работы с файлами
Для работы с файлами в системе Турбо-Пролог имеются следующие предикаты. Здесь физический файл открывается для чтения. Если файл не найден, то предикат не выполняется (не успешен). Если имя физического файла является недопустимым, то сообщается об ошибке.
openwrite (<имя логического файла>,<имя физического файла>).
Физический файл открыт для записи. Если файл существует, то он очищается. Если нет, то он создается и заносится в текущий каталог ОС.
openappend (<имя логического файла>,<имя физического файла>).
Физический файл открыт для добавления информации в конец файла. Если файл не найден, то выводится сообщение об ошибке.
openmodify (<имя логического файла>,<имя физического файла>).
Физический файл открыт для чтения и записи. Предикат openmodify может использоваться со стандартным предикатом filepos для обновления файлов прямого доступа.
closefile (<имя логического файла>).
Предикат закрывает файл, т.е. разрывает связь логического файла с физическим. Даже если файл не был открыт, ошибки не будет.
readdevice (<имя устройства или логического файла>).
Переадресовывает канал ввода на указанное устройство или файл, открывая их для чтения. Если имя логического файла было свободно, то оно связывается с текущим назначением канала ввода.
writedevice (<имя устройства или логического файла>).
Переадресовывает канал вывода на указанное устройство или файл, открывая их для записи или добавления. Если имя логического файла было свободно, то оно связывается с текущим назначением канала вывода.
existfile (<имя физического файла>).
Предикат успешен, если файл с указанным именем существует.
eof(<имя логического файла>).
Предикат успешен, если достигнут конец файла, и не успешен в противном случае.
В Турбо-Прологе имеется ряд других стандартных предикатов для работы с файлами. Описание этих предикатов приводится в соответствующей литературе по Турбо-Прологу.
domains
file=dataFile
predicates
check(string).
wr_lines.
clauses
wr_lines:- readln(X),
write(X),nl,
writedevice(datafile),
write(X),nl,
writedevice(screen),
check(X).
wr_lines.
check("end"):-!.
check(_):-fail.
goal
openwrite(datafile,"Dat.dat"),
wr_lines,
closefile(datafile).
Обрабатываемая информация вводится с клавиатуры построчно.
Последняя строка - end.
Чтение данных из файла и вывод их на экран
domains
file=datafile
predicates
read_write.
goal
openread(datafile,"Dat.dat"),
readdevice(datafile),
read_write,
closefile(datafile).
clauses
read_write:- not(eof(datafile)),
readln(Line),
write(Line),nl,
read_write.
read_write.
Файлы прямого доступа
Файл прямого доступа - это файл, позволяющий работать с произвольной записью в нем без предварительного чтения предыдущих записей. Файлы, где нельзя без этого обойтись, называются файлами последовательного доступа. Файлы, рассматриваемые до сих пор, были именно таковыми.
В файлах прямого доступа все записи имеют одинаковую длину. Указатель перемещается по позициям кратным длине записи, он указывает всегда на начало очередной записи. Турбо-Пролог содержит встроенный преди- кат, который удобен для работы с файлами прямого доступа: filepos.
filepos (<имя логического файла>,<позиция в файле>,<режим>).
<Режим> может иметь одно из трех значений: 0, 1, 2. Эти значения определяют как будет ориентировано значение аргумента
< Позиция в файле> Определяется по таблице 3.
Пример обработки файла прямого доступа
Работа с файлами прямого доступа требует знания структуры этого файла.
Нужно знать, к примеру, длину каждой записи файла, число записей, начальную позицию первой записи.
Приведем программу чтения n-ой записи из файла прямого доступа.
Номер, интересуемой записи, вводится по запросу с клавиатуры. Предполагается, что длина каждой записи 40 позиций, начальная позиция первой записи нулевая и число записей равно 100.
domains
file=f
predicates
read_file
clauses
read_file:-
write("Введите имя файла: "),nl,
readln(F),
openmodify(f,F),
write("Введите номер записи: "),nl,
readint(N),
N>0,N<=100,!,
I=(N-1)*40,
readdevice(f),
filepos(f,I,0),
readln(C),
write(C),nl,nl,
write("Нажмите пробел"),nl,
readdevice(keyboard),
readchar(_),
closefile(f).
read_file:-write("** Ошибка ввода **").
goal
read_file.
В случае указания несуществующего имени физического файла или указания несуществующего номера записи в файле печатается сообщение об ошибке ввода.
Предикаты для работы с окнами
Для организации удобного интерфейса пользователя с пролог-программой в Турбо-Прологе имеется ряд стандартных предикатов для работы с окнами.
Предикат для создания окон
makewindow(Window_number,
Screen_attribute,
Frame_attribute,
Frame_string,
Starting_row,
Starting_column,
Window height,
Window_width).
Параметр Window_number, целое число, идентифицирует окно в программе. Это число используется в качестве ссылки предикатом shiftwindow и др. В данной программе организуется 5 различных окон, т.е. значение параметра Window_number будет изменяться от 1 до 5.
Целочисленные значения Screen_attribute задают комбинацию цветов текста и фона в окне. Для создаваемых окон выбраны белые символы на черном фоне, т.е. значение параметра Screen_attribute=7.
Для цветного экрана параметр формируется по формуле screen_attribute = S+A, где S - цвет текста, а A - цвет фона (таблица 4).
Для вывода символов с мерцанием параметр формируется по формуле
screen_attribute = S+A+128.
Аргумент Frame_attribute есть целое число, значение которого задает цвет рамки (таблица 5). Для белой рамки Frame_attribute=7.
Аргумент Starting_row - целое число, определяющее верхнюю строку (лишнюю) создаваемого окна.
Аргумент Starting_column - целое число, указывающее крайний левый столбец окна. Аргумент Window_height - целое число, определяющее количество строк, занимаемых создаваемым окном.
Аргумент Window_width - целое число, указывающее число столбцов занимаемых окном.
Предикат смены текущего окна
shiftwindow(Window_number).
Параметр Window_number является целым числом, приписываемым окну при его создании. (Это параметр Window_number предиката makewindow).
Значение предиката shiftwindow(3) вызывает переназначение всех операций ввода и вывода в окно с номером 3.
Предикат удаления текущего окна с экрана
Все текстовые и графические изображения, находящиеся в окне, так же удаляются. Если за данным окном находится другое окно, то это окно и его содержимое становится видимым.
Пример организации многооконного меню в программе обработки файла прямого доступа
Модуль menu высвечивает в главном окне программы доступные пользователю функции обработки файла:
- создание файла прямого доступа;
- добавление элемента в файл;
- модификация файла;
- просмотр файла;
- окончание работы программы.
Модуль запрашивает у пользователя режим работы N в соответствии с выбранной функцией обработки файла или окончанием работы. С помощью repeat и N=5 осуществляется выбор новых необходимых видов обработки файла. В соответствии с выбранным режимом работы N осуществляется вы- бор правил:
- process(1) для создания файла прямого доступа;
- process(2) для добавления информации в файл;
- process(3) для модификации информации в файле;
- process(4) для просмотра информации, находящейся в файле;
- process(5) для окончания работы программы.
Первые четыре из этих модулей создают свои диалоговые окна.
В программе предусмотрены реакции программы на ошибки при вводе выбираемого режима работы и при неуказании имени физического файла.
domains
file=f
predicates
menu
repeat
namefile(string)
input(string)
read
process(integer)
error
clauses
menu:-repeat,makewindow(1,7,7,"ГЛАВНОЕ МЕНЮ",0,0,25,70),
write("***") ,nl,
write("* ФУНКЦИИ ОБРАБОТКИ ФАЙЛА *"),nl,
write("* *"),nl,
write("* 1. Создание файла *"),nl,
write("* 2. Добавление элемента в файл *"),nl,
write("* 3. Модификация файла *"),nl,
write("* 4. Просмотр файла *"),nl,
write("* 5. Окончание работы *"),nl,
write("***"),nl,nl,nl,
write("ВАШ ВЫБОР (1..5): "),readint(N),
process(N),N=5,!.
repeat.
repeat:-repeat.
process(1):-makewindow(2,7,7,"СОЗДАНИЕ ФАЙЛА",0,10,25,30),
nl,nl,write("Введите имя файла: "),readln(F),
namefile(F),openwrite(f,F),closefile(f),
openappend(f,F),write("Будете вводить (y/n): "),
readln(C),input(C),closefile(f),removewindow.
process(2):-makewindow(3,7,7,"ДОБАВЛЕНИЕ ЭЛЕМЕНТА",0,10,25,30),
nl,nl,write("Введите имя файла: "),readln(F),
namefile(F),openappend(f,F),input("y"),
closefile(f),removewindow.
process(3):-makewindow(4,7,7,"ДОБАВЛЕНИЕ ЭЛЕМЕНТА",10,10,10,30),
nl,nl,write("Введите имя файла: "),readln(F),
namefile(F),openmodify(f,F),
write("Номер записи: "),readint(N),
I:=(N-1)*7,readdevice(f),filepos(f,I,0),
readln(C),write(C),nl,nl,readdevice(keyboard),
write("Введите новое значение: "),nl,readint(K),
filepos(f,I,0),writedevice(f),write("%5.0\n",K),
writedevice(screen),closefile(f),removewindow.
process(4):-makewindow(5,7,7,"ПРОСМОТР ФАЙЛА",0,10,25,30),
nl,nl,write("Введите имя файла: "),readln(F),
namefile(F),openread(f,F),readdevice(f),
writedevice(screen),print,closefile(f),
removewindow.
process(5):-nl,write("КОНЕЦ"),nl,
write("Нажмите пробел"),readchar(_).
error:-nl,write("*** ОШИБКА ВВОДА ***"),nl,
write("Нажмите пробел"),readchar(_).
print:-not(eof(f)),!,readln(N),write(N),nl,print.
print:-readdevice(keyboard).
namefile(""):-!,write("*** ОШИБКА ВВОДА ***"),nl,
write("Нажмите пробел"),readchar(_),fail.
namefile(_).
input("y"):-!,write("Введите элемент: "),read,
write("Будете еще вводить (y/n): "),readln(C),
input(C).
input(_).
read:-readint(K),!,writedevice(f),writef("%5.0\n",K),
writedevice(screen).
Задание на лабораторную работу
1. Изучить способы организации обработки файлов.
2. В соответствии с вариантом задания, определенным преподавателем, составить пролог-программу.
3. Оформить отчет с указанием варианта задания, текстом программы, и протоколом выполнения программы.
Список использованных источников
1. Братко И. Программирование на языке Пролог для искусственного интеллекта.- М., 1990.
2. Ин Ц. , Cоломон Д. Использование Турбо-Пролога.-М.: Мир, 1993.
3. Cтерлинг Л., Шапиро Э. Искусство программирование на языке Пролог.-M.:Мир , 1990.
4. Стобо Дж. Язык программирования Пролог.-M.: Радио и связь, 1993.
5. Малиас Дж. Реляционный язык Пролог и его применение.-M.: Наука, 1990.
6. Янсон А. Турбо-Пролог в сжатом изложении.-M.: Мир, 1991.
7. Доорс Дж., Рейблейн А. Р., Вадера С. Пролог-язык программирование будущего .-M.: Финансы и статистка, 1990.
8. Макаллистер Дж. Искусственный интеллект и Пролог на микро ЭВМ
9. Хоггер К. Введение в логическое программирование. - М.: Мир, 1988
10. Кларк К., Маккейб Ф. Введение в логическое программирование на микро-Прологе.-М.: Радио и связь, 1987.
11. Клоксин У., Меллиш К. Программирование на языке Пролог. - М.: Мир, 1987.
Размещено на Allbest.ru
...Подобные документы
Основы языка Visual Prolog. Введение в логическое программирование. Особенности составления прологов, синтаксис логики предикатов. Программы на Visual Prolog. Унификация и поиск с возвратом. Использование нескольких значений как единого целого.
лекция [120,5 K], добавлен 28.05.2010Реализация экспертных систем любой сложности, решение любых головоломок и шарад с помощью языка логического программирования Prolog. Основные понятия в языке Prolog. Правила логического вывода и запросы. Процедуры логического вывода и принятия решений.
курсовая работа [19,0 K], добавлен 24.05.2012Ханойские башни: постановка задачи, условия перемещения дисков со стержня на стержень. Стратегия решения, используемые предикаты. Текст программы на языке Пролог. Построение модели решения задачи о ферзях. Примеры использования списков в языке Пролог.
презентация [72,0 K], добавлен 29.07.2012Общая характеристика и функциональные возможности языка логического программирования Prolog, а также систем SWI-Prolog и Visual Prolog. Формирование базы знаний относительно определения возможности трудоустройства студента и принципы реализации запросов.
лабораторная работа [1,3 M], добавлен 07.10.2014Назначение и свойства стандартных диалоговых окон для работы с файловой системой. Свойства, управляющие видом меню. Программирование чтения и записи файлов. Исключительные ситуации и диагностические сообщения. Приемы составления контекстного меню.
лекция [775,2 K], добавлен 09.12.2013Создание программного обеспечения, организующего базу данных тренажёрного зала. Описание предметной области; предикаты языка Пролог для работы с БД: ввод/вывод, управление окнами. Разработка структуры базы данных, интерфейс; содержание файла "Zal.ddb".
курсовая работа [821,6 K], добавлен 07.06.2013Основы работы с языком программирования Visual Basic 6.0, разработка и обработка созданных баз данных. Создание экранной формы и запросов по таблице VIP. Алгоритм совместного запроса по таблицам VIP и PROD. Методика разработки пользовательского меню.
курсовая работа [2,7 M], добавлен 04.06.2009Разработка программы для поиска пути в лабиринте с возможностью задания входа и выхода, наглядное представление решений. Использование языка логического программирования Prolog. Данные и методы решения. Пользовательский интерфейс, листинг программы.
реферат [14,3 K], добавлен 15.10.2012Понятие экспертных систем, их классификация, виды и структура. Построение продукционной модели экспертной системы прогнозирования результатов сессии на основании анализа успеваемости, ее реализация в языке логического программирования Visual Prolog.
дипломная работа [1,6 M], добавлен 25.01.2011Особенности программирования на языке Паскаль в среде Турбо Паскаль. Линейные алгоритмы, процедуры и функции. Структура данных: массивы, строки, записи. Модульное программирование, прямая и косвенная рекурсия. Бинарный поиск, организация списков.
отчет по практике [913,8 K], добавлен 21.07.2012Описание Visual Basic Scripting Edition как скриптового языка программирования, интерпретируемого компонентом Windows Script Host. Правила работы языка и применение VBS-сценариев для обработки данных, управления системой, работы с учетными записями.
доклад [31,3 K], добавлен 11.05.2012Обработка сложных структур данных как одна из наиболее распространенных возможностей применения языка программирования С++. Преимущества использования подпрограмм. Передача параметров, одномерных и двумерных массивов, функции и их возврат в функцию.
курсовая работа [1,1 M], добавлен 24.11.2013Ознакомление с методами разработки экспертных систем, предназначенных для обобщения, хранения, использования знаний и опыта, накопленного специалистами в конкретных предметных областях. Проектирование программы на языке Пролог, ее отладка и тестирование.
курсовая работа [69,6 K], добавлен 12.05.2013Исследование правил интеллектуальной игры "Ханойская башня". Описания алгоритма решения задачи на языке программирования Пролог. Характеристика компиляции и запуска программы с решением для трёх дисков. Изучение работы визуализатора, написание скрипта.
курсовая работа [672,6 K], добавлен 13.06.2012Этапы подготовки и решения задач на компьютере. Способы предоставления алгоритмов. Простые типы данных и их обработка. Основы работы с графикой и графическими операторами в Visual Basic. Организация линейной программы. Процедуры и функции в языке Паскаль.
дипломная работа [1,9 M], добавлен 25.10.2015Языки логического (Пролог) и функционального (ЛИСП и РЕФАЛ) программирования. Задачи прямого и обратного вывода. Алгоритм CLS для построения деревьев. Математические основы индуктивного и дедуктивного вывода, алгебра высказываний, исчисление предикатов.
курс лекций [319,9 K], добавлен 24.06.2009Сумма двух разреженных полиномов, заданных ненулевыми коэффициентами и их номерами. Разработка программ на языке программирования Visual Basic for Applications. Вывод справочной информации. Операционная система Windows. Хранение двоичных данных.
научная работа [390,2 K], добавлен 09.03.2009Знакомство с основами логического программирования на примере языка Prolog. Синтаксис его основных команд. Генеалогическое дерево с использованием предикатов. Хорновская логическая программа. Основные синтаксические объекты: атомы, константы и переменные.
практическая работа [832,7 K], добавлен 20.11.2015Общие сведения о работе программы в среде программирования Microsoft Visual Studio 2008, на языке программирования C++. Ее функциональное назначение. Инсталляция и выполнение программы. Разработанные меню и интерфейсы. Алгоритм программного обеспечения.
курсовая работа [585,5 K], добавлен 24.03.2009История и основы структурного программирования в среде Turbo Pascal. Работа с различными типами данных. Операторы языка. Работа с символьными и строковыми переменами, одномерным, двумерным массивами. Классификация компьютерных игр. Игры на языке Паскаль.
курсовая работа [28,8 K], добавлен 06.05.2014