Что такое фигурные скобки в прологе?
Что означают фигурные скобки в прологе:
{a,b,c}
Я вижу, что могу использовать их, но они описывают кортежи или как?
Спасибо..
2 ответа
Пролог почти стар как C... с самого начала, он использовал своеобразный подход к синтаксису. Так как это так называемый гомоиконический язык, все, что это термин, то мы уверены, {a,b,c}
это термин... В моем старом интерпретаторе Пролога я обрабатывал '{' и '}' как отдельную пару операторов, поэтому мог обрабатывать правила DCG, как объяснено в Clocksin / Mellish Programming в приложении D к Прологу (будьте осторожны, Я гуглил по авторам и названию, книга является неофициальной копией, а книга, которую я использовал, была намного старше, может быть, 1985...)
Давайте рассмотрим синтаксис SWL-пролога REPL:
?- functor({a,b,c},F,N).
F = {},
N = 1.
так, {a,b,c}
это просто соединение, и a,b,c
его аргумент:
?- {a,b,c} =.. Syntax.
Syntax = [{}, (a, b, c)].
Кроме того, write_canonical помогает при изучении синтаксических подробностей, но в этом случае не очень понятно, что такое функтор:
?- write_canonical({a,b,c}).
{','(a,','(b,c))}
Заслуживающее внимания расширение SWI-Prolog, dicts, использует {}
построить чистое представление объекта...
С помощью фигурных скобок { } можно выделить нормальные цели Пролога из препроцессора "Определенное условие грамматики". Таким образом, содержимое в фигурных скобках может быть произвольным кодом Пролога, который просто не был предварительно обработан правилами DCG.
В качестве примера предположим, что у вас есть следующие правила для определения очень простой грамматики:
предложение -> nounPhrase, verbPhrase.
nounPhrase -> det, noun, { write ('имя существительное найдено'), nl }.
verbPhrase -> глагол, существительное Phrase, {запись ('глагол был найден'), nl }.
Цель написания "существительное найдено" или "глагол найден" не имеет никакого отношения к потреблению входной последовательности. Таким образом, Prolog позволяет добавлять любые необработанные цели в фигурные скобки. Отсутствие фигурных скобок для цели без предварительной обработки приведет к ошибке.
Цель "записи", добавленная выше в конце правила DCG, была лишь примером того, что делают фигурные скобки (нет практического смысла иметь цель "записи" в DCG). Но вот пример, который может быть полезен для улучшения словаря синтаксического анализатора: предположим, вы хотите, чтобы ваша грамматика различала существительные в единственном и множественном числе. Одним из вариантов будет иметь дополнительный аргумент, например:
существительное (n (мальчик), единственное число) -> [мальчик].
существительное (n (мальчик), множественное число) -> [мальчики].
Но по мере того, как вы добавляете все больше и больше существительных в словарь, вы добавляете ненужную сложность. Вместо этого вы можете написать правило Пролога в фигурных скобках, чтобы проверить, является ли ваше существительное единственным или множественным, что-то вроде этого:
n (n (NounSingular), Sgn_or_Pl) -> [Существительное], { isNoun (Существительное, NounSingular, Sgn_or_Pl) }.
Для полного описания полезности фигурных скобок, я рекомендую написать параграф "Добавление дополнительных тестов" в главе 8 из "Программирование на прологе" WF Clocksin, CS Mellish, доступный здесь Curly Brackets in Prolog.