Почему круглые скобки не нужны для атомов, которые являются высокоприоритетными операторами?
В старых учебниках 1 часто встречаются объявления операторов, подобные следующим:
?- op(1200,fx,(:-)).
^ ^
Эти круглые скобки были необходимы. Но сегодня они больше не нужны:
| ?- writeq(op(1200,fx,(:-))).
op(1200,fx,:-)
Почему они больше не нужны? Как стандарт справляется с этой ситуацией?
1 стр .97 6. Стандартные служебные декларации справочного руководства MU-Prolog 3.2db, появившиеся в "Отрицании и контроле в прологе" Ли Найша, LNCS 238, Springer-Verlag 1985.
Ответы
Ответ 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|',']
.