Логическое программирование

Управление логическим выводом в программах. Общие сведения о языке логического программирования. Применение рекурсии для обработки списков. Основные предикаты для работы с файлами. Создание динамической базы данных. Применение языка для решения задач.

Рубрика Программирование, компьютеры и кибернетика
Вид лабораторная работа
Язык русский
Дата добавления 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

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.