- •Содержание
- •Практическая работа № 1 Знакомство с компьютером
- •Практическая работа № 2 Текстовый редактор
- •Практическая работа № 3 Учебная информационно-поисковая система "Памятники Москвы"
- •Практическая работа № 4 "ипс-самоделка"
- •Практическая работа № 5 "ипс-самоделка-2"
- •Практическая работа № 6 ипс-самоделка-3
- •Практическая работа № 7 Экспертная система "Животные".
- •Практическая работа № 8 Исполнитель "Монах"
- •Практическая работа № 9 Исполнитель “Хлопальщик”
- •Практическая работа № 10 Арифметика в языке Пролог.
- •Практическая работа № 11 Рекурсия
- •Практическая работа № 12 Программа для Монаха
- •Практическая работа № 13 Графический редактор
- •Практическая работа № 14 Графика образов
- •Практическая работа № 15 Затоваренная стеклотара
- •Литература
Практическая работа № 15 Затоваренная стеклотара
Представим себе, что случился урожай, хозяйка наготовила много варенья, осталось разлить его по банкам - одно-, двух- и трехлитровым. Зная общий объем варенья, нужно выяснить - сколько каких банок потребуется.
Понятно, что объем варенья измеряется целым числом литров, а если и был бы остаток, то мы бы его съели немедленно без всякого Пролога.
Во-первых, если нет варенья, нет и банок:
разлив(0);
Во-вторых, если осталось на одну банку:
разлив(1)<- ВЫВОД(“Литровка!”);
разлив(2) <- ВЫВОД(“Двухлитровка!”);
разлив(3) <- ВЫВОД(“Трехлитровка!”);
И наконец, если осталось больше, чем на одну банку, то наполняем банку, а с остатком поступаем рекурсивно:
разлив(v)<-БОЛЬШЕ(v,3),ВЫВОД(“Трехлитровка!”),
СЛОЖЕНИЕ(w,3,v),разлив(w);
Заметьте, что встроенный предикат СЛОЖЕНИЕ работает здесь в обратную сторону, выполняя вычитание.
Чем плох такой разлив? Наполняя по одной банке, мы не планируем, сколько их нам понадобится всего. А ведь можно сразу разделить объем варенья на емкость банки с остатком. Для этого очень хорош универсальный встроенный предикат УМНОЖЕНИЕ(a,b,c,d), аргументы которого связаны соотношением: a*b+c=d.
разлив(v)<-БОЛЬШЕ(v,3),УМНОЖЕНИЕ(x,3,w,v),
ВЫВОД(x,“ трехлитровок!”),разлив(w);
наливай<-ВЫВОД(“Сколько варенья?”),ВВОДЦЕЛ(v),ПС,
разлив(v),ПС;
?наливай;
При таком разливе хозяйке понадобится много трехлитровок и всего одна литровая или двухлитровая банка. Может статься так, что трехлитровок не хватит, а меньшие банки еще есть. Попробуем учесть имеющиеся банки заранее и за точный расчет заслужить право облизать большую ложку.
Наш предикат “разлив” будет иметь соответственно 4 аргументa - разливаемый объем, количество банок по 3 л, количество банок по 2 л и количество банок по 1 л.
разлив(0,a,b,c)<-ВЫВОД("Варенье кончилось"),ПС;
разлив(v,0,0,0)<-ВЫВОД("Осталось ",v," литров"),ПС;
разлив(v,a,b,c)<-БОЛЬШЕ(v,2),БОЛЬШЕ(a,0),
УМНОЖЕНИЕ(x,3,y,v),min(x,a,z),
УМНОЖЕНИЕ(z,3,w,v),
ВЫВОД("Залито трехлитровок ",z),ПС,
разлив(w,#a-z#,b,c);
разлив(v,a,b,c)<- БОЛЬШЕ(v,1),БОЛЬШЕ(b,0),
УМНОЖЕНИЕ(x,2,y,v),min(x,b,z),
УМНОЖЕНИЕ(z,2,w,v),
ВЫВОД("Залито двухлитровок ",z),
ПС,разлив(w,a,#b-z#,c);
разлив(v,a,b,c)<- БОЛЬШЕ(v,0),БОЛЬШЕ(c,0),min(v,c,z),
ВЫВОД("Залито литровок ",z),ПС,
разлив(#v-z#,a,b,#c-z#);
min(a,a,a);
min(a,b,a)<-МЕНЬШЕ(a,b);
min(a,b,b)<-МЕНЬШЕ(b,a);
наливай<-ВЫВОД("Сколько варенья?"),ВВОДЦЕЛ(v),ПС,
ВЫВОД("Сколько трехлитровок?"),ВВОДЦЕЛ(a),ПС,
ВЫВОД("Сколько двухлитровок?"),ВВОДЦЕЛ(b),ПС,
ВЫВОД("Сколько литровок?"),ВВОДЦЕЛ(c),ПС,
разлив(v,a,b,c);
?наливай;
Задания
1. Используя приведенную программу, попробуйте задать другие объемы банок.
2. Составьте программу размена денежных сумм различными купюрами.
Литература
1. Бешенков С.А., Гейн А.Г., Григорьев С.Г. Информатика и информационные технологии. Екатеринбург: Уральский рабочий, 1995.- 134 с.
2. Алексеев М.Н., Григорьев C.Г. Программирование в системе Пролог-Д (MS-DOS, MS Windows95/NT)/ Миасс, 2000 - 54 c.
3. Григорьев С.Г., Морозова Е.В. Информатика и информационные технологии: Сборник задач / ЛБЛ-Балтика. Санкт-Петербург, 1996. - 32 c
4. Ерохина Е.А. Методические рекомендации по применению языка “Пролог”, чч.1-2. Москва, 1992 - 108 с.
