!.

        встав( Д, [Д1 | ДД], [Д, Д1 | ДД] ) :-

                реш( Д1),  !.

        встав( Д, [Д1 | ДД], [Д1 | ДД1] ) :-

                реш( Д),

                встав( Д, ДД, ДД1),  !.

        встав( Д, [Д1 | ДД], [Д, Д1 | ДД] ) :-

                f( Д, F), f( Д1, F1), F=< F1,  !.

        встав( Д, [Д1 | ДД], [ Д1 | ДД1] ) :-

                встав( Д, ДД, ДД1).

% 'оценка' находит 'возвращенную' F-оценку И / ИЛИ-списка деревьев

        оценка( или :[Дер | _ ], F) :-

                                        % Первое дерево ИЛИ-списка - наилучшее

                f( Дер, F),  !.

        оценка( и :[ ], 0) :-   !.

        оценка( и : [Дер1 | ДД], F) :-

                f( Дер1, F1),

                оценка( и : ДД, F2),

                F is F1 + F2,  !.

        оценка( Дер, F) :-

                f( Дер, F).

% Отношение выбор( Деревья, Лучшее, Остальные, Предел, Предел1):

% Остальные - И / ИЛИ-список Деревья без его 'лучшего' дерева

% Лучшее; Предел - ограничение для Списка Деревья, Предел1 -

% ограничение для дерева Лучшее

        выбор( Оп : [Дер], Дер, Оп : [ ], Предел, Предел) :-  !.

                                                               % Только один кандидат

        выбор( Оп : [Дер | ДД], Дер, Оп : ДД, Предел, Предел1) :-

                оценка( Оп : ДД, F),

                ( Оп = или,  !,  мин( Предел, F, Предел1);

                Оп = и, Предел1 is Предел - F).

        мин( А, В, А) :- А < В,   !.

        мин( А, В, В).

Рис. 13. 12.  Программа поиска с предпочтением в И / ИЛИ-графе.

Еще одна процедура

        собрать( ОстДер, НовДер, ЕстьРеш1, НовДеревья, ЕстьРеш)

связывает между собой несколько объектов, с которыми работает расширспис. НовДер - это расширенное дерево, взятое из списка деревьев процедуры расширспис, ОстДер - остальные, не измененные деревья из этого списка, а ЕстьРеш1 указывает на 'решающий статус' дерева НовДер. Процедура собрать имеет дело с несколькими случаями в зависимости от значения ЕстьРеш1, а также от того, является ли список деревьев И-списком или ИЛИ-списком. Например, предложение

        собрать( или : _, Дер, да, Дер, да).

Вы читаете Prolog
Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату