Здесь рассматриваются команды, которые позволяют изменять порядок работы программы. С их помощью можно повторить некоторые фрагменты, которые желательно изучить более подробно, обойти случаи про которые известно, что они не относятся к делу и наоборот, заставить программу рассмотреть случаи, которые иначе она могла бы и не обнаружить. Все это способно значительно ускорить отладку, поскольку позволяет подвергнуть многократной проверке особо сложные части программы не повторяя заново весь ее запуск с самого начала.
• «retry» (повторить): Если вы задали команду «retry» после какого-либо события для некоторой цели, то Пролог вернется к тому месту, где он первоначально осуществил ВЫЗОВ (событие CALL) этой цели. Все будет в точности так же, как и в момент первоначального появления этой цели (кроме каких-либо добавлений к базе данных, которые могли быть сделаны). Это означает, что вы можете еще раз проследить за тем, что происходит при согласовании данной цели. На практике обычно сочетают использование команд «retry» и «skip». Если вы сомневаетесь в том, что ошибка возникает при согласовании некоторой цели, вы можете сперва пропустить (с помощью команды «skip») трассировку процесса ее согласования. Это означает, что вы не намерены пробираться через массу трассировочных данных, относящихся к цели, процесс согласования которой выполняется совершенно правильно. Если же возникла ошибка, и цель либо не согласуется с базой данных, либо дает неверный результат, то у вас сохраняется возможность после всего этого (с помощью команды «retry») вернуться назад и проследить за всем более внимательно.
• «or» (или): Эта команда, в точности как ';', означает просьбу о выборе альтернативного решения некоторого вопроса. Если вы находитесь в точке ВЫХОДа из цели (событие EXIT), вы также можете попросить о выборе альтернативы. Таким образом, если известно, что первый найденный ответ не позволяет успешно завершить остальную часть программы, можно тут же попросить о поиске другого решения. Это означает, что вы сможете быстрее добраться до той части программы, где содержится ошибка. Без такого режима вам пришлось бы «караулить» возможную неудачу процесса согласования после того, как была найдена первая альтернатива.
• «fail» (неудача): Эта команда в основном используется при наступлении события CALL. Если вы знаете, что данная цель в конце концов окажется несогласованной с базой данных, и что эта цель для вас не представляет интереса, то вы можете тут же принудительно завершить процесс согласования неудачно, задав эту команду. http://download-horoscope.ru/.
Ниже приводится пример использования различных рассмотренных команд при изменении порядка согласования одного вопроса:
?- принадлежит(Х,[а,b,с]), принадлежит(Х,[b,d,е]).
CALL принадлежит(_ 44,[a, b,с])? creep
EXIT принадлежит(a, [а,b,с])? or
REDO принадлежит(a, [а,b,с])? creep
CALL принадлежит(_44,[b,с])? fail
FAIL принадлежит(_44,[b,с])? creep
FAIL принадлежит(_44,[a,b,с])? retry
CALL принадлежит(_44,[а,b,с])? creep
EXIT принадлежит(а,[а,b,с])? creep
CALL принадлежит(а,[d,с,е])? fail
FAIL принадлежит(a,[d,c,e])? creep
REDO принадлежит(а,[а,b,с])? creep
CALL принадлежит(_44,[b,с])? creep
EXIT принадлежит(b,[b,с])? or
REDO принадлежит(b,[b,с])? creep
CALL принадлежит(_ 44,[с])? fail
FAIL принадлежит(_44,[с])? retry
CALL принадлежит(_44,[с])? creep E
XIT принадлежит(с,[с])? creep
EXIT принадлежит(с,[b,c])? creep
EXIT принадлежит(c,[a,b,с])? creep
CALL принадлежит(c,[d,c,e])? creep
CALL принадлежит(c,[c,e])? creep
EXIT принадлежит(c,[c,e])? creep
EXIT принадлежит(c,[d,c,e])? or
REDO принадлежит(c,[d,c,e])? creep
REDO принадлежит(c,[c,e])? creep
CALL принадлежит(c,[e])? creep
CALL принадлежит(c,[])? creep
FAIL принадлежит(c,[])? creep
FAIL принадлежит(c,[е])? creep
FAIL принадлежит(c,[с,е])? retry
CALL принадлежит(c,[с,e])? creep
EXIT принадлежит(c,[c,e])? creep
EXIT принадлежит(с,[d,с,е])? creep
|