2010-11-23 4 views
0

Я пытаюсь определить соотношение по спискам ...Пролог объединить списки внутри списка

?- matrix_items([[a,b],[c,d],[e,f]],Rs). 
Rs = [a,b,c,d,e,f].      % expected result 

До сих пор я был в состоянии сделать что-то подобное; к сожалению, он не складывает все элементы:

sift([],_).            
sift([H|T],[H|Result]) :- 
    create(H,Result), 
    sift(H,Result). 

create([],_). 
create([H|T],[H|R]) :- 
    create(T,R). 

Надежда скоро услышит от вас.

+0

Что такое `sift`? – Cameron 2010-11-23 16:42:54

+0

У встроенного устройства «flatten/2» может возникнуть такое поведение, которое вам кажется нужным - оно может быть реализовано уже в интерпретаторе PROLOG, который вы используете. – sharky 2010-11-23 20:45:18

ответ

2

Попробуйте что-нибудь подобное. Я изменил имя предиката к flatten_l, как унифицировать имеет другие коннотации в Прологе:

flatten_l([H|T], FL):- 
    flatten_l([H|T], [], FL). 

flatten_l([], FL, FL):- !. 
flatten_l([H|T], ML, FL):- 
    flatten_l(T, ML, NL), 
    !, 
    flatten_l(H, NL, FL). 
flatten_l(X, FL, [X|FL]). 

Отметим также, что этот предикат даст вам ошибку переполнения стека, если первый аргумент uninstantiated ...

1

Если вы хотите свернуть все списки (даже суб-списки), вы можете использовать flatten/2.

Если вы хотите, чтобы свернуть один уровень, то следующий должен работать:

unify([], []). 
unify([X|Xs], Ret) :- unify(Xs, Rs), append(X, Rs, Ret). 
0

Если вы используете SWI-пл, вы можете вызвать flatten/2 выравниваться все уровни вложенности или append/2 выравниваться только один уровень.

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