2015-06-16 3 views
3

У меня есть этот список списков:расплющить список списков в Прологе

L = [[[a,b],[d,e]],[[m,f],[p,o]],[[r,l],[v,d]]]. 

Я хочу написать функцию с помощью Пролог что уплощается это таким образом, что она становится так:

L = [[a,b],[c,d],[m,f],[p,o],[r,l],[v,d]]. 

Любые предложения? Спасибо.

+0

Отметьте этот вопрос. http://stackoverflow.com/questions/27263004/flattening-only-one-level-of-a-list-in-prolog – vmg

+2

Вы хотите написать * предикат * (правило Пролога), а не * функцию *. В Prolog нет функций. :) Вопрос также оставляет некоторые вопросы. Например, может ли исходный список иметь более 3 уровней списков? И если да, то какие уровни вы хотите удалить? Что делать, если исходный список имеет только 1 или 2 уровня? Если это не удастся? Или получить исходный список? Или что-то другое? – lurker

+0

контекст в том, что я использую предикат findall, и в результате он дает мне этот список, который я буду использовать в другом предикате, проблема в том, что findall дает мне этот список, который всегда будет 3 уровня. –

ответ

0

Использование predicate append/2:

 
?- L = [[[a,b],[d,e]],[[m,f],[p,o]],[[r,l],[v,d]]], append(L, R). 
L = [[[a, b], [d, e]], [[m, f], [p, o]], [[r, l], [v, d]]], 
R = [[a, b], [d, e], [m, f], [p, o], [r, l], [v, d]]. 

Вы должны смотреть at the implementation by SWI-Prolog и скопировать его, если вам нужно. Оставьте must_be/2, если вы должны сделать это в GNU-Prolog.

Но если вам нужно это из-за findall/3, имейте в виду, что также может быть findall/4 доступны (не для GNU-Пролога, но SWI-Prolog имеет его):

 
$ swipl 
Welcome to SWI-Prolog (Multi-threaded, 64 bits, Version 7.3.2-25-gf8c39d8) 
Copyright (c) 1990-2015 University of Amsterdam, VU Amsterdam 
SWI-Prolog comes with ABSOLUTELY NO WARRANTY. This is free software, 
and you are welcome to redistribute it under certain conditions. 
Please visit http://www.swi-prolog.org for details. 

For help, use ?- help(Topic). or ?- apropos(Word). 

?- findall(X, between(1,3,X), Xs, Rest), findall(Y, between(7,11,Y), Rest). 
Xs = [1, 2, 3, 7, 8, 9, 10, 11], 
Rest = [7, 8, 9, 10, 11]. 

Почти каждая ситуация, когда вам нужно сгладить список, которого можно было бы избежать, используя списки различий.

+0

Я действительно использую пролог GNU, который не делает ничего проще, но я использовал append/3, я написал этот предикат: new_append ([T1, T2, T3], Result): - append (T1, T2, Res) добавление (Res, T3, результат). но это дает мне что-то вроде: [a, b], [c, d], [e, f], [g, h], [i, j], [k, l] ... только элементы, а не список списков (я согласен с тем, что мой предикат довольно субъективен, потому что я использую только 3 списка: s) –

+0

, потому что я использую пролог Gnu, append/2 не работает, он дает мне эту ошибку: uncaught exception: error (существование_error (procedure, append/2), top_level/0) –

+0

это сработало наконец, что я сделал, я использовал append после моего 2 findall каждый раз в моем предикате, вот он, если он может помочь кому-то –

0
possible_moves(Tray,PossibleMoves):- 
    findall([J,1,X,Y],possible_move(Tray,[J,1,X,Y]),T1), 
    findall([J,2,X,Y],possible_move(Tray,[J,2,X,Y]),T2), 
    append(T1,T2,Res), 
    findall([J,3,X,Y],possible_move(Tray,[J,3,X,Y]),T3), 
    append(Res,T3,PossibleMoves). 
Смежные вопросы