Понимание предиката предложения / 2

#prolog #clause

#пролог #предложение

Вопрос:

В настоящее время я пытаюсь изучить некоторый пролог (используя ECLiPSe). Время от времени я сталкиваюсь с предикатом clause / 2, но я не могу понять, для чего он используется. Я прочитал некоторые ссылки (например, эту), но я все еще не понимаю, в каком случае это могло бы быть полезно. Может кто-нибудь предоставить мне простой пример или объяснение этого?

Ответ №1:

Этот предикат позволяет выполнять метапрограммирование, то есть рассуждать о вашей программе Prolog.

SWI-Prolog использует clause/2 в, a.o., explain предикат:

 ?- explain(member).
"member" is an atom
        Referenced from 12-th clause of pce_meta:pce_to_pl_type/3
lists:member/2 is a predicate defined in
        c:/program files/swi-prolog/library/lists.pl:81
        Referenced from 1-th clause of prolog_dialect:source_exports/2
        Referenced from 1-th clause of pce_config:term_description/2
        Referenced from 1-th clause of pce_config:config_attribute/2
        Referenced from 1-th clause of pce_config:load_config_key/2
        Referenced from 1-th clause of pce_config:term_description/3
        Referenced from 1-th clause of pce_config:current_config_path/1
        Referenced from 4-th clause of persistent_frame:has_specifier/1
true.
  

и в реализации правил обработки ограничений. Я подозреваю, что это также полезно для индуктивного логического программирования и различных других расширений Prolog.

Подробное введение в метапрограммирование в Prolog см. в книге «Искусство пролога» Стерлинга и Шапиро.

Комментарии:

1. Итак, предикат позволяет проверить, существует ли динамическое предложение, которое было бы успешным с заданными заголовком и телом?

2. @redfalcon: необязательно динамическое предложение, оно также находит статические предложения.

Ответ №2:

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

 quine :-
    clause(quine, A),
    portray_clause((quine:-A)).
  

найдено здесь

что, конечно, является случаем метапрограммирования, как сказал ларсманс