Программирование на языке ПРОЛОГ для искуственного интеллекта




Программа 2 - часть 2


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

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

В этой программе отношение небьет более хитрое.

line();

решение( Ферзи) :-
        перестановка( [1, 2, 3, 4, 5, 6, 7, 8], Ферзи),
        безопасный( Ферзи).

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

перестановка( [Голова | Хвост], СписПер) :-
        перестановка( Хвост, ХвостПер),
        удалить( Голова, СписПер, ХвостПер).

                            % Вставка головы в переставленный хвост

удалить( А, [А | Список).

удалять( А, [В | Список], [В, Список1] ) :-
        удалить( А, Список, Список1).

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

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

небьет( _, [ ], _ ).

небьет( Y, [Y1 | СписY], РасстХ) :-
    Y1-Y =\= РасстХ,
    Y-Y1 =\= РасстХ,
    Расст1 is РасстХ + 1,
    небьет( Y, СписY, Расст1).

line();

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

Трудность состоит в том, что расположение ферзей определяется только их Y-координатами, а Х-координаты в представлении позиции не присутствуют в явном виде. Этой трудности можно избежать путем небольшого обобщения отношения небьет, как это показано на рис. 4.8. Предполагается, что цель

        небьет( Ферзь, Остальные)

обеспечивает отсутствие нападении ферзя Ферзь на поля списка Остальные в случае, когда расстояние по Х между Ферзь и Остальные равно 1.


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