Процедура drop
В этом разделе упоминался метод «упрощения» объекта данных путем спуска его по башне насколько возможно вниз. Разработайте процедуру
drop
, которая делает это для башни, описанной в упражнении
2.83
. Ключ к задаче состоит в том, что надо решить некоторым общим способом, можно ли понизить объект в типе. Например, комплексное число
1.5 + 0i
можно опустить до
real
, комплексное число
1 + 0i
до
integer
, а комплексное число
2 + 3i
никуда понизить нельзя. Вот план того, как определить, можно ли понизить объект: для начала определите обобщенную операцию
project
, которая «сталкивает» объект вниз по башне. Например, проекция комплексного числа будет состоять в отбрасывании его мнимой части. Тогда число можно сдвинуть вниз в том случае, если, спроецировав его, а затем подняв обратно до исходного типа, мы получаем нечто, равное исходному числу. Покажите как реализовать эту идею в деталях, написав процедуру
drop
, которая опускает объект как можно ниже. Потребуется разработать различные операции проекции и установить
project
в системе в качестве обобщенной операции. Вам также потребуется обобщенный предикат равенства, подобный описанному в упражнении
2.79
. Наконец, используя
drop
, перепишите
apply-generic
из упражнения
2.84
, чтобы она «упрощала» свои результаты.
Комментарии отсутствуют.