Читаем Prolog полностью

%  Решение числовых ребусов

сумма( N1, N2, N) :-

                            % Числа представлены в виде списков цифр

сумма1( N1, N2, N,

                0, 0,

                            % Перенос справа и перенос влево равны 0

                [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], _ ).

                            % Все цифры доступны

сумма1( [ ], [ ], [ ], 0, 0, Цифры, Цифры).

сумма1( [D1 | N1], [D2 | N2], [D | N], C1, С, Циф1, Циф) :-

        сумма1( Nl, N2, N, C1, C2, Циф1, Циф2),

        суммацифр( Dl, D2, C2, С, Циф2, Циф).

суммацифр( Dl, D2, C1, D, С, Циф1, Циф) :-

        удалить( D1, Циф1, Циф2),

                                    % Выбор доступной цифры для D1

        удалить( D2, Циф2, Циф3),

                                    % Выбор доступной цифры для D2

        удалить( D, Циф3, Циф),

                                    % Выбор доступной цифры для D

        S is D1 + D2 + C1,

        D is S mod 10,

        С is S div 10.

удалить( A, L, L) :-

        nonvar( A),  !.

                                % Переменная А уже конкретизирована

удалить( А, [А | L], L).

удалить( А, [В | L], [В | L1]) :-

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

% Примеры ребусов

ребус1( [D, O, N, A, L, D],

              [G, E, R, A, L, D],

              [R, O, B, E, R, T].

ребус2( [0, S, E, N, D],

              [0, M, O, R, E],

              [M, O, N, E, Y].

Рис. 7. 2.  Программа для арифметических ребусов.

Иногда этот ребус упрощают, сообщая часть решения в виде дополнительного ограничения, например D равно 5. В такой форме ребус можно передать пролог-системе при помощи сумма1:

        ? -  сумма1( [5, O, N, A, L, 5],

                              [G, E, R, A, L, 5],

                              [R, O, B, E, R, T],

                              0, 0, [0, 1, 2, 3, 4, 6, 7, 8, 9], _ ).

Интересно, что в обоих случаях существует только одно решение, т.е. только один способ заменить буквы цифрами.

Упражнения

7. 1.    Напишите процедуру упростить для упрощения алгебраических сумм, в которых участвуют числа и символы (строчные буквы). Пусть эта процедура переупорядочивает слагаемые так, чтобы символы предшествовали числам. Вот примеры ее использования:

        ?-  упростить( 1 + 1 + а, Е).

        Е = а + 2

        ?-  упростить( l + a + 4 + 2 + b + с, E).

        Е = а + b + с + 7

        ?-  упростить( 3 + х + х, Е).

        Е = 2*х + 3

7. 2.  Определите процедуру

        добавить( Элемент, Список)

для добавления нового элемента в список. Предполагается, что все элементы, хранящиеся в списке, - атомы. Список состоит из всех хранящихся в нем элементов, а за ними следует хвост, который не конкретизирован и служит для принятия новых элементов. Пусть, например, в списке уже хранятся а, b и с, тогда

        Список = [а, b, с | Хвост]

где Хвост - переменная. Цель

        добавить( d, Список)

вызовет конкретизацию

        Xвoст = [d | НовыйХвост] и

        Список = [а, b, с, d | НовыйХвост]

Таким способом структура может наращиваться, включая в себя новые элементы. Определите также соответствующее отношение принадлежности.

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

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

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

7. 2.    Создание и декомпозиция термов:   =..,  functor,  arg,  name

Имеются три встроенные предиката для декомпозиции и синтеза термов: functor, arg и =.. . Рассмотрим сначала отношение =.. , которое записывается как инфиксный оператор. Цель

        Терм =.. L

истинна, если L - список, начинающийся с главного функтора терма Терм, вслед за которым идут его аргументы. Вот примеры:

        ?-  f( а, b) =.. L.

        L = [f, а, b]

        ?-  Т =.. [прямоугольник, 3, 5].

        Т = прямоугольник( 3, 5)

        ?-  Z =.. [р, X, f( X,Y) ].

        Z = p( X, f( X,Y) )

Зачем может понадобиться разбирать терм на составляющие компоненты - функтор и его аргументы? Зачем создавать новый терм из заданного функтора и аргументов? Следующий пример показывает, что это действительно нужно.

Рассмотрим программу, которая манипулирует геометрическими фигурами. Фигуры - это квадраты, прямоугольники, треугольники, окружности в т.д. В программе их можно представлять в виде термов, функтор которых указывает на тип фигуры, а аргументы задают ее размеры:

        квадрат( Сторона)

        треугольник( Сторона1, Сторона2, Сторона3)

        окружность( R)

Одной из операций над такими фигурами может быть увеличение. Его можно реализовать в виде трехаргументного отношения

Перейти на страницу:

Похожие книги

Слово о полку Игореве
Слово о полку Игореве

Исследование выдающегося историка Древней Руси А. А. Зимина содержит оригинальную, отличную от общепризнанной, концепцию происхождения и времени создания «Слова о полку Игореве». В книге содержится ценный материал о соотношении текста «Слова» с русскими летописями, историческими повестями XV–XVI вв., неординарные решения ряда проблем «слововедения», а также обстоятельный обзор оценок «Слова» в русской и зарубежной науке XIX–XX вв.Не ознакомившись в полной мере с аргументацией А. А. Зимина, несомненно самого основательного из числа «скептиков», мы не можем продолжать изучение «Слова», в частности проблем его атрибуции и времени создания.Книга рассчитана не только на специалистов по древнерусской литературе, но и на всех, интересующихся спорными проблемами возникновения «Слова».

Александр Александрович Зимин

Древнерусская литература / Прочая старинная литература / Прочая научная литература / Древние книги / Литературоведение / Научная литература