Если, например, список - это просто множество элементов, то наиболее удобна обычная прологовская нотация, поскольку в ней непосредственно выражается то, что программист имел в виду. С другой стороны, некоторые типы выражений также можно трактовать как своего рода списки. Например, для конъюнктов в исчислении высказываний подошло бы следующее спископодобное представление:

истина соответствует пустому списку,

& - оператор для соединения головы с хвостом, определяемый, например, как

            :- ор( 300, xfy, &)

Конъюнкция членов а, b, и с выглядела бы тогда как

            а & b & с & истина

Все приведенные примеры базируются, по существу, на одной и той же структуре, представляющей список. Однако в гл. 8 мы рассмотрели существенно другой способ, влияющий на эффективность вычислений. Уловка состояла в том, что список представлялся в виде пары списков, являясь их 'разностью'. Было показано, что такое представление приводит к очень эффективной реализации отношения конкатенации.

Материал настоящего раздела проливает свет и на то различие, которое существует между применением операторов в математике и применением их в Прологе. В математике с каждым оператором всегда связано некоторое действие, в то время как в Прологе операторы используются просто для представления структур. Упражнения

9. 1.    Определите отношение

        список( Объект)

для распознавания случаев, когда Объект является стандартным прологовским списком.

Посмотреть ответ

9. 2.    Определите отношение принадлежности к списку, используя систему обозначений, введенную в этой разделе: 'затем - ничего_не_делать'.

Посмотреть ответ

9. 3.    Определите отношение

        преобр( СтандСпис, Спис)

для преобразования списков из стандартного представления в систему 'затем-ничего_не_делать'. Например:

        преобр( [а, b], а затем b затем ничего_не_делать)

Посмотреть ответ

9. 4.    Обобщите отношение преобр на случай произвольного альтернативного представления списков. Конкретное представление задается символом, обозначающим пустой список, и функтором для соединения головы с хвостом. В отношении преобр придется добавить два новых аргумента:

        преобр( СтандСпис, Спис, Функтор, ПустСпис)

Примеры применения этого отношения:

        ?-  пpeoбp( [а, b], L, затем, ничего_не_делать).

        L = а затем b затем ничего_не_делать

        ?-  преобр( [а, b, с], L, +, 0).

        L = а+(b+(с+0) )

Посмотреть ответ

9. 1. 2.    Сортировка списков

Вы читаете Prolog
Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату