Логическое программирование
Управление логическим выводом в программах. Общие сведения о языке логического программирования. Применение рекурсии для обработки списков. Основные предикаты для работы с файлами. Создание динамической базы данных. Применение языка для решения задач.
| Рубрика | Программирование, компьютеры и кибернетика |
| Вид | лабораторная работа |
| Язык | русский |
| Дата добавления | 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


