Читаем 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, Перем).

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

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

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

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

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных