Пролог унифицирует списки внутри списка - PullRequest
0 голосов
/ 23 ноября 2010

Я пытаюсь определить отношение по спискам ...

?- 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).

Надеюсь услышать от вас скоро.

Ответы [ 3 ]

2 голосов
/ 23 ноября 2010

Попробуйте что-нибудь подобное. Я изменил имя предиката на 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]).

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

1 голос
/ 23 ноября 2010

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

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

unify([], []).
unify([X|Xs], Ret) :- unify(Xs, Rs), append(X, Rs, Ret).
0 голосов
/ 09 декабря 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...