2017-01-26 6 views
0

как я могу поместить все пары в один список?список списков-рекурсивные пары пролог

у меня есть -

pair([H|T], [H,E]) :- member(E, T). 
pair([_|T], P) :- pair(T, P). 

, и я хочу, ответ будет список пар.

поэтому я стараюсь -

listPairs([],[Res1]):- 
     Res1=[]. 
listPairs(L,[Res2]):- 
    L=[H|T], 
    append(pair([H|T],[Res2]),listPairs(T,[Res2])). 

, но я что-то упустить из списков .. , так как он не компилируется.

+1

Вы не можете вставлять предикатные вызовы таким образом. 'pair ([H | T], [Res2])' преуспевает или терпит неудачу. Он не возвращает значение, которое вы можете передать в 'append/2'. Аналогично с 'listPairs/2'. – lurker

ответ

3

Я действительно не вижу, что вы намереваетесь сделать с 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 элементов, вы будете генерировать бесконечно, и, таким образом, вы исчерпаете глобальный стек (или память в целом).

+2

SWI-Prolog имеет 'append/2':" append (+ ListOfLists,? List) 'Объединение списка списков. Является ли true, если' ListOfLists' является списком списков , а 'List' является конкатенацией эти списки ». –

+0

А, это объясняет, но все же применяется неправильно. –

Смежные вопросы