Может ли предложение Пролога быть двусмысленным, и не могли бы вы показать мне пример?
Я знаю, что синтаксические анализаторы могут быть неоднозначными в том смысле, что они могут генерировать два разных дерева синтаксического анализа...
Может ли предложение Пролога быть двусмысленным, и не могли бы вы показать мне пример?
Я знаю, что синтаксические анализаторы могут быть неоднозначными в том смысле, что они могут генерировать два разных дерева синтаксического анализа...
Нет, Пролог формально не является двусмысленным, но предлагает синтаксическую особенность, которая может привести к трудным для понимания программам, а именно op/3 объявление. Как вы можете прочитать в документации
Приложения должны быть осторожны с (пере)определением операторов, потому что изменение операторов может привести к тому, что (другие) файлы будут интерпретироваться по-другому.
Это похоже на перегрузку операторов C++ на стероидах, и возможность определять новые операторы (или переопределять уже известные системе) может быть очень ценной при программировании DSL (предметно-ориентированных языков). См., например, библиотеку (clpfd) или лямбда.
Историческое значение имеет точечный оператор. В основном он используется в качестве терминатора предложения, но более старый Пролог использовал его как «список минусов». Вот мой ответ на эту тему. Обратите внимание на начальное объявление
:- op(103, xfy, (.)).
что позволяет компактное определение (например)
seek_call(A.As, _.Ms, B.As, V) :-
nonvar(A),
A =.. F.FAs,
seek_call(FAs, Ms, FBs, V),
!, B =.. F.FBs.
это эквивалентно
seek_call([A|As], [_|Ms], [B|As], V) :-
nonvar(A),
A =.. [F|FAs],
seek_call(FAs, Ms, FBs, V),
!, B =.. [F|FBs].
xfx
, вы могли бы вывести ошибку конфликта приоритета оператора из Пролога, выполнив что-то вродеX.Y.Z
. Однако неоднозначность разрешается ошибкой. 02.10.2013