Что означает двойной sla sh `//` после имени предиката в Прологе, появляющийся в контексте DCG? - PullRequest
2 голосов
/ 17 марта 2020

Некоторые «предикатные индикаторы» (это стандартная терминология ISO для functor/arity выражений) не удовлетворяются одним sla * sh, но на самом деле принимают два. Это всегда происходит в контексте DCG. Примеры:

  • syntax_error // 1 : "Сгенерировать синтаксическую ошибку Error в текущем местоположении ввода. Этот предикат предназначен для вызова из обработчика phrase_from_file/3. "
  • js_expression (+ Expression) // :" Выдать один JSON аргумент. "

Ответы [ 2 ]

3 голосов
/ 17 марта 2020

Согласно недавним проектам WDTR 13211-3 (3.19) это называется нетерминальным индикатором. Подобно индикатору предиката (3.131) он используется для обозначения одного конкретного нетерминала.

Обратите внимание, что большинство реализаций переводят нетерминал nt // n к предикату nt / n + 2 . Вы не можете полагаться на точный способ перевода, однако. И, таким образом, результат вызова нетерминала напрямую путем вызова соответствующего предиката, то есть с тем же именем и двумя дополнительными аргументами, не определен. В частности, второй дополнительный аргумент должен обрабатываться с осторожностью. Прямое использование может нарушать стойкость, особенно при использовании .

2 голосов
/ 17 марта 2020

Что означает двойной знак sh // после имени предиката в Прологе, встречающегося в контексте DCG?

Используется термином перезапись система Пролог (SWI-Пролог ср c), но для человека это позволяет вам знать, что предикат является DCG и имеет два скрытых аргумента, добавленных в конец предиката.

Например, вот очень простая DCG с 1 видимым аргументом.

simple_dcg(X) -->
    { X is 1 + 2 }.

Когда список виден

?- listing(simple_dcg).
simple_dcg(X, A, B) :-
    X is 1+2,
    B=A.

true.

, появляются два дополнительных скрытых аргумента (A, B) ,


Если вы следили за моими EDCG вопросами на форуме SWI-Prolog, то вы знаете, что это может стать намного сложнее.

...