Чтение онлайн

на главную - закладки

Жанры

Неизвестно

Шрифт:

(2) Х и Y должны быть целыми числами от 1 до 8.

(3) Ферзь, стоящий на поле X / Y, не должен бить ни одного ферзя из списка Остальные.

Чтобы запрограммировать первое условие, можно воспользоваться самим отношением решение. Второе условие можно сформулировать так: Y должен принадлежать списку целых чисел от 1 до 8. т. е. [1, 2, 3, 4, 5, 6, 7, 8]. С другой стороны, о координате Х можно не беспокоиться, поскольку список-решение должен соответствовать

шаблону, у которого Х-координаты уже определены. Поэтому Х гарантированно получит правильное значение от 1 до 8. Третье условие можно обеспечить с помощью нового отношения небьет. Все это можно записать на Прологе так:

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

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

принадлежит( 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 - "безопасный"). Поэтому мы можем написать:

Поделиться:
Популярные книги

Око Силы. Трилогия. 1937 -1938 годы

Валентинов Андрей
Око силы
Фантастика:
альтернативная история
8.08
рейтинг книги
Око Силы. Трилогия. 1937 -1938 годы

Путешественник

Юань Е
3. Повелитель тайн
Фантастика:
фэнтези
эпическая фантастика
5.00
рейтинг книги
Путешественник

Я до сих пор не князь. Книга XVI

Дрейк Сириус
16. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я до сих пор не князь. Книга XVI

Ты ждала меня, Заруна? Книга первая

Лу Энн
1. Мир Заруны
Фантастика:
героическая фантастика
8.00
рейтинг книги
Ты ждала меня, Заруна? Книга первая

Точка Бифуркации V

Смит Дейлор
5. ТБ
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Точка Бифуркации V

Бояръ-Аниме. Газлайтер. Том 32

Володин Григорий Григорьевич
32. История Телепата
Фантастика:
альтернативная история
аниме
фэнтези
попаданцы
6.40
рейтинг книги
Бояръ-Аниме. Газлайтер. Том 32

Первое поражение Сталина

Жуков Юрий Николаевич
Документальная литература:
биографии и мемуары
5.00
рейтинг книги
Первое поражение Сталина

Солнечный ветер (сборник)

Кларк Артур Чарльз
Шедевры фантастики
Фантастика:
космическая фантастика
5.00
рейтинг книги
Солнечный ветер (сборник)

Рейдер

Астахов Павел Алексеевич
Проза:
современная проза
7.75
рейтинг книги
Рейдер

Цвет сверхдержавы - красный 3 Восхождение. часть 1

Сергей Симонов
3. Цвет сверхдержавы - красный
Фантастика:
альтернативная история
5.00
рейтинг книги
Цвет сверхдержавы - красный 3 Восхождение. часть 1

Белая гвардия. История России

Булгаков Михаил Афанасьевич
Белая гвардия
Проза:
современная проза
советская классическая проза
5.00
рейтинг книги
Белая гвардия. История России

Жрец Хаоса. Книга ХVI

Борзых М.
16. Зов пустоты
Фантастика:
аниме
фэнтези
эпическая фантастика
попаданцы
5.00
рейтинг книги
Жрец Хаоса. Книга ХVI

Покушения и инсценировки: От Ленина до Ельцина

Зенькович Николай Александрович
Документальная литература:
биографии и мемуары
публицистика
5.00
рейтинг книги
Покушения и инсценировки: От Ленина до Ельцина

Дитя прибоя

Трофимов Ерофей
Дитя прибоя
Фантастика:
боевая фантастика
попаданцы
фэнтези
5.25
рейтинг книги
Дитя прибоя