2014-12-03 3 views
2

Я работаю над проблемой сглаживания только одного уровня списка в Prolog. Например, [[1],[2,3]] станет [1,2,3], но [[1,[2]],3] будет только сглаживать до [1,[2],3]. Я просмотрел некоторые другие вопросы на сайте, но никто не ответил на этот вопрос, и я просто не могу заставить свой код работать во всех моих тестовых случаях.Сглаживание только одного уровня списка в Prolog

Обновление: код работает! Вот окончательный ответ, который я пришел:

my_flatten([], []). 
my_flatten([A|B],L) :- is_list(A), my_flatten(B,B1), !, append(A,B1,L). 
my_flatten([A|B],[A|B1]) :- my_flatten(B,B1). 
+1

возможного дубликата [Получить элементы из списка списков] (http://stackoverflow.com/questions/9777077/get-elements-from-list-of-lists) – false

+1

Лучше всего [использовать DCG] (http://stackoverflow.com/a/9787502/772868). – false

+1

Что значит «работает только около половины времени?» – false

ответ

1

Вам нужно 3 простых положений, я покажу только самый сложный один

flat([H|T],R) :- is_list(H), flat(T,T1), append(H,T1,R). 

другие два пункта дела база рекурсии и copy as is головы к результату.

Вы также должны поместить разрез в статье я показал, в противном случае на возвраты вы получите неправильные результаты (из-за стрельбы из пункта copy as is)

+0

Итак, 'flat ([A, B], [1,2])' не удается? – false

+1

@false: SWI дает A = 1, B = 2, без приглашения 'redo' ... – CapelliC

+0

, что так же плохо. И A, и B должны быть списками. – false

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