Инструменты пользователя

Инструменты сайта


examination:flp:question60

Содержание

not

Общий принцип заключается в том, что использование механизма отсечения для указания Прологу на ситуации, когда он выбрал единственно правильное правило, может быть заменено использованием предиката not. Это встроенный предикат Пролога, т. е. определение этого предиката заранее известно Пролог- системе. Поэтому его можно использовать, не выписывая каждый раз его определение (более полно встроенные предикаты описываются в гл. 6). Предикат not определен таким образом, что целевое утверждение not(X) истинно, только если X, рассматриваемое как целевое утверждение, не согласуется с базой данных. Таким образом, not(X) означает, что X недоказуемо как целевое утверждение Пролога, т. е. не согласовано с базой данных. В качестве примера использования not вместо отсечения перепишем два варианта определения предиката сумма следующим образом:

сумма(1,1).

cyммa(N,R) :— not(N = l), N1 is N—1, cyммa(N1,R1),

R is N1 + R1.

или

сумма(N,1) :— N =<1.

cyммa(N,R) :— not(N=<1), N1 is N—1 сумма(N1,R1),

R is N1 + R1.

В действительности в Прологе имеются другие удобные встроенные предикаты, которые могут заменить оба из приведенных вхождений предиката not. Например, можно заменить not(N=l) на N\=l, a not(N =< 1) на N>1. В общем случае это можно сделать не со всеми возможными условиями. Использование предиката not вместо отсечения свойственно для хорошего стиля программирования. Это связано с тем, что программы, содержащие отсечения, как правило, более трудны для чтения, чем программы, не содержащие их. Если удается локализовать все вхождения отсечения и заменить их с помощью предиката not, то программа станет более понятной. Однако определение not предполагает попытку доказать, что заданное целевое утверждение согласуется с базой данных. Поэтому если мы имеем программу, в общем виде представимую как

А:= B,b

A :- not(B),D

то Прологу для успешного завершения программы может потребоваться две попытки согласовать B. Он должен попытаться согласовать B при просмотре первого правила. Но если затем будет выполнен возврат и рассмотрено второе правило, то он будет вынужден попытаться согласовать B вновь, чтобы убедиться, может ли быть согласовано not(B). Такое дублирование приводит к потере эффективности программы, когда условие B достаточно сложно. Этого бы не произошло, если бы вместо при- веденной программы мы имели:

A :- B,1,b

A :- D

Таким образом, иногда нужно взвесить преимущества ясной про- граммы по сравнению с преимуществами ее быстрого выполнения.

nl

В Пролог включены три стандартных предиката для вывода.

Это:

  • предикат write;
  • предикат nl;
  • предикат writef.

Предикат write может быть вызван с произвольным числом аргументов:

 write(Param1,Param2,Param3,...,ParamN) % (i,i,i,...,i)

Эти аргументы могут быть либо константами из стандартных доменов, либо переменными. Если это переменные, то они должны быть входными параметрами.

Стандартный предикат nl (от англ. new line - новая строка) всегда используется вместе с предикатом write. Он обеспечивает переход на новую строку на экране дисплея. Например, следующие подцели:

pupil(PUPIL,CL),
write(PUPIL,"is in the",CL,"class"),
nl,
write("----------------------------").

могут привести к выводу на экран такого результата:

 Helen Smith is in the fourth class
 ------------------------------,

nobreak

Галимый гугл перевод, но и так все ясно

Примечание: это относится только к программам в текстовом режиме (в том числе EasyWin интерфейса стратегии и Windows32 Textmode) В случае отсутствия директивы компилятора nobreak, зрительная система Prolog будет генерировать код для проверки клавиатуры до каждого вызова предиката, для того, чтобы Ctrl-Break комбинацией клавиш не была нажата. Это замедляет выполнение программы немного и занимает немного больше пространства программы.

Nobreak директива запрещает это автоматическая генерация кода. Когда nobreak находится в работе, единственный способ избежать бесконечного цикла является перезагрузка компьютера (DOS, Phar Lap) или убить процесс в какой-то другой способ.Nobreak следует использовать только после того, как программа была тщательно протестирована.

examination/flp/question60.txt · Последние изменения: 2014/01/15 12:17 (внешнее изменение)