Вы не можете вызывать предикат Prolog как функцию. Это ничего не возвращает. Когда вы передаете append(A,[H2,H])
для свопинга, он интерпретирует его как данные, а не как код.
Предложение Prolog создает связь между N логическими переменными. Это означает, что в теории нет понятия «вход» и «выход» в предикатах Пролога, вы можете сделать запрос с любой комбинацией экземпляров и неинстанцированных переменных, и язык найдет для вас значимые отношения:
1 ?- append([a],[b,c],[a,b,c]).
true.
2 ?- append([a],[b,c],Z).
Z = [a, b, c].
3 ?- append([a],Y,[a,b,c]).
Y = [b, c].
4 ?- append(X,[b,c],[a,b,c]).
X = [a] ;
false.
5 ?- append([a],Y,Z).
Z = [a|Y].
6 ?- append(X,[b,c],Z).
X = [],
Z = [b, c] ;
X = [_G383],
Z = [_G383, b, c] ;
X = [_G383, _G389],
Z = [_G383, _G389, b, c] . % etc
7 ?- append(X,Y,[a,b,c]).
X = [],
Y = [a, b, c] ;
X = [a],
Y = [b, c] ;
X = [a, b],
Y = [c] ;
X = [a, b, c],
Y = [] ;
false.
8 ?- append(X,Y,Z).
X = [],
Y = Z ;
X = [_G362],
Z = [_G362|Y] ;
X = [_G362, _G368],
Z = [_G362, _G368|Y] . % etc
9 ?-
На практике не каждый предикат может быть вызван с каждой комбинацией из-за ограничений в выражении отношения таким образом, что это не приведет к бесконечному циклу. Другой причиной могут быть дополнительные логические особенности, такие как арифметика. Когда вы видите предикат, задокументированный как:
pred(+Foo, -Bar, ?Baz)
Это означает, что он ожидает создания экземпляра Foo
(то есть объединенного с другим не-var), Bar
- свободной переменной и Baz
может быть любым. Один и тот же предикат может иметь несколько способов его вызова.
Это причина, по которой вы не можете рассматривать отношение Пролог как функцию в целом. Если вы передаете соединение в качестве аргумента, предложения, скорее всего, будут рассматривать его как соединение, если только оно не является специально , предназначенным для обработки его как кода. Одним из примеров является call/1
, который выполняет свой аргумент как код. is
, =:=
, <
и другие арифметические операторы также выполняют некоторую интерпретацию, если вы передаете что-то вроде cos(X)
.