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

% Процедура

%

% ответпольз( Цель, Трасса, Ответ)

%

% порождает, используя механизм возвратов, все решения

% для целевого утверждения Цель, которые указал пользователь.

% Трасса - это цепочка целей-предков и правил,

% используемая для объяснения типа "почему".

        ответпольз( Цель, Трасса, Ответ) :-

                можно_спросить( Цель, _ ),                % Можно спросить ?

                копия( Цель, Копия),                           % Переименование переменных

                ответпольз( Цель, Копия, Трасса, Ответ, 1).

% Не спрашивать второй раз относительно конкретизированной цели

        ответпольз( Цель, _, _, _, N) :-

                N > 1,                                                       % Повторный вопрос?

                конкретный( Цель),  !,                         % Больше не спрашивать

                fail.

% Известен ли ответ для всех конкретизации утверждения Цель?

        ответпольз( Цель, Копия, _, Ответ, _ ) :-

                сказано( Копия, Ответ, _ ),

                конкретизация( Копия, Цель),  !.       % Ответ известен

% Найти все известные решения для Цель с индексами, начиная с N

        ответпольз( Цель, _, _, правда, N) :-

                сказано( Цель, правда, М),

                М >= N.

% Все уже сказано об утверждении Цель?

        ответпольз( Цель, Копия, _, Ответ, _) :-

                конец_ответов( Копия),

                конкретизация( Копия, Цель),  !,      % Уже все сказано

                fail.

% Попросить пользователя дать (еще) решения

        ответпольз( Цель, _, Трасса, Ответ, N) :-

                спросить_польз( Цель, Трасса, Ответ, N).

        спросить_польз( Цель, Трасса, Ответ, N) :-

                можно спросить( Цель, ВнешФормат),

                формат( Цель, ВнешФормат, Вопрос, [ ], Перем),

                                                                     % Получить формат вопроса

                спросить( Цель, Вопрос, Перем, Трасса, Ответ, N).

        спросить( Цель, Вопрос, Перем, Трасса, Ответ, N) :-

                nl,

                ( Перем = [ ],  !,                       % Сформулировать вопрос

                write( 'Это правда: ');

                write( 'Есть (еще) решения для :' )),

                write( Вопрос), write( '?'),

                принять( Ответ1),  !,              % Ответ1 - да/нет/почему

                обработать( Ответ1, Цель, Вопрос, Перем,

                                                                                Трасса, Ответ, N).

        обработать( почему, Цель, Вопрос, Перем,

                                                                                Трасса, Ответ, N):-

                 выд_трассу( Трасса),

                 спросить( Цель, Вопрос, Перем, Трасса, Ответ, N).

        обработать( да, Цель,_, Перем, Трасса, правда, N) :-

                след_индекс( Инд),

                                        % Получить новый индекс для "сказано"

                Инд1 is Инд + 1,

                ( запрос_перем( Перем),

                assertz( сказано( Цель, правда, Инд) );

                                                                  % Запись решения

                копия( Цель, Копия),            % Копирование цели

                ответпольз( Цель, Копия, Трасса, Ответ, Инд1) ).

                                                                  % Есть еще решения?

        обработать( нет, Цель, _, _, _, ложь, N) :-

                копия( Цель, Копия),

                сказано( Копия, правда, _),  !,

                                        % 'нет' означает, больше нет решений

                assertz( конец_ответов( Цель) ),

                                        % Отметить конец ответов

                fail;

                след_индекс( Инд),

                                        % Следующий свободный индекс для "сказано"

                assertz( сказано( Цель, ложь, Инд) ).

                                        % 'нет' означает нет ни одного решения

        формат( Пер, Имя, Имя, Перем, [Пер/Имя | Перем]) :-

                var( Пер),  !.

        формат( Атом, Имя, Атом, Перем, Перем) :-

                atomic( Атом),  !,

                atomic( Имя).

        формат( Цель, Форм, Вопрос, Перем0, Перем) :-

                Цель =.. [Функтор | Apг1],

                Форм =.. [Функтор | Форм1],

                формвсе( Apг1, Форм1, Арг2, Перем0, Перем),

                Вопрос =.. [Функтор | Арг2].

        формвсе( [ ], [ ], [ ], Перем, Перем).

        формвсе( [Х | СпХ], [Ф | СпФ], [В | СпВ], Перем0, Перем) :-

                формвсе( СпХ, СпФ, СпВ, Перем0, Перем1),

                формат( X, Ф, В, Перем1, Перем).

        запрос_перем( [ ]).

        запрос_перем( [Переменная/Имя | Переменные]) :-

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

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

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

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

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

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

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

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

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