Что означает предложение без головы в Прологе?

В начале программы на Прологе я вижу:

:-dynamic(path/1).

Кажется, это пункт, у которого нет головы. Что это означает?


person hpn    schedule 05.01.2013    source источник


Ответы (2)


Когда интерпретатор Prolog видит :- перед предложением при загрузке программы, предложение сразу же выполняется, а не становится частью "базы данных" программы. Наиболее распространенное использование :- - это определение начального предиката вашей программы в конце вашего файла программы, так что загрузка файла с вашей программой вызывает ее запуск.

В частности, dynamic/1 информирует интерпретатор о том, что определение указанного предиката может измениться во время выполнения. . Это то, что интерпретатор должен знать перед прочтением остальной части вашей программы, чтобы он мог принять специальные меры для использования предиката path/1.

person Sergey Kalinichenko    schedule 05.01.2013

В тексте Пролога термин с главным функтором (:-)/1 является директивой.

Директива dynamic имеет следующий эффект:

  • Предикат P/N определен, даже если не указано никаких предложений. По умолчанию выполнение цели для предиката без каких-либо предложений вызывает ошибку существования.
  • Предикат может быть изменен с помощью asserta/1, rectract/1 и т.п. По умолчанию предикат является статическим, и попытка изменить его вызывает ошибку разрешения.
  • Пункты могут быть проверены с помощью clause/2. По умолчанию предикат является закрытым, и проверка с помощью clause/2 вызывает ошибку разрешения. В некоторых системах (таких как SWI) все пользовательские предикаты являются общедоступными и поэтому могут быть проверены с помощью clause/2. Таким образом, этот эффект не может наблюдаться в SWI.

Многие реализации обрабатывают неизвестные директивы как обычные цели и выполняют их. Однако реализации сильно различаются по точному моменту времени, когда эти цели выполняются. При перезагрузке файла они отличаются еще больше.

Если вы хотите, чтобы цель выполнялась сразу же после подготовки текста Пролога к выполнению, используйте директиву initialization/1.

person false    schedule 05.01.2013