приоритет отрицания в прологе SWI

Вот цитата из книги Блэкберна и Боса «Представление и вывод для естественного языка».

:- op(900,yfx,>). % implication
:- op(850,yfx,v). % disjunction
:- op(800,yfx,&). % conjunction
:- op(750, fy,-). % negation 

Как и ожидалось, отрицание имеет более высокий приоритет, чем союз.

Теперь просматриваем документы SWI Prolog.

\+ - отрицание как отказ имеет более низкий приоритет (900), чем /\ соединение (500).

Я правильно читаю?

Есть ли другой символ для отрицания в SWI Prolog? Я знаю, что есть not, но он сохранен только для обратной совместимости.

Дополнение Имеет ли значение ~ в SWI Prolog?


person user1700890    schedule 19.12.2018    source источник
comment
Тот факт, что числа не в том порядке, в котором вы ожидаете, не означает, что он работает неправильно. Создали ли вы тестовые примеры для проверки ваших предположений?   -  person Guy Coder    schedule 19.12.2018
comment
@GuyCoder, меня не волнует абсолютное значение используемых чисел. Я ожидаю, что отрицание будет иметь более низкий приоритет, чем соединение, например. старшинство 3, соединение 5 или подобное. Я ожидаю только порядка, а не абсолютных значений.   -  person user1700890    schedule 19.12.2018
comment
Вы можете перечислить с возвратом все операторы, определенные в системе Пролога, вызвав стандартный предикат current_op/3.   -  person Paulo Moura    schedule 19.12.2018
comment
См. также пример logic Logtalk на странице github.com/LogtalkDotOrg/logtalk3/tree/. мастер/примеры/логика   -  person Paulo Moura    schedule 19.12.2018
comment
Отрицание - — это числовое отрицание, используемое в арифметических выражениях. Это не связано с логическим отрицанием как оператором отказа, \+, который применяется к запросам. И ~ не является оператором Пролога. Оператор `/` является побитовым И, а также числовым.   -  person lurker    schedule 19.12.2018
comment
Стандартный Пролог не определяет операторов & и v. Оператор /\, который вы видите, предназначен (я полагаю) для арифметических выражений; обычные операторы логической конъюнкции и дизъюнкции — , и ; соответственно, что должно совпадать с отрицанием Пролога \+. Для арифметики в \ есть отрицание с дополнением до единицы, но, что удивительно, нет логического/логического отрицания.   -  person Daniel Lyons    schedule 19.12.2018
comment
@DanielLyons, в случае , и ; все в порядке, они имеют более низкий приоритет по сравнению с \+. 1000 и 1100 соответственно.   -  person user1700890    schedule 20.12.2018
comment
Мне кажется, вы хотите создать мини-язык с мета-интерпретатором для своих собственных логических запросов. Все стандартные операторы частично кратны десяти, так что вы можете втиснуть между ними свои собственные операторы, как вам нравится. Но это помогает только в том случае, если стандартные находятся в правильном порядке для вашего приложения. Если это не так, вы всегда можете определить свой собственный набор операторов.   -  person Daniel Lyons    schedule 20.12.2018
comment
Не переопределяйте уже существующие операторы, такие как > и -. Это приведет к хаосу. Скорее делайте своих операторов. например .> вместо > и т. д.   -  person false    schedule 20.12.2018
comment
@false, я согласен, но я думаю, что для одного упражнения это нормально.   -  person user1700890    schedule 20.12.2018
comment
@DanielLyons, спасибо, эта свобода определения немного сводит меня с ума. Похоже, для целей этого упражнения (простая проверка модели из главы 1 Блэкберна и Боса) мне нужно переопределить > и v.   -  person user1700890    schedule 20.12.2018
comment
Это приведет к хаосу даже в одном упражнении.   -  person false    schedule 20.12.2018


Ответы (1)


Будьте осторожны, (\+)/1 — это логический предикат (основной стандарт ISO 7.8 Конструкции управления, 8.15 Логика и управление), но (/\)/2 — побитовая операция (основной стандарт ISO 8.6 Арифметическая оценка, 9.4 Побитовые функторы), которая используется внутри (is)/2. Список будет таким:

 Logical Predicate       Bitwise Operation    Name
 (,)/2                   (/\)/2               Conjunction
 (;)/2                   (\/)/2               Disjunction
 (\+)/2                  (\)/1                Negation
 Etc..                   Etc..                Etc..

Примеры:

?- X is \ 1. /* Bitwise Negation */
X = -2.

?- 1 < 2, 1 > 0.  /* Logical Conjunction */
true.

Но поскольку (\+)/1 имеет несколько иную семантику, чем классическое отрицание, мы обычно называем его отрицанием как отказ. (~)/1 используется CLP(B).

person Mostowski Collapse    schedule 29.12.2018