Читаем 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)

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

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

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

12 великих трагедий
12 великих трагедий

Книга «12 великих трагедий» – уникальное издание, позволяющее ознакомиться с самыми знаковыми произведениями в истории мировой драматургии, вышедшими из-под пера выдающихся мастеров жанра.Многие пьесы, включенные в книгу, посвящены реальным историческим персонажам и событиям, однако они творчески переосмыслены и обогащены благодаря оригинальным авторским интерпретациям.Книга включает произведения, созданные со времен греческой античности до начала прошлого века, поэтому внимательные читатели не только насладятся сюжетом пьес, но и увидят основные этапы эволюции драматического и сценаристского искусства.

Александр Николаевич Островский , Иоганн Вольфганг фон Гёте , Оскар Уайльд , Педро Кальдерон , Фридрих Иоганн Кристоф Шиллер

Драматургия / Проза / Зарубежная классическая проза / Европейская старинная литература / Прочая старинная литература / Древние книги
Волчья тропа
Волчья тропа

Мир после ядерной катастрофы. Человечество выжило, но высокие технологии остались в прошлом – цивилизация откатилась назад, во времена Дикого Запада.Своенравная, строптивая Элка была совсем маленькой, когда страшная буря унесла ее в лес. Суровый охотник, приютивший у себя девочку, научил ее всему, что умел сам, – ставить капканы, мастерить ловушки для белок, стрелять из ружья и разделывать дичь.А потом она выросла и узнала страшную тайну, разбившую вдребезги привычную жизнь. И теперь ей остается только одно – бежать далеко на север, на золотые прииски, куда когда-то в поисках счастья ушли ее родители.Это будет долгий, смертельно опасный и трудный путь. Путь во мраке. Путь по Волчьей тропе… Путь, где единственным защитником и другом будет таинственный волк с черной отметиной…

Алексей Семенов , Бет Льюис , Даха Тараторина , Евгения Ляшко , Сергей Васильевич Самаров

Фантастика / Приключения / Боевик / Славянское фэнтези / Прочая старинная литература