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

               принадлежит( Y, [1, 2, 3, 4, 5, 6, 7, 8] ),

               небьет( X/Y, Остальные).

Осталось определить отношение небьет:

        небьет( Ф, Фспис)

И снова его описание можно разбить на два случая:

(1)        Если список Фспис пуст, то отношение, конечно, выполнено, потому что некого бить (нет ферзя, на которого можно было бы напасть).

(2)        Если Фспис не пуст, то он имеет форму

        [Ф1 | Фспис1]

и должны выполняться два условия:

        (а)         ферзь на поле Ф не должен бить ферзя на поле Ф1 и

        (b)         ферзь на поле Ф не должен бить ни одного ферзя из списка Фспис1.

Выразить требование, чтобы ферзь, находящийся на некотором поле, не бил другое поле, довольно просто: эти поля не должны находиться на одной и той же горизонтали, вертикали или диагонали: Наш шаблон решения гарантирует, что все ферзи находятся на разных вертикалях, поэтому остается только обеспечить, чтобы

Y-координаты ферзей были различны и

ферзи не находились на одной диагонали, т.е. расстояние между полями по направлению Х не должно равняться расстоянию между ними по Y.

На рис. 4.7 приведен полный текст программы. Чтобы облегчить ее использование, необходимо добавить список-шаблон. Это можно сделать в запросе на генерацию решений. Итак:

        ?-  шаблон( S), решение( S).

решение( [ ] ).

решение( [X/Y | Остальные ] ) :-

                        % Первый ферзь на поле X/Y,

                        % остальные ферзи на полях из списка Остальные

        решение( Остальные),

        принадлежит Y, [1, 2, 3, 4, 5, 6, 7, 8] ),

        небьет( X/Y | Остальные).

                        % Первый ферзь не бьет остальных

небьет( _, [ ]).                                 % Некого бить

небьет( X/Y, [X1/Y1 | Остальные] ) :-

            Y =\= Y1,                             % Разные Y-координаты

            Y1-Y =\= X1-X                    % Разные диагонали

            Y1-Y =\= X-X1,

            небьет( X/Y, Остальные).

принадлежит( X, [X | L] ).

принадлежит( X, [Y | L] ) :-

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

% Шаблон решения

шаблон( [1/Y1, 2/Y2, 3/Y3, 4/Y4, 5/Y5, 6/Y6, 7/Y7, 8/Y8]).

Рис. 4. 7.  Программа1 для задачи о восьми ферзях.

Система будет генерировать решения в таком виде:

        S = [1/4, 2/2, 3/7, 4/3, 5/6, 6/8, 7/5, 8/1];

        S = [1/5, 2/2, 3/4, 4/7, 5/3, 6/8, 7/6, 8/1];

        S = [1/3, 2/5, 3/2, 4/8, 5/6, 6/4, 7/7, 8/1].

        . . .

Упражнение

4. 6.    При поиске решения программа, приведенная на рис. 4.7, проверяет различные значения Y-координат ферзей. В каком месте программы задается порядок перебора альтернативных вариантов? Как можно без труда модифицировать программу, чтобы этот порядок изменился? Поэкспериментируйте с разными порядками, имея в виду выяснить, как порядок перебора альтернатив влияет на эффективность программы.

4. 5. 2.    Программа 2

В соответствии с принятым в программе 1 представлением доски каждое решение имело вид

        [1/Y1, 2/Y2, 3/Y3, ..., 8/Y8]

так как ферзи расставлялись попросту в последовательных вертикалях. Никакая информация не была бы потеряна, если бы Х-координаты были пропущены. Поэтому можно применить более экономное представление позиции на доске, оставив в нем только Y-координаты ферзей:

        [Y1, Y2, Y3, ..., Y8]

Чтобы не было нападений по горизонтали, никакие два ферзя не должны занимать одну и ту же горизонталь. Это требование накладывает ограничение на Y-координаты: ферзи должны занимать все горизонтали с 1-й по 8-ю. Остается только выбрать порядок следования этих восьми номеров. Каждое решение представляет собой поэтому одну из перестановок списка:

        [1, 2, 3, 4, 5, 6, 7, 8]

Такая перестановка S является решением, если каждый ферзь в ней не находится под боем (список S - "безопасный"). Поэтому мы можем написать:

        решение( S) :-

              перестановка( [1, 2, 3, 4, 5, 6, 7, 8], S),

              безопасный( S).

Рис. 4. 8.    (а)     Расстояние по Х между Ферзь и Остальные равно 1.

(b)    Расстояние по Х между Ферзь и Остальные равно 3

Отношение перестановка мы уже определила в гл. 3, а вот отношение безопасный нужно еще определить. Это определение можно разбить на два случая:

(1)        S - пустой список. Тогда он, конечно, безопасный, ведь нападать не на кого.

(2)        S - непустой список вида [Ферзь | Остальные]. Он безопасный, если список Остальные - безопасный и Ферзь не бьет ни одного ферзя из списка Остальные.

На Прологе это выглядит так:

        безопасный( [ ]).

        безопасный( [Ферзь | Остальные ] :-

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

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

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

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

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

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

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

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

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