Для начала давайте перепишем код с использованием отступа:
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].
Обратите внимание, что каждое объединение является=
и добавлено объявление предиката и режима.