Назад | Содержание| Вперёд 3. 2. Некоторые операции над списками ...

Назад | Содержание| Вперёд

3. 2.    Некоторые операции над списками

Списки можно применять для представлениямножеств, хотя и существует некоторое различиемежду этими понятиями: порядок элементовмножества не существенен, в то время как длясписка этот порядок имеет значение; кроме того,один н тот же объект может встретиться в спискенесколько раз. Однако наиболее частоиспользуемые операции над списками аналогичныоперациям над множествами. Среди них

проверка, является ли некоторый объект элементом списка, что соответствует проверке объекта на принадлежность множеству;

конкатенация (сцепление) двух списков, что соответствует объединению множеств;

добавление нового объекта в список или удаление некоторого объекта из него.

В оставшейся части раздела мы покажемпрограммы, реализующие эти и некоторые другиеоперации над списками.

3. 2. 1.    Принадлежность ксписку

Мы представим отношение принадлежности как

        принадлежит( X, L)

где Х - объект, а L - список. Цель принадлежит(X, L) истинна, если элемент Х встречается в L.Например, верно что

        принадлежит( b, [а, b,с] )

и, наоборот, не верно, что

        принадлежит b, [а, [b,с] ] )

но

        принадлежит [b, с], [а,[b, с]] )

истинно. Составление программы для отношенияпринадлежности может быть основано на следующихсоображениях:

    (1)        Х естьголова L, либо

    (2)        Хпринадлежит хвосту L.

Это можно записать в виде двух предложений,первое из которых есть простой факт, а второе -правило:

        принадлежит( X, [X |Хвост ] ).

        принадлежит ( X,[Голова | Хвост ] ) :-

               принадлежит( X, Хвост).

3. 2. 2.    Сцепление (конкатенация)

Для сцепления списков мы определим отношение

        конк( L1, L2, L3)

Здесь L1 и L2 - два списка, a L3 - список, получаемыйпри их сцеплении. Например,

        конк( [а, b], [c, d], [a, b, c,d] )

истинно, а

        конк( [а, b], [c, d], [a, b, a,c, d] )

ложно. Определение отношения конк, каки раньше, содержит два случая в зависимости отвида первого аргумента L1:

(1)        Если первый аргументпуст, тогда второй и третий аргументыпредставляют собой один и тот же список (назовемего L), что выражается в виде следующегопрологовского факта:

        конк( [ ], L, L ).

(2)        Если первый аргументотношения конк не пуст, то он имеетголову и хвост в выглядит так:

        [X | L1]

На рис. 3.2 показано, как производится сцеплениесписка [X | L1] с произвольным списком L2.Результат сцепления - список [X | L3], где L3получен после сцепления списков L1 и L2. На прологеэто можно записать следующим образом:

        конк( [X | L1, L2, [X | L3]):-

              конк(L1, L2, L3).

Рис. 3. 5.  Один изспособов построения перестановки списка [X |L].

Программа для отношения перестановкав свою очередь опять может основываться нарассмотрении двух случаев в зависимости от видапервого списка:

(1)        Если первый списокпуст, то и второй список должен быть пустым.

(2)        Если первый список непуст, тогда он имеет вид [Х | L], и перестановкутакого списка можно построить так, как Этопоказано на рис. 3.5: вначале получить список L1 -перестановку L, а затем внести Х в произвольнуюпозицию L1.

Два прологовских предложения, соответствующихэтим двум случаям, таковы:

        перестановка( [ ], [ ]).

        перестановка( [X | L ],Р) :-

             перестановка( L, L1),

             внести( X, L1, Р).

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

        перестановка2( [ ], []).

        перестановка2( L, [X |Р] ) :-

             удалить( X, L, L1),

             перестановка2( L1, Р).

Поучительно проделать несколько экспериментовс нашей программой перестановки. Ее нормальноеиспользование могло бы быть примерно таким:

        ?-  перестановка([красный, голубой, зеленый], Р).

Как и предполагалось, будут построены все шестьперестановок:

        Р = [ красный,голубой, зеленый];

        Р = [ красный, зеленый,голубой];

        Р = [ голубой, красный,зеленый];

        Р = [ голубой, зеленый,красный];

        Р = [ зеленый, красный,голубой];

        Р = [ зеленый, голубой,красный];

        nо                 (нет)

Приведем другой вариант использованияпроцедуры перестановка:

        ?-  перестановка(L, [а, b, с] ).

Наша первая версия, перестановка,произведет успешную конкретизацию L всеми шестьюперестановками. Если пользователь потребуетновых решений, он никогда не получит ответ"нет", поскольку программа войдет вбесконечный цикл, пытаясь отыскать новыенесуществующие перестановки. Вторая версия, перестановка2,в этой ситуации найдет только первую (идентичную)перестановку, а затем сразу зациклится.Следовательно, при использовании этих отношенийтребуется соблюдать осторожность.

Упражнения

3. 3.    Определите два предиката

        четнаядлина(Список)    и    нечетнаядлина(Список)

таким образом, чтобы они были истинными, если ихаргументом является список четной или нечетнойдлины соответственно. Например, список [а, b, с, d]имеет четную длину, a [a, b, c] - нечетную.

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

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

        обращение( Список,ОбращенныйСписок),

которое обращает списки. Например,

        обращение( [a, b, c, d],[d, c, b, a] ).

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

3. 5.    Определите предикат

        палиндром( Список).

Список называется палиндромом, если ончитается одинаково, как слева направо, так исправа налево. Например,  [м, а, д, а, м].

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

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

        сдвиг( Список1,Список2)

таким образом, чтобы Список2представлял собой Список1,"циклически сдвинутый" влево на один символ.Например,

        ?-  сдвиг( [1, 2, 3, 4,5], L1),

             сдвиг1( LI,L2)

дает

        L1 = [2, 3, 4, 5, 1]

        L2 = [3, 4, 5, 1, 2]

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

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

        перевод( Список1,Список2)

для перевода списка чисел от 0 до 9 в списоксоответствующих слов. Например,

        перевод( [3, 5, 1, 3],[три, пять, один, три] )

Используйте в качестве вспомогательныхследующие отношения:

        означает( 0, нуль).

        означает( 1, один).

        означает( 2, два).

        . . .

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

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

        подмножество(Множество, Подмножество)

где Множество и Подмножество- два списка представляющие два множества.Желательно иметь возможность использовать этоотношение не только для проверки включенияодного множества в другое, но и для порождениявсех возможных подмножеств заданного множества.Например:

        ?-  подмножество([а, b, с], S ).

        S = [a, b, c];

        S = [b, c];

        S = [c];

        S = [ ];

        S = [a, c];

        S = [a];

        . . .

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

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

        разбиениесписка(Список, Список1, Список2)

так, чтобы оно распределяло элементы спискамежду двумя списками Список1 и Список2и чтобы эти списки были примерно одинаковойдлины. Например:

        разбиениесписка( [а,b, с, d, e], [a, с, е], [b, d]).

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

3. 10.    Перепишите программу обобезьяне и бананах из главы 2 таким образом, чтобыотношение

        можетзавладеть(Состояние, Действия)

давало не только положительный илиотрицательный ответ, но и порождалопоследовательность действий обезьяны,приводящую ее к успеху. Пусть Действиябудет такой последовательностью, представленнойв виде списка ходов:

        Действия = [ перейти(дверь, окно),

                              передвинуть( окно, середина),

                              залезть, схватить ]

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

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

        линеаризация(Список, ЛинейныйСписок)

где Список может быть списком списков,а ЛинейныйСписок - это тот же список, но"выровненный" таким образом, что элементыего подсписков составляют один линейный список.Например:

        ? - линеаризация( [а,d, [с, d], [ ], [[[е]]], f, L).

        L = [a, b, c, d, e, f]

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

Назад | Содержание| Вперёд









Главная | В избранное | Наш E-MAIL | Добавить материал | Нашёл ошибку | Наверх