Логическое программирование
Управление логическим выводом в программах. Общие сведения о языке логического программирования. Применение рекурсии для обработки списков. Основные предикаты для работы с файлами. Создание динамической базы данных. Применение языка для решения задач.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | лабораторная работа |
Язык | русский |
Дата добавления | 21.10.2014 |
Размер файла | 75,4 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Вывести самых молодых жильцов дома и номера квартир, в которых они живут.
Вывести фамилии студентов и их возраст с максимальным размером стипендии.
Вывести фамилии сотрудников предприятия и их оклады, оклады которых меньше среднего.
Вывести студентов с заданной фамилией и посчитать их количество.
Лабораторная работа №5. Решение логических задач
Пример 1. Беседует трое друзей: Белокуров, Рыжов, Чернов. Брюнет сказал Белокурову: “Любопытно, что один из нас блондин, другой брюнет, третий - рыжий, но ни у кого цвет волос не соответствует фамилии”. Какой цвет волос у каждого из друзей?
Для решения построим вспомогательную таблицу:
Таблица 8 - Вспомогательная таблица соответствия
Цвет Фамилия |
Белокуров |
Рыжов |
Чернов |
|
блондин |
- |
|||
рыжий |
- |
|||
брюнет |
- |
- |
Выводы:
Белокуров не брюнет и не блондин;
Чернов не черный, цвет волос Чернова и Белокурова не совпадают;
Рыжов не рыжий, цвет волос у Рыжова и Белокурова, Рыжова и Чернова не совпадают.
Программа 23. Логическая задача на соответствие
Predicates
fam(symbol)
color(symbol)
cootvet(symbol, symbol)
Clauses
fam(belokurov).
fam(ryzov).
fam(chernov).
color(ryziy).
color(cherniy).
color(beliy).
cootvet(X,Y):- fam(X), color(Y), X=belokurov,
not(Y=cherniy), not(Y=beliy).
cootvet(X,Y):- fam(X), color(Y), X= chernov,
not(Y=cherniy),not(cootvet(belokurov,Y).
cootvet(X,Y):- fam(X), color(Y), X= ryzov,
not(cootvet(belokurov, Y), not(cootvet(chernov, Y).
Пример 2. На скамейке сидели Петя, Боря, Коля. Петя справа от Бори, Боря справа от Коли. Кто сидел посередине? Кто сидел с правого(левого) края? Кто сидел между указанными объектами(увеличьте число объектов)?
Программа 24. Логическая задача на выяснение порядка
Predicates
rayd(symbol, symbol, symbol)
sprava(symbol, symbol)
seredina(symbol
kr_cl(symbol)
kr_cpr(symbol)
Clauses
sprava(kolya, boray). /*Справа от Коли Боря*/
sprava(boray, petay).
rayd(X,Y,Z):- sprava(X,Y), sprava(Y, Z).
seredina(X):- rayd(_,X,_).
kr_cl(X):- rayd(X,_,_).
kr_cpr(X):- rayd(_,_,X).
Задания для самостоятельной работы
Коля и Саша носят фамилии Шилов и Гвоздев. Какую фамилию носит каждый из них, если Саша с Шиловым живут в разных домах.
В соревнованиях по бегу Юра, Гриша и Толя заняли три первых места. Какое место занял каждый ребенок, если Гриша занял не второе и не третье место, а Толя не третье?
Три подруги вышли в белом, зеленом и синем платьях и туфлях. Известно, что только у Ани цвета платья и туфлей совпадали. Ни туфли, ни платье Вали не были белыми. Наташа была в зеленых туфлях. Определить цвета платья и туфель на каждой из подруг.
На заводе работали три друга: слесарь, токарь и сварщик. Их фамилии Борисов, Иванов и Семенов. У слесаря нет ни братьев, ни сестер. Он самый младший из друзей. Семенов, женатый на сестре Борисова, старше токаря. Назвать фамилии слесаря, токаря и сварщика.
В бутылке, стакане, кувшине и банке находятся молоко, лимонад, квас и вода. Известно, что вода и молоко не в бутылке, сосуд с лимонадом находится между кувшином и сосудом с квасом, в банке - не лимонад и не вода. Стакан находится около банки и сосуда с молоком. Как распределены эти жидкости по сосудам.
Воронов, Павлов, Левицкий и Сахаров - четыре талантливых молодых человека. Один из них танцор, другой художник, третий-певец, а четвертый-писатель. О них известно следующее: Воронов и Левицкий сидели в зале консерватории в тот вечер, когда певец дебютировал в сольном концерте. Павлов и писатель вместе позировали художнику. Писатель написал биографическую повесть о Сахарове и собирается написать о Воронове. Воронов никогда не слышал о Левицком. Кто чем занимается?
Три друга заняли первое, второе, третье места в соревнованиях универсиады. Друзья разной национальности, зовут их по-разному, и любят они разные виды спорта. Майкл предпочитает баскетбол и играет лучше, чем американец. Израильтянин Саймон играет лучше теннисиста. Игрок в крикет занял первое место. Кто является австралийцем? Каким спортом увлекается Ричард?
Три девочки Маша, Рита, Лена пошли гулять. На улице было жарко, и они купили мороженое «Белка», «Стрелка», «Гагара». Какое мороженое купила каждая из девочек, если Лена купила не «Белку» и не «Гагару», а Рита - не «Гагару».
В комнате находятся Коля, Света, Оля. Каждый из них сидит на отдельной мебели (кровать, стул, диван). Известно, что Коля сидит не на стуле и не на кровати. Света не сидит на стуле. Кто где сидит?
На столе лежат ручка, карандаш, фломастер, красного, синего и зеленого цвета. Известно, что ручка лежит между предметом красного и зеленого цвета. Карандаш либо зеленый, либо синий.
Однажды в Артеке за круглым столом оказалось пятеро ребят из Москвы, Санкт-Петербурга, Новгорода, Перми, Томска: Денис, Игорь, Иван, Алеша, Сергей. Москвич сидел между томичем и Сергеем, санкт-петербуржец - между Денисом и Игорем, а напротив него сидел пермяк и Иван. Алеша ни разу не был в Санкт-Петербурге, а Денис не бывал в Москве и Томске, а томич с Игорем регулярно переписываются. Определите, кто в каком городе живет каждый из ребят.
На улице, встав в кружок, беседует четыре девочки: Аня, Валя, Надя, Галя. Девочка в зеленом платье - не Аня и не Валя - стоит между девочкой в голубом платье и Галей. Девочка в белом платье стоит между девочкой в розовом платье и Валей. Какого цвета платье у каждой из девочек?
Трое юношей: Коля, Дима и Юра влюблены в трех девушек: Аню, Лену, Вику. Но эта любовь без взаимности. Коля любит девушку, влюбленную в юношу, который любит Лену. Дима любит девушку, влюбленную в юношу, который любит Вику. Лена не любит Юру.
Составить базу знаний по сказке “Репка”. Фактами в этой базе должны быть утверждения типа тянет(X,Y). Составить правила, определяющие: кто первый тянет репку, кто последний тянет реку, кто тянет после бабки, кто тянет на четвертом месте.
Даны числа X, Y, Z, T. X меньше Yи меньше T; Y больше Z и больше T; Z больше X и меньше T. В каком порядке расположены эти числа.
На одной yлице стоят 5 домов, окpашенных в 5 pазных цветов. В каждом доме живет гpажданин дpyгой стpаны. Каждый из них пьёт свой напиток, курит свои сигареты и содержит своё домашнее животное. Определите, кто из них содержит рыб? Британец живёт в красном доме. У шведа есть собака. Датчанин пьёт чай. Зелёный дом стоит слева от белого и вплотную к немy. Хозяин зелёного дома пьёт кофе. У того, кто курит Pall-Mall, есть птицы. Хозяин желтого дома курит Dunhills. Хозяин среднего дома пьёт молоко. Норвежец живёт в пеpвом доме. Человек, который курит Blends, живёт рядом с хозяином котов. Тот, кто содержит лошадей, живёт pядом с тем, кто кypит Dunhills. Тот, кто курит Blue Master, пьёт пиво. Hемец кypит Prince. Норвежец живёт рядом с синим домом. У того, кто курит Blends, есть сосед, который пьёт водy.
Лабораторная работа №6. Головоломки. Игровые программы
Пример 1. Нарисовать конверт, не отрывая карандаша от бумаги и не проводя два раза по одной и той же линии. Введем обозначения, ребра - латинскими буквами, вершины - цифрами.
Знания о структуре графа можно представить следующим образом: rebro(a,1,2), rebro(a,2,1), rebro(b,2,3), rebro(b,3,2), rebro(c,1,3), rebro(c,1,2), rebro(c,3,1), rebro(d,2,4), rebro(d,4,2), rebro(e,2,5), rebro(e,5,2), rebro(f,3,4), rebro(f,4,3), rebro(g,3,5), rebro(g,5,3), rebro(h,4,5), rebro(h,5,4).
Решением задачи должен явиться список пройденных ребер графа, причем длина его должна быть равна 8, и в нем не должно быть повторяющихся ребер, что можно описать так:
prohod(T,P):-length(P,8),write_list(P),!.
prohod(T,P):-rebro(R,T,H), not(member(R,P), prohod(H,[R|P).
T-текущая вершина графа, а P-список пройденных ребер. Первое правило означает, что если длина списка P пройденных вершин становится равной 8, то список P выводится на печать. Это правило ограничивает рекурсивный перебор вершин и ребер, проводимый вторым правилом. Второе правило является генератором перебора, оно перебирает предикаты “rebro()” и находит такое ребро R, из текущей вершины Т в новую H, чтобы оно не принадлежало списку P, зато это ребро добавляется в качестве головы к списку P, и поиск дальнейшего пути производится уже из новой вершины H.
Пример 2. Программа “Угадай число”.
Программа 25. Логическая игра «Угадай число»
Predicates
play_the_game
give_info
play_it
generate_rand(integer)
play_it_sam(integer)
test_and_tell(integer,integer)
say_you_got_it_right(integer)
say_too_big
say_too_small
Clauses
play_the_game:-give_info, play_it.
/*информация для пользователя*/
give_info:-makewindow(1,7,7,"",0,0,25,80),
makewindow(2,7,7,"Угадай число", 2,20,22,45),
nl, write("Это игра Угадай число"),
nl, write("Я загадаю число из"),
nl, write("интервала [1,100]"),
nl, write("Я буду подсказывать больше"),
nl, write("или меньше задуманное число"),nl,
nl, write("Кода будешь готов- нажми space bar"),
nl,readchar(_),
clearwindow.
/*выполнение игры*/
play_it:-generate_rand(A),
play_it_sam(A).
/*генерация случайного числа*/
generate_rand(X):-
random(R),
X=1+R*100,
nl,write("Я загадал число"),
nl,write("Теперь дело за Вами"),nl.
/*запрос к пользователю */
play_it_sam(X):-
nl, write ("Введите свой вариант"),
nl, readint(G),
test_and_tell(X,G),
play_it_sam(X).
/* проверка и выдача результата*/
test_and_tell(X,X):- say_you_got_it_right(X),!.
test_and_tell(X,Y):- X>Y, say_too_big,!.
test_and_tell(_,_):- say_too_small.
/*выдача сообщений*/
say_too_big:-nl, write("Загаданное число больше").
say_too_small:-nl, write("Загаданное число меньше").
say_you_got_it_right(X):-nl, write("Вы правы"),
nl,write("Я загадал ",X),
nl, write("До новых встреч!"),
nl, write("Нажмите space bar"),
nl,readchar(_),
exit.
Goal
play_the_game.
Пример 3. Игра Баше - 23 спички. На столе 23 спички, 2 игрока по очереди берут от 1 до 3 спичек, проигравшим считается тот, кто возьмет последнюю спичку.
Программа 26. Логическая игра «Игра Баше - 23 спички»
Predicates
play_the_game
do_windows
play(integer,integer,integer)
play_it_again(integer,integer,integer)
real_int(real,integer)
Clauses
play_the_game:-do_windows,play(23,0,0).
/*правило для образования окон*/
do_windows:-makewindow(1,7,7,"",0,0,25,80),
makewindow(2,7,7,"Игра 23 спички", 1,5,22,40),
nl, write("Добро пожаловать!"),
M=23, H=0, C=0,
nl, write("Всего ",M," спички" ),
nl, write("По очереди мы будем перемещать " ),
nl, write("спички в свои кучки"),
nl, write("За раз можно взять 1, 2, 3 спички"),nl,
nl, write("Проиграет, тот кто заберет последнюю спичку"),
nl, write("Итак, начнем, всего ", M, "сп."),nl,
nl, write("я взял ",C," сп. Вы взяли ",H, " сп."),nl.
play(M,H,C):-play_it_again(M,H,C).
/*правило определения победителя*/
play_it_again(M,_,_):-
M<=0,
nl, write("Вы выиграли!"),
nl, write("Нажмите любую клавишу для выхода"),
readchar(_), clearwindow,!,exit.
play_it_again(1,_,_):-
nl, write("Я выиграл!"),
nl, write("Нажмите любую клавишу для выхода"),
readchar(_), clearwindow,!,exit.
play_it_again(M,_,_):-
nl, write("Ваш ход"),
nl, write("Сколько спичек вы хотите взять?"),
readint(Hn),
M2=M-Hn, H2=Hn,
write("Осталось ",M2,"сп."),
nl,write("Мой ход"),
random(F), Rea=1+3*F,
real_int(Rea,Rint),
M3=M2-Rint,
nl, write("Я беру ",Rint," сп."),
nl, write("Осталось ",M3, " сп."),nl,
M7=M3,H7=H2,C7=Rint,
play_it_again(M7,H7,C7).
/*вспомогательное правило*/
real_int(Re,In):-In=trunc(Re).
Goal
play_the_game
Задания для самостоятельной работы
Отгадать число, загаданное компьютером, максимум за 3 попытки.
23 спички. Разработать выигрышную стратегию для компьютера.
Имеется два сосуда - на 3 и 5 литров. Как отмерить с их помощью 4 литра воды?
Решите задачу о перевозке фермером через реку волка, козы, капусты.
Раскрасить плоскую карту так, чтобы никакие две смежные области на ней не были раскрашены в одинаковый цвет. В наборе 4 цвета.
Лабиринт задан матрицей соединений, в которой для каждой пары комнат указано, соединены ли они коридором. Построить путь перехода из комнаты “a” в комнату “g”:
Таблица 10 - Поле для лабиринта
A |
B |
C |
D |
E |
F |
G |
||
A |
- |
1 |
0 |
0 |
0 |
0 |
0 |
|
B |
1 |
- |
1 |
0 |
1 |
0 |
0 |
|
C |
0 |
1 |
- |
1 |
0 |
0 |
0 |
|
D |
0 |
0 |
1 |
- |
1 |
0 |
0 |
|
E |
0 |
1 |
0 |
1 |
- |
0 |
0 |
|
F |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
|
G |
0 |
0 |
0 |
0 |
1 |
0 |
- |
Имеется n городов. Некоторые из них соединены дорогами известной длины. Вся система дорог задана квадратной матрицей n*n, элемент aij<0, если между городами дороги нет, в противном случае равен расстоянию между городами.
Задан лабиринт. Напишите программу для нахождения маршрутов для выхода из этого лабиринта. Начало маршрута точка О. Закрашенная клетка - стена.
Быки и коровы. Игрок A выбирает секретный код, представляющий последовательность из N различных десятичных цифр (N=4). Игрок пытается угадать задуманный код и спрашивает игрока А о числе “быков” (“быки” - количество совпадающих цифр в одинаковых позициях предполагаемого и задуманного кодов; число “коров”- количество совпадающих цифр, входящих в предполагаемый и задуманный код, но находящиеся на разных позициях).
Лабораторная работа №7. Обработка файлов. Предикаты для работы с файлами
deletefile(DOS_filename)-удаление файла
save(DOS_filename) -сохранение файла
renamefile(old_DOS_filename, new_DOS_filename)-переименовыфвание файла
existfile(DOS_filename)-проверка на наличие файла с таким именем
flush(file_domain)-сброс данных из внутреннего буфера, отведенного для данного устройства записи
disk(Path) -выбор дисковода и пути доступа
dir(Path, File_spec, File_name) -Переменой Path должен быть присвоен корректный путь доступа, переменная File_spec задает расширение представляющей интерес группы файлов. Данный предикат выдает каталог имен файлов с заданным расширением; вы можете выбрать среди них нужный и нажать Enter. Имя файла будет присвоено переменой File_name.
При описании файловых доменов тип домена записывается по левую сторону от знака равенства, а имя доомена по правую.
Пример:
file=datafile
file=datafile1;datafile2
openwrite(datafile,filename) - открытие файла для записи или создание, где datafile- введеннный пользователем файловый домен, filename-имя файла в DOS, теперь ссылки на datafile будут означать обращение к filename.
writedevice(datafile) -назначение файла в качестве устройства записи
openread(datafile,filename) - открытие файла для чтения.
readdevice(datafile) -назначение файла устройством чтения
openmodify(datafile,filename) - открытие файла для редактирования, указатель помещается в начало файла, сместить указатель можно при помощи предиката filepos.
openappend(datafile,filename) - открытие файла для добавления данных в конец файла.
closefile(datafile) -закрытие файла
Рассмотрим примеры работы с файлами.
Пример 1. Вывести информацию на экран дисплея и в файл на диске.
Программа 27. Запись данных в файл
Domains
str = string
file = datafile
Predicates
data(str)
write_lines
Goal
openwrite(datafle,"file1.dat"),
write_lines,
closefile(datafile).
Clauses
data("Старому году оставьте печали,!").
data("Забудьте обиду, беду.").
data("Только успехов, здоровья и счастья,").
data("Мы Вам желаем в Новом году!").
write_lines:-
data(Line),
write(" ",Line),nl,
writedevice(datafile),
write(" ",Line),nl,
writedevice(screen), /*для вывода данных на экран*/
fail, write_lines.
Пример 2. Вывести данные файла на экран.
Программа 28. Чтение данныхиз файла
Domains
str = string
file = datafile
Predicates
read_write_lines
Goal
openread(datafile,"file1.dat"),
read_write_lines,
closefile(datafile).
Clauses
read_write_lines :-
readdevice(datafile),
not(eof(datafile)),
readln(Line),
writedevice(screen),
write(" ",Line),nl,
read_write_lines.
Пример 3. Записать в файл данные, вводимые с клавиатуры
Программа 29. Запись в файл данных, вводимых с клавиатуры
Domains
file = datafile
dstring, cstring = string
Predicates
readin(dstring,cstring)
create_a_file
Goal
create_a_file.
Clauses
create_a_file :-
nl,nl,
write("Пожалуйста, введите полное имя файла."),
nl,nl,
readln(Filename), openwrite(datafile,Filename),
writedevice(datafile),
readln(Dstr),
concat(Dstr,"\13\10",Cstr),
readin(Dstr,Cstr),
closefile(datafile).
readin("done",_) :- !.
/*ввод данных завершится после вода слова "done"*/
readin(_,Cstr) :-
write(Cstr),
readln(Dstrl),
concat(Dstrl, "\13\10",Cstr1),
writedevice(datafile),
readin(Dstrl,Cstr1).
Предикаты для работы с файлами прямого доступа
Openmodify(fn,filename)-связывает логическое имя файла fn с именем файла
Filepos(fn, pos, mode)-устанавливает указатель файла в заданную позицию
Таблица 12 - Действие системы при операциях с файлами прямого доступа
Режим mode |
Действия системы |
|
0 |
Смещение берется относительно начала файла |
|
1 |
Смещение берется относительно текущей позиции |
|
2 |
Смещение берется относительно конца файла |
Пример 4. Данные, вводимые с клавиатуры, записать в файл прямого доступа.
Программа 30. Запись данных в файл прямого доступа
Domains
file = datafile
Predicates
create_a_random_access_file
write_read_more(real, string)
pad_str (strIng,string,integer)
Goal
create_a_random_access_file.
Clauses
create_a_random_access_file :-
write("Please enter filename:"),nl,
readln(Filename),
openwrite(datafile,Filename),
closefile(datafile),
openmodify(datafile,Filename),
write("Введите строку"),nl,
readln(Dstr),
write_read_more(0,Dstr),
closefile(datafile).
write_read_more(_,"done") :-
nl, write(" Press the space bar."),
readchar(_),exit.
write_read_more(Index,Dstr) :-
writedevice(datafile),
filepos(datafile,Index,0),
pad_str(Dstr,Padstr,38),
concat(Padstr, "\10\13", Cstr),
write(Cstr),
writedevice(screen),
write("Введите строку"),nl,
readln(Dstr1),
Index1 = Index + 40,
write_read_more (Index1, Dstr1).
pad_str (Instr,Instr,Length) :-
str_len(Instr,Testlength),
Testlength >= Length,!.
pad_str (Instr,Padstr,Length) :-
concat(Instr,"-",Newstr),
pad_str(Newstr,Padstr,Length).
Пример 5. Вывести на экран заданную строку файла прямого доступа и выдача их на экран
Программа 31. Вывод данных из файла прямого доступа
Domains
file = datafile
Predicates
read_a_random_access_file
Goal
read_a_random_access_file.
Clauses
read_a_random_access_file:-
write("Please enter filename:"), nl, readln(Filename),
openread(datafile,Filename),
write("Type 1n record number: "),nl,
readreal(Record),
Index = (Record - 1) * 40,
readdevice(datafile),
filepos(datafile,Index,0),
readln(Cstr),
write(Cstr), nl,nl,
write("Press the space bar."),nl,
readdevice(keyboard),
readchar(_),
closefile(datafile),
exit.
Задание для самостоятельной работы
В файле задана последовательность целых чисел, найти сумму чисел, предшествующих первому отрицательному.
Переписать данные файла в обратном порядке.
Вывести на экран данные файла в неубывающем порядке.
Записать результат сложения чисел, содержащихся в файлах в третий.
Переписать числа из файла в другой, дописав за каждым его квадрат.
Лабораторная работа №8. Создание динамической базы данных. Предикаты для работы с базой данных
Для описания предикатов динамической базой данных предназначен раздел database. База данных (БД) называется динамической потому, что во время работы можно добавлять, удалять содержащиеся в них утверждения. Другая важная особенность динамических баз данных состоит в том, что она может быть записана на диск и считана с диска в оперативную память.
Иногда предпочтительно иметь часть информации БД в виде утверждений статической БД. Эти данные заносятся в динамическую сразу после активизации программы. В общем случае, предикаты статической БД имеют другое имя, но ту же самую форму представления данных, что и предикаты динамической.
Предикаты для работы с динамической БД:
Asserta заносит новый факт в БД, новый факт помещается перед всеми уже внесенными утверждениями.
Assertz помещает новый факт в БД за всеми имеющимися утверждениями.
Retract удаляет утверждение из БД.
Save сохраняет находящуюся в оперативной памяти БД в текстовом файле. Синтаксис этого предиката таков Save(DOS_file_name)
consult(DOS_file_name) считывает в память файл БД
readterm(Domain,Term) используется для чтения из файла объектов, относящихся к определенному в программе домену.
Предикат findall позволяет собрать все имеющиеся в базе данные в список, который может быть полезен при дальнейшей работе.
В качестве примера рассмотрим БД по игрокам футбольных команд, БД допускает следующие операции: добавление, удаление и просмотр данных. Эта программа создает БД и содержит её в оперативной памяти. Для работы с ней использовался предикат player с аргументами p_name-имя игрока, k_name-название клуба, p_number-номер игрока, pos-позиция игрока, height -рост, weight-вес, nfl_exp-стаж выступлений, college-учебное заведение)
Программа 32. Динамическая база данных «Футбольная команда»
Domains
p_name,k_name, pos, college = string
p_number, height, weight, nfl_exp = integer
Database
dplayer(p_name, k_name,p_number,pos, height,weight,nfl_exp, college)
Predicates
repeat
do_mbase
assert_database
menu
process(integer)
clear_database
player(p_name, k_name,p_number,pos, height,weight,nfl_exp, college)
error
Goal
do_mbase.
Clauses
repeat.
repeat:-repeat.
/*База данных футбол*/
player("Иванов Иван","Спартак",13,"з", 205,90,3, "ГГПИ").
player("Петров Петр","Динамо",96,"пз", 185,78,4, "ГТК").
player("Сидоров Денис","Локомотив",69,"в", 190,88,2, "ГТУ").
player("Васечкин Илья","Торпедо",5,"в", 195,80,5, "ГГПИ").
player("Алексеев Дима","ЦСКА",1,"н", 165,67,2, "ГТК").
player("Карпов Павел","Зенит",12,"н",170,74,1, "ГКК").
/*конец начальных данных*/
assert_database:-
player(P_name,K_name,P_number,Pos,Height,Weight,Nfl_exp,College),assertz(dplayer(P_name,K_name,P_number,Pos,Height,Weight,Nfl_exp,
College)),
fail.
assert_database:-!.
clear_database:-
retract(dplayer(_,_,_,_,_,_,_,_)),
fail.
clear_database:-!.
do_mbase :-
assert_database,
makewindow(1,7,7," FOOTBALL DATABASE ",0,0,25,80),
menu,
clear_database.
menu :-
repeat, clearwindow,
nl,
write(" ************************************* "),nl,
write(" * 1. Добавление нового игрока в БД * "),nl,
write(" * 2. Удаление игрока из БД * "),nl,
write(" * 3. Просмотр данных * "),nl,
write(" * 4. Выход из программы * "),nl,
write(" ************************************* "),nl,
write(" Пожалуйста, сделайте свой выбор 1, 2, 3 or 4 : "),
readint(Vibor),nl,process(Vibor),Vibor = 4,!.
/* Добавление информации об игроке в БД */
process(1) :-
makewindow(2,7,7,"Добавление данных",2,20,18,58),shiftwindow(2),
write("Введите, пожалуйста:"),nl,
write("Имя игрока: "), readln(P_name),
write("Название клуба: "), readln(K_name),
write("Номер игрока: "), readint(P_num),
write("Позицию: "), readln(Pos),
write("Рост: "), readint(Ht),
write("Вес: "), readint(Wt),
write("Стаж выступлений: "), readint(Exp),
write("Название учебного заведения: "), readln(College),
assertz(dplayer(P_name, K_name, P_num,Pos,Ht,Wt,Exp, College)),
write(P_name," добавлен в БД"), nl,!,
write("Press space bar. "), readchar(_),
removewindow, shiftwindow(1).
/* Удаление */
process(2) :-
makewindow(3,7,7,"Удаление данных",10,30,7,40),shiftwindow(3),
write("Введите имя удаляемого игрока: "), readln(P_name),
retract(dplayer(P_name,_,_,_,_,_,_,_)),
write(P_name," удален из БД "), nl, !,
write("Press space bar."), readchar(_), removewindow,
shiftwindow(1).
/* Просмотр данных об игроке*/
process(3) :-
makewindow(4,7,7," Просмотр ", 7,30,16,47), shiftwindow(4),
write("Введите имя для просмотра: "), readln(P_name),
dplayer(P_name,T_name,P_number,Pos,Ht,Wt,Exp,College),nl,
write(" Имя игрока : ",P_name),nl,
write(" Название клуба : ",T_name),nl,
write(" Номер игрока : ",P_number),nl,
write(" Позиция : ",Pos),nl,
write(" Рост : ",Ht), nl,
write(" Вес : ",Wt),nl,
write(" Стаж выступлений : ",Exp), nl,
write(" Учебное заведение : ",College),nl, nl,!,
write("Press space bar"), readchar(_),
removewindow, shiftwindow(1).
process(3) :-
makewindow(5,7,7," Неудача ",14,7,5,60), shiftwindow(5),
write("К сожалению, данных нет."),nl,
write("Извините, пока!"),nl,!,
write("Press space bar."),readchar(_),
removewindow,shiftwindow(1).
/* Выход */
process(4) :-
write("До новых встреч! "),readchar(_),exit.
/*Обработка ошибки*/
process(Vibor):-
Vibor<1, error; Vibor>5, error.
error:-
write("Пожалуйста выберите число от 1 до 4"),
write("(Press the spase bar to continue)"),readchar(_).
Задание для самостоятельной работы
Модифицируйте программу, добавив в меню пункты:
Вывод списка игроков.
Сохранение данных в файл.
Выборка данных по 1 из трех критериев.
Лабораторная работа №9. Применение языка для решения задач ИИ. Создание экспертных систем
Пример 1.Рассмотрим пример ЭС для идентификации породы собак. Она помогает потенциальному хозяину выбрать породу собаки в соответствие с определенными критериями.
В данной ЭС используются следующие характеристики:
Короткая шерсть;
Длинная шерсть;
Рост меньше 30 дюймов;
Рост меньше 22 дюймов;
Низкопосаженный хвост;
Длинные уши;
Хороший характер
Вес больше 100 фунтов.
Каждая характеристика для конкретной породы либо верна, либо не верна. Для каждой породы справедливы следующие характеристики:
Таблица 13 - Характеристики собак
Порода |
Характеристики |
|
Английский бульдог |
1,4,5,7 |
|
Гончая |
1,4,6,7 |
|
Дог |
1,3,6,7,8 |
|
Амер.гончая |
1,5,6,7 |
|
Кокер-спаниэль |
2,4,5,6,7 |
|
Ирландский сеттер |
2,3,6 |
|
Колли |
2,3,5,7 |
|
Сенбернар |
2,5,7,8 |
Программа 33. «Эксперт по породам собак»
*Эксперт по породам собак*/
/*Назначение: Демонстрация работы ЭС*/
Domains
n=integer
list=n*
dog=symbol
Predicates
rule(n,dog,list)
cond(n,string)
do_expert
show_menu
do_consulting
process(n)
test(n,list)
topic
repeat
Goal
do_expert.
Clauses
rule(1,"английский бульдог",[1,4,5,7]).
rule(2,"гончая",[1,4,6,7]).
rule(3,"дог",[1,3,6,7,8]).
rule(4,"американская гончая",[1,5,6,7]).
rule(5,"коккер-спаниель",[2,4,5,6,7]).
rule(6,"ирландский сеттер",[2,3,6]).
rule(7,"колли",[2,3,5,7]).
rule(8,"сенбернар",[2,5,7,8]).
/*Характеристики*/
cond(1,"короткошерстная").
cond(2,"длинношерстная").
cond(3,"рост ниже 30 дюймов").
cond(4,"рост ниже 22 дюймов").
cond(5,"низкопосаженный хвост").
cond(6,"большие уши").
cond(7,"хороший характер").
cond(8,"вес более 100 фунтов").
do_expert:-
makewindow(1,7,5 ,"ЭКСПЕРТНАЯ СИСТЕМА",0,0,25,80),
show_menu.
repeat.
repeat:-repeat.
/*Вывод меню*/
show_menu:-
repeat,
write("***************************"),nl,
write("*****Добро пожаловать!*****"),nl,
write("* *"),nl,
write("*****1-консультация********"),nl,
write("*****2-список**************"),nl,
write("*****3-выход***************"),nl,
write("* *"),nl,
write("****Сделайте свой выбор****"),nl,
readint(X),
process(X),fail.
/*Обработка 1 пункта меню “Консультация”*/
process(1):-
do_consulting,
readchar(_),
shiftwindow(1),
clearwindow.
/*Обработка 2 пункта меню “Вывод списка”*/
process(2):-
makewindow(2,7,7,"",5,20,12,25),
topic,
readchar(_),
shiftwindow(1),
clearwindow.
/* Обработка 3 пункта меню “Выход”*/
process(3):-
removewindow,
exit.
/*Вывод пород собак*/
topic:-
rule(X,Y,_),
write(X,". ",Y),
nl,fail.
topic.
/*Консультация*/
do_consulting:-
test(1,List),
rule(_,X,List),
write("Ваш выбор:" ,X),!.
do_consulting:-
write("Мне жаль, что не смог Вам помочь.").
/*Тестирование*/
test(9,[]):-!.
test(1,[N|List]):-
cond(N,Text),
makewindow(2,7,7,"",5,20,10,35),
write("Вопрос:-",Text,"?"),nl,
write("1-да"),nl,
write("0-нет"),nl,
readint(R),R=1,!,test(3,List).
test(1,List):- test(2,List),!.
test(N,[N|List]):-
cond(N,Text),
makewindow(2,7,7,"",5,20,10,35),
write("Вопрос:-",Text,"?"),nl,
write("1-да"), nl,
write("0-нет"), nl,
readint(R),M=N+1,
R=1,!,test(M,List).
test(N,List):-M=N+1,test(M,List).
Задания для самостоятельной работы
Разработать экспертную систему, тему выбрать самостоятельно. Отчет должен содержать следующие пункты:
Тема ЭС. Назначение, возможности программы. Разработать структурно-функциональную схему. Определить базу знаний, разработать механизм вывода, интерфейс программы. По каким параметрам программу можно отнести к классу ЭС.
Литература
1. Братко И. Программирование на языке Пролог для ИИ: Пер. с англ.- М.- Мир, 1990
2. Доорс Дж., Рейблейн А.Р., Вадера С. Пролог-язык программирования будущего: Пер. с англ.- М.- Финансы и статистика, 1990
3. Стобо Д.Ж. Язык программирования Пролог: Пер. с англ.- М.- Радио и связь, 1993.-368 с.:ил.
4. Ин Ц., Соломон Д. Использование Турбо-Пролога: Пер. с англ.-М.:Мир, 1993.-608 с.,ил.
5. Информатика. Задачник-практикум в 2 т./Под ред. И.Г.Семакина, Е.К. Хеннера: Том.2.-М.:-БИНОМ. Лаборатория знаний, 2003.-278 с.:ил.
6. Информатика:Учеб.пособие для студ.пед.вузов/А.В.Могилев, Н.И.Пак, Е.К.Хеннер;Под ред. Е.К.Хеннера.-3-е изд., перераб. и доп.-М.:Издательский центр “Академия”, 2004.-848 с.
7. Каймин В.А. Основы компьютерной технологии.- М.:Финансы и статистика, 1992.-208 с.: ил.
8. Каймин В.А. Информатика: Учебник.-2-е изд., перераб. и доп.-М.-ИНФРА-М,2001.-272 с.
9. Кларк К., Маккей Ф. Введение в логическое программирование на микро-Прологе. Пер. с англ.- М.- Радио и связь, 1987.
10. Клоксин У., Меллиш К. Программирование на языке Пролог: Пер.с англ.-М.: Мир, 1987.
11. Малпас Дж. Реляционный язык Пролог и его применение. Пер. с англ./Под ред. В.Н. Соболева.-М.-Наука, 1990
12. Марселлус Д. Программирование экспертных систем на ТурбоПрологе: Пер. с англ./Предисл. С.В.Трубицына.-М.-Финансы и статистика, 1994.-256с.:ил.
13. Стерлинг Л., Шапиро Э. Искусство программирования на языке Пролог: Пер.с англ.-М.: Мир, 1990.-235 с., ил.
14. Таунсенд К., Фохт Д. Проектирование и программная реализация экспертных систем на персональных ЭВМ: Пер. с англ./Предисл. Г.С.Осипова.-М. .-Финансы и статистика, 1990.-320с.:ил.
15. Хоггер К. Введение в логическое программирование: Пер. с англ.-М.: Мир, 1988.-348 с.
Размещено на Allbest.ru
...Подобные документы
Создание программного обеспечения, организующего базу данных тренажёрного зала. Описание предметной области; предикаты языка Пролог для работы с БД: ввод/вывод, управление окнами. Разработка структуры базы данных, интерфейс; содержание файла "Zal.ddb".
курсовая работа [821,6 K], добавлен 07.06.2013Применение информационных технологий в конкретной практической деятельности по выбранной специальности. Использование языка программирования Pascal в инженерной практике как универсального алгоритмического языка. Программа решения задачи на языке Pascal.
курсовая работа [1,3 M], добавлен 25.07.2012Обзор существующих систем управления базами данных. Концептуальное, логическое и физическое проектирование и создание базы данных. Обзор языков программирования. Создание и реализация клиентского приложения с помощью выбранного языка программирования.
дипломная работа [2,4 M], добавлен 02.06.2013Понятие шаблона проектирования или паттерна в разработке программного обеспечения. Изменение поведения системы (базы данных) с помощью порождающего шаблона программирования - абстрактной фабрики. Программирование базы данных и управление ею на языке С+.
курсовая работа [124,8 K], добавлен 30.04.2011Разработка программы для поиска пути в лабиринте с возможностью задания входа и выхода, наглядное представление решений. Использование языка логического программирования Prolog. Данные и методы решения. Пользовательский интерфейс, листинг программы.
реферат [14,3 K], добавлен 15.10.2012Принципы и порядок работы с файлами на языке Delphi, получение навыков программирования с использованием файлов. Создание каталога продуктов. Страница палитры компонентов, настраиваемые компоненты и их значения. Текст программы и ее тестирование.
лабораторная работа [243,9 K], добавлен 09.01.2009Разработка программы на языке Си++ и осуществление постановки и выбора алгоритмов решения задач обработки экономической информации, создание и редактирование базы данных, сортировка записей по определенному запросу, анализ эффективности обработки данных.
контрольная работа [316,8 K], добавлен 28.08.2012Разработка базы данных для работы туристической фирмы. Нормализация отношений и типы связей. Исследование основных компонентов языка программирования Delphi. Создание форм для просмотра списков данных, редактирования туров и путевок, оформления заказов.
курсовая работа [349,6 K], добавлен 01.02.2015Модели нейронных сетей и их реализации. Последовательный и параллельный методы резолюции как средства логического вывода. Зависимость между логическим следованием и логическим выводом. Применение технологии CUDA и реализация параллельного алгоритма.
дипломная работа [1,5 M], добавлен 22.09.2016Использование рекурсии в предметных областях. Рекурсивные процедуры и функции в программировании. Создание алгоритмов для рисования графических изображений с использованием рекурсии в среде программирования Pascal ABC. Примеры рекурсии в графике.
творческая работа [6,7 M], добавлен 01.02.2014Алгоритмизация и структурное программирование на языке С/С++. Создание справочника в памяти (ввод данных), вывод справочника на экран с использованием потоковых классов, сортировка методом Шелла. Циклы, описание применяемых специальных алгоритмов.
курсовая работа [1,0 M], добавлен 26.02.2012Анализ метода линейного программирования для решения оптимизационных управленческих задач. Графический метод решения задачи линейного программирования. Проверка оптимального решения в среде MS Excel с использованием программной надстройки "Поиск решения".
курсовая работа [2,2 M], добавлен 29.05.2015Язык программирования как система обозначений, применяемая в описании алгоритмов для ЭВМ. Разработка программы на языке программирования Бейсик. Освоение приемов работы с электронными таблицами MS Excel. Создание базы данных с помощью СУБД MS Access.
контрольная работа [2,6 M], добавлен 15.02.2010Разработка приложения для работы с базой данных с использованием объектно-ориентированного и визуального программирования. Обзор языка элементов языка программирования Delphi. Проектирование базы данных автозаправки. Клиентская система приложения.
курсовая работа [2,3 M], добавлен 31.01.2016Цели и задачи дисциплины "Технология программирования". Программные средства ПК. Состав системы программирования и элементы языка. Введение в систему программирования и операторы языка Си. Организация работы с файлами. Особенности программирования на С++.
методичка [126,3 K], добавлен 07.12.2011Реализация экспертных систем любой сложности, решение любых головоломок и шарад с помощью языка логического программирования Prolog. Основные понятия в языке Prolog. Правила логического вывода и запросы. Процедуры логического вывода и принятия решений.
курсовая работа [19,0 K], добавлен 24.05.2012Знакомство с основами логического программирования на примере языка Prolog. Синтаксис его основных команд. Генеалогическое дерево с использованием предикатов. Хорновская логическая программа. Основные синтаксические объекты: атомы, константы и переменные.
практическая работа [832,7 K], добавлен 20.11.2015Обзор существующих систем управления базы данных. Основные характеристики языка программирования MS VB 2010. Содержание базы данных для хранения информации об успеваемости. Программирование системных модулей программы, содержание интерфейса пользователя.
курсовая работа [1,1 M], добавлен 22.02.2014Что такое информационные продукты и услуги. Создание диаграмм в текстовом процессоре Microsoft Word. Краткая характеристика алгоритмического языка Бейсик. Применение программирования при решении задач по экономической и математической статистике.
контрольная работа [104,4 K], добавлен 04.05.2010Описание Visual Basic Scripting Edition как скриптового языка программирования, интерпретируемого компонентом Windows Script Host. Правила работы языка и применение VBS-сценариев для обработки данных, управления системой, работы с учетными записями.
доклад [31,3 K], добавлен 11.05.2012