logo
Моделирование систем / Моделирование систем / Теория / Dop / АИС_Конспект

3.4.2. Управления поиском решения в vip

Несмотря на то, предикат rukovodit (см. предыдущий пример) порождает несколько ответов, процессор логического вывода находит первое решение, которое соответствует поставленной цели.

При обработке целевого утверждения процессор логического вывода использует так называемую точку возврата.

Пусть имеется некоторая цель:

P:-P1,P2,P3. Где P – цель, а P1,P2,P3 – подцели.

При обработке данного правила возможны варианты рассмотренные ниже.

Если выполнение первой подцели дает значение ИСТИНА, выполняется переход ко второй подцели, если она дает значение ИСТИНА, то выполняется переход к третьей подцели. Если третья подцель дает значение ИСТИНА, то правило P считается выполненным.

Пусть подцель P3 дала значение ЛОЖЬ, тогда выполняется переход к подцели P2 так как там было найдено последнее правильное решение. Отыскивается, если возможно новое решение для данной подцели и выполняется снова переход к подцели P3 для отыскания правильного решения. Если подцель P2, не дает правильного результата, то выполняется переход к подцели P1 и делается попытка найти новое для нее решение. Если такое решение найдено, выполняется переход к P2 для поиска нового правильного решения, иначе правило P считается невыполнимым.

Такой процесс поиска решения – поиск решения с возвратом. Чтобы получить все решения для правила P нужно найти все возможные решения для подцелей.

Для решения этой задачи служит системный предикат fail. Обработка данного предиката всегда возвращает значение ЛОЖЬ.

Пример. Правило вывода для получения полной информации о предметной области нужно представить в виде.

vyvod:-

rukovodit(Rukov,Otdel),write(Rukov,"\t",Otdel),

nl,fail.

vyvod.

Второй вариант пустого правила нужен для вывода значения yes – решение найдено при завершении работы программы. На рисунке видно, что выведена полная информация о предметной области и найдено верное решение в соответствии с правилом, что отелом «маркетинг» руководит то же лицо, что и отделом «сбыт» (см рис 3.5.)

Рис. 3.5. Обработка предметной области.

Так как в правиле вывода системный предикат fail последний, то после вывода информации об отделе склад происходит повторный возврат к предикату rukovodit, системные предикаты write и nl детерминированные и они пропускаются, и результат их обработки всегда дает значение ИСТИНА. Обращение будет происходить до тех пор пока предикат rukovodit будет возвращать результат из своей процедуры.

При работе с предметной областью может возникнуть ситуация когда нужно прекратить поиск решения предоставляемого не детерминированным предикатом, либо нужно прекратить поиск по условию. Для этого используется системный предикат «отсечение». Такой предикат обозначается как «!» . При наличии отсечения в правиле оно выполняется до тех пор пока не будет выполнен предикат «отсечение», затем обработка правила продолжается до его завершения символом «.»

Если в рассмотренной выше программе изменить правило, так как это показано ниже, вывод информации о руководителях прекратиться после обнаружения фамилии «Петров О.И.».

vyvod:-

rukovodit(Rukov,Otdel),write(Rukov,"\t",Otdel),nl,

Rukov="Петров О.И",!.

vyvod.

Отсечение используется также совместно с логической связкой «ИЛИ» для вывода сообщений об ошибке поиска данных.

Пример. Правило поиска отдела по фамилии руководителя с выводом сообщения об ошибке поиска.

poisk:-write("Руководитель="),readln(Rukov),

rukovodit(Rukov,Otdel),write(Otdel),!;

write("Нет данных !").