Проблема при попытке определить оператор в Прологе - PullRequest
7 голосов
/ 29 сентября 2010

Я определил файл пролога со следующим кодом:

divisible(X, Y) :-
    X mod Y =:= 0.

divisibleBy(X, Y) :-
    divisible(X, Y).

op(35,xfx,divisibleBy).

Пролог жалуется, что

'$ record_clause' / 2: Нет разрешения на изменение static_procedure `op/ 3 '

Что я делаю не так?Я хочу определить оператор divisibleBy, который позволит мне писать код следующим образом:

4 divisibleBy 2

Спасибо.

Ответы [ 2 ]

14 голосов
/ 29 сентября 2010

Используйте

:- op(35,xfx,divisibleBy).

:- говорит интерпретатору Пролога оценивать следующий термин при загрузке файла, т.е. делать вызов предиката, вместо того, чтобы рассматривать его как определение (в этом случае переопределение op/3) .

2 голосов
/ 26 июня 2015

Ответ , данный @ larsmans , является точным в отношении вашей исходной проблемы.

Однако вам следует пересмотреть , если , вы должны определить новый оператор.

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

  • Увеличение читабельности часто переоценивают.
  • Это может легко ввести новыепроблемы в местах, которые вы обычно не ожидали бы глючить.
  • Это не "хорошо масштабируется": небольшое количество операторов может сделать код на слайдах презентации сверхжатким, но что, если вы добавите более различающие случаи объединениячерез некоторое время?Больше операторов?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...