Существует ли грамматика / спецификация пролога?
Существует ли грамматика языка пролога или что-то близкое к ней, которое обычно используется в качестве справочного материала? Я использую SWI-пролог, поэтому было бы неплохо иметь один для этого варианта, в противном случае также подойдет общая грамматика / спецификация языка пролога.
3 ответа
С 1995 года существует стандарт ISO/IEC для Пролога: ISO/IEC 13211-1:1995. Он также содержит грамматику, определяющую синтаксис Пролога, который состоит из двух уровней:
Уровень токена: (6,4 токена, 6,5 набора символов процессора)
Они определяются с помощью регулярных выражений и используют самое длинное совпадение ввода / жадное потребительское правило / жадное совпадение / максимальное жаворонок, как и во многих языках той эпохи. В словах стандарта (6.4):
Токен не должен сопровождаться такими символами, чтобыТакой способ определения токенов типичен для языков программирования, появившихся в 1970-х годах.
объединяя символы токена с этими
символы образуют действительный токен, как указано выше
синтаксис.ЗАМЕТКИ
1 Это правило нетерпеливого потребителя:123.e
определяет токены
123 . e
,layout text
иногда необходимо
разделите два жетона.
Уровень токенов имеет особое значение для синтаксиса Пролога, потому что term
, или же read term
сначала определяется как последовательность токенов:
term (* 6.4 *)
= { token (* 6.4 *) } ;
read term (* 6.4 *)
= term (* 6.4 *) , end (* 6.4 *) ;
Многие токены содержат необязательный layout text sequence
в начале. Но никогда в конце. Также обратите внимание, что для определения конца (то есть завершающего периода), необходимо обратиться к следующему символу. В токенизаторе, написанном на Прологе, это будет реализовано с peek_char/1
,
Только после определения термина на этом уровне, фактическая грамматика вступает в игру. См. 8.14.1.1 Описание read_term/3
, Конечно, реализация может делать это по-другому, если она ведет себя "как будто".
Уровень синтаксиса: (6.2 Пролог текста и данных, 6.3 Термины)
Эти определения опираются на полный контекстно-свободный грамматический формализм плюс несколько контекстно-зависимых ограничений.
Соответствие
Что касается соответствия реализаций, см. Эту таблицу. SWI всегда отличались во многих своеобразных отношениях: как на уровне токенов, так и на уровне синтаксиса. Даже операторский синтаксис ( для некоторых случаев) несовместим с другими системами и стандартом. То есть определенные термины читаются по-разному. Начиная с SWI7, SWI теперь отличается даже для канонического синтаксиса. Пытаться writeq('.'(1,[])).
Это должно дать [1]
, но SWI7 выдает некоторую ошибку.
Для соответствующих реализаций смотрите /questions/tagged/sicstus-prolog (версия 4.3) и gnu-prolog.
В частности, для SWI-Prolog все немного "сложно". Он никогда строго не соответствовал ISO, и текущая версия разработки (SWI-Prolog 7 и выше) отошла еще дальше от соответствия ISO. Версия для разработчиков на данный момент является единственной "активно" поддерживаемой версией, что означает, что вскоре вы можете ожидать, что ошибки не будут удалены из SWI-Prolog 6.
Что касается справки, вам придется прочитать руководство и надеяться выяснить, что правильно, а что нет. Вся информация есть, даже если она не очень аккуратно организована.
Здесь вы можете начать:
http://www.swi-prolog.org/pldoc/man?section=syntax
В книгах рекомендуется:
http://www.swi-prolog.org/pldoc/man?section=intro
на самом деле это то, что вы не можете полностью обойти, к сожалению (я был бы рад, если кто-то докажет, что я неправ). Получите хотя бы один из трех перечисленных там. Sterling & Shapiro, 1986, например, является хорошей отправной точкой. Онлайн-учебник на http://www.learnprolognow.org/ также довольно хорош.
Что-то еще: в "Ремесле Пролога" Ричарда О'Кифа вы можете найти полную реализацию токенизатора Пролога, написанного на Прологе (10.7, сс. 337-354). Я не знаю, послужит ли это вашей цели.
И несколько советов: приложите усилия, чтобы установить текущую версию разработки, если вы собираетесь использовать SWI-Prolog. Это довольно просто для Linux (не знаю, как это работает на MacOS на практике, но я сомневаюсь, что это сложнее).
По крайней мере, есть стандарт ISO (см. Его страницу создателя).