": =" и "=>" в Меркурии - PullRequest
       78

": =" и "=>" в Меркурии

1 голос
/ 03 августа 2011

Я недавно сталкивался с этим примером кода на Меркурии:

append(X,Y,Z) :-
  X == [],
  Z := Y.
append(X,Y,Z) :-
  X => [H | T],
  append(T,Y,NT),
  Z <= [H | NT].

Будучи программистом на Прологе, я удивляюсь: в чем разница между обычным объединением = и := или =>, котороеиспользуются здесь?

В справочнике Mercury эти операторы получают разные приоритеты, но они не объясняют разницу.

Ответы [ 3 ]

4 голосов
/ 04 августа 2011

Для начала давайте перепишем код с использованием отступа:

append(X, Y, Z) :-
    X == [],
    Z := Y.
append(X, Y, Z) :-
    X => [H | T],
    append(T, Y, NT),
    Z <= [H | NT].

Похоже, вам приходится делать отступы всего кода в четыре пробела, что, похоже, не работает в комментариях, мои комментарии выше следует игнорировать(Я не могу их удалить).

Приведенный выше код не является реальным кодом Меркурия, это псевдокод.Это не имеет смысла как реальный код Меркурия, потому что операторы <= и => используются для классов типов (IIRC), а не для унификации.Кроме того, я раньше не видел оператора :=, я не уверен, что он делает.

В этом стиле псевдокода (я считаю), что автор пытается показать, что :=является типом присвоения унификации , где X присваивается значение Y.Точно так же => показывает деконструкцию из X, а <= показывает конструкцию из Z.Также == показывает тест на равенство между X и пустым списком.Все эти операции являются типами объединения.Компилятор знает, какой тип унификации следует использовать для каждого режима предиката.Для этого кода режим, который имеет смысл: append(in, in, out)

Меркурий отличается от Пролога в этом отношении, он знает, какой тип объединения использовать, и, следовательно, может генерировать более эффективный код и гарантировать, что программа mode-correct .

Еще одна вещь, код real Mercury для этого псевдокода:

:- pred append(list(T)::in, list(T)::in, list(T)::out) is det.

append(X, Y, Z) :-
    X = [],
    Z = Y.
append(X, Y, Z) :-
    X = [H | T],
    append(T, Y, NT),
    Z = [H | NT].

Обратите внимание, что каждое объединение является= и добавлено объявление предиката и режима.

3 голосов
/ 13 августа 2011

В конкретном синтаксисе Меркурия оператор := используется для обновления поля.

1 голос
/ 19 мая 2018

Возможно, мы не можем использовать такие операторы, как ': =' '<=' '=>' '==' в недавнем выпуске Mercury, но на самом деле эти операторы являются специализированным объединением, согласно описанию в тезисе Нэнси Мазур. , '=>' означает деконструкцию, например X => f (Y1, Y2, ..., Yn), где X - вход, а весь Yn - выход. Это полудет. «<=», наоборот, и является дет. '==' используется в ситуации, когда обе стороны заземлены, и это полуотдел. ': =' как обычный оператор присваивания на любом другом языке, и это det. В старых работах я даже вижу, что они используют «==» вместо «=>» для выполнения деконструкции. (Я думаю, что мой английский ужасен = x =)

...