Операторы переназначения Пролога

Я новичок в прологе и пытаюсь переназначить операторы в прологе, изменив их приоритет. Я сталкиваюсь с 4 ошибками для следующего:

 :-op(1000,yf,+).  %unary plus%
 :-op(1000,yf,-).   %unary minus%
 :-op(750,yfx,"%").   %modulo%

Первые два дают мне аналогичную ошибку, которая выглядит следующим образом:

warning: directive failed (op(1000,xf,+)) with exception (error(permission_error(create,operator,+),op/3))

Я также получаю ошибку по модулю один (другая ошибка), но я подозреваю, что это потому, что я не должен заключать % в кавычки (но как я должен отличить его от маркера комментария?).

Я переопределил кучу других операторов (например, оператор сложения :-op(500,yfx,+).), и они не вызывают у меня проблем. Только 3 перечисленных выше дают мне ошибки.

Может кто-нибудь пролить некоторый свет на это?

Спасибо!


person pauliwago    schedule 18.02.2013    source источник
comment
swi-prolog принимает первые два, выдает ожидаемое Type error: atom, находит 37' на третьем. Я думаю, вам понадобятся одинарные кавычки вокруг оператора по модулю.   -  person CapelliC    schedule 18.02.2013


Ответы (2)


документация по GNU Prolog говорится, что

У атома может быть несколько определений операторов (например, префикс и инфикс, например +), однако у атома не может быть определений как инфиксного, так и постфиксного оператора.

отсюда ошибки в первых двух объявлениях. Затем вы должны изменить спецификатор на fy. Оператору по модулю понадобятся одинарные кавычки.

person CapelliC    schedule 18.02.2013

Вы пытаетесь определить + как постфиксный оператор. Однако + также определяется как инфиксный оператор, и стандарт не позволяет определять оператор как постфиксный, так и инфиксный. Если вы действительно хотите это сделать, вы должны сначала отменить определение инфиксного оператора, используя приоритет 0.

Однако я могу только порекомендовать вам не менять стандартные операторы, такие как + или -. Это похоже на то, как если бы вы изменили приоритет операций в C, C++, C#, Java, Perl, PHP, Javascript и им подобных: это сделало бы вашу жизнь как программиста очень, очень несчастной.

Я не могу рекомендовать использовать % в качестве оператора в Прологе: % начинает комментарий. Если вы хотите использовать его как оператор, вам придется все время писать '%' в кавычках. Пролог уже определил mod и rem как операторы. Разве этого недостаточно?

Вы, вероятно, используете GNU Prolog, который полностью соответствует ISO. Другие прологи позволяют вам одновременно определять инфикс и постфикс. См. #237. Но эти другие Прологи делают многое по-другому.

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


iso-prolog: ISO/IEC 13211-1:1995 6.3.4.3 Операторы, последний абзац:

Не должно быть инфиксного и постфиксного операторов с одним и тем же именем.

person false    schedule 18.02.2013