Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Книги / metod / LAB1.DOC
Скачиваний:
55
Добавлен:
10.12.2013
Размер:
180.74 Кб
Скачать

Практическая работа № 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 с.

Соседние файлы в папке metod