Я действительно не вижу, что вы намереваетесь сделать с append/2
. Вы можете определенно не ставить цели, которые должны быть вызваны в append/3
, потому что в этом случае они будут рассматриваться как функторы.
Однако вы можете легко использовать findall/3
предикат, который реализуется практически во всех системах Прологе (ну по крайней мере, все, что я видел, что активно используется):
listPairs(L,Pairs) :-
findall(Pair,pair(L,Pair),Pairs).
findall/3
работает следующим образом:
findall(Format,Goal,List).
Здесь вы указываете Goal
(здесь pair(L,Pair)
), и Пролог позвонит Goal
. Каждый раз, когда Goal
преуспеть, Prolog приостанавливает интерпретатор и добавляет элемент, отформатированный как Format
, к List
. Когда Goal
терпит неудачу, возвращается список всех Format
s.
Если я выполнить запрос, я получаю:
?- listPairs([1,a,2,'5'],Pairs).
Pairs = [[1, a], [1, 2], [1, '5'], [a, 2], [a, '5'], [2, '5']].
Обратите внимание, что L
должен быть заземлен (в виде списка, то есть без uninstantiated хвоста, uninstantiated элемент отлично), так как в противном случае число pair/2
элементов, вы будете генерировать бесконечно, и, таким образом, вы исчерпаете глобальный стек (или память в целом).
Вы не можете вставлять предикатные вызовы таким образом. 'pair ([H | T], [Res2])' преуспевает или терпит неудачу. Он не возвращает значение, которое вы можете передать в 'append/2'. Аналогично с 'listPairs/2'. – lurker