Подтвердить что ты не робот

Почему круглые скобки не нужны для атомов, которые являются высокоприоритетными операторами?

В старых учебниках 1 часто встречаются объявления операторов, подобные следующим:

?- op(1200,fx,(:-)).
              ^  ^

Эти круглые скобки были необходимы. Но сегодня они больше не нужны:

| ?- writeq(op(1200,fx,(:-))).     
op(1200,fx,:-)

Почему они больше не нужны? Как стандарт справляется с этой ситуацией?


1 стр .97 6. Стандартные служебные декларации справочного руководства MU-Prolog 3.2db, появившиеся в "Отрицании и контроле в прологе" Ли Найша, LNCS 238, Springer-Verlag 1985.

4b9b3361

Ответ 1

op(1200,fx,:-) является составным термином в функциональных обозначениях.

Цитата 6.3.3 Составные термины --- функциональная нотация:

Компонентный термин, записанный в функциональном обозначении, имеет вид f(A1,...,An), где каждый аргумент Ai является аргументом arg  и они разделяются запятой.

term = atom, open ct, arg list, close;

arg list = arg;
arg list = arg, comma, arg list;

Цитата 6.3.3.1 Аргументы:

Аргумент (представленный arg в правилах синтаксиса) встречается как аргумент составного термина или элемента списка. Это может быть атом, который является оператором, или термин с приоритетом не более 999.

arg = atom;, если атом является оператором (с произвольным приоритетом)
arg = term; (с приоритетом 999)

Из-за вышеописанного случая arg = atom;, :- не нуждается в круглых скобках в op(1200,fx,:-).

Если бы это было не для особого случая, нам нужны круглые скобки, так как вывод должен был бы следовать 6.3.1.3 Атомы:

term = atom; с приоритетом 0, если атом не является оператором term = atom; с приоритетом 1201, если атом является оператором.


Ответ 2

Все перечисленное относится к ISO/IEC 13211-1:1995. Позвольте мне вырваться наизнанку...

6.5.1     graphic char       = ":";
          graphic char       = "-";

6.4.2     graphic token char = graphic char;

          graphic token      = graphic token char, { graphic token char };

          name token         = graphic token;

6.4       name               = [ layout text sequence (* 6.4.1 *) ], name token;

6.3.1.3   atom               = name;

6.5.3     open  char         = "(";
          close char         = ")";
          comma char         = ",";

6.4.8     open  token        = open  char; 
          close token        = close char;
          comma token        = comma char;

6.4.1     (* grammar rules for layout text sequence were omitted *)

6.4       comma              = comma token;
          open ct            = open  token;
          close              = [ layout text sequence ], close token;

6.3.3.1   arg                = atom; (* if that atom is an operator *)
          arg                = term; (* otherwise: priority = 999   *)

6.3.3     arg list           = arg;
          arg list           = arg, comma, arg list;

6.3.3     term               = atom, open ct, arg list, close ;

Итак, мы возвращаемся к первоначальному вопросу:

Эти круглые скобки были необходимы. Но сегодня они больше не нужны. Почему они больше не нужны? Как стандарт справляется с этой ситуацией?

Предположим, что выполнено T = op(1200,fx,:-).

  • T является составным термином, предусмотренным в функциональной нотации.

  • T покрывается приведенным выше правилом term = atom, open ct, arg list, close;

  • atom соответствует op, который является функтором T.

  • open ct соответствует открытой скобке.

  • "средняя часть" (аргументы T) покрывается правилами грамматики для arg list.

  • arg list является непустым списком arg.

  • Что arg?

    • термин с приоритетом менее 1000, приоритет (',')/2. Например, 1200 и fx.

    • атом, являющийся оператором. (Нет строк!)

  • close совпадает с закрывающей скобкой.

Цитирование:

Аргумент (представленный arg в правилах синтаксиса встречается как аргумент члена или элемента списка compount.Это может быть атом, который является оператором, или термин с приоритетом не более 999. Когда аргумент является произвольным термином, его приоритет должен быть меньше приоритета оператора "," (запятая), так что между запятой как оператором инфикса и запятой нет конфликта между разделителем или разделителем элементов списка.

Примечание:

Эта концепция "аргумента" гарантирует, что оба выражения f(x,y) и f(:-, ;, [:-, :-|:-]) являются синтаксически правильными, какие бы определения операторов в настоящее время не определены. Comma не является атомом, а следующие "термины" имеют синтаксические ошибки: f(,,a), [a,,|v] и [a,b|,]; но синтаксически справедливы следующие два термина: f(',',a), [a,','|v] и [a,b|','].