2015-04-19 2 views
1

Предположим, что у нас есть список, как: [[[[a],b,c],a,b,[a,b]]]рекурсии несколько списков списков

Я хочу рекурсивный список вниз получить [[a],b,c] или [a], например.

Выполнение примерно так: listsplit([H|T], H, T). При возвращении головы я добираюсь до одного уровня списка. Я пробовал рекурсивно делать это, но безрезультатно.

Любая помощь приветствуется.

ответ

0

Вы должны иметь в виду, что [H | T] является просто синтаксическим сахаром: списки - это только двоичные деревья с ветвью головы, всегда являющейся листом. Таким образом, вы можете разобрать его так же, как и любое другое дерево:

| ?- X = [[[[a],b,c],a,b,[a,b]]], X = [[Y|_]|_], X = [[[Z|_]|_]|_]. 

Это приводит к:

X = [[[[a],b,c],a,b,[a,b]]] 
Y = [[a],b,c] 
Z = [a] 

Однако это "пахнет". Что именно вы пытаетесь достичь? Может быть, есть лучшие способы представления деревьев неудобно вложенными списками?

+0

Я нахожусь в середине написания небольшого интерпретатора, где я создаю таблицу символов в прологе. Структура моего ввода - это что-то вроде этого [[function1], [[function2], [[function3]]] 'и я пытаюсь деконструировать его, чтобы сохранить параметры внутри функций (возвращаемое значение, входные параметры , функция корпус и т.п.). Пример функции: '[[int, [add]], [(], [[int, [a]], [[,], [[int, [b]], []]]]], []], [=], [[[a], []], [[+], [[b], []]]]] ' – ari

+0

Эта вещь совсем не похожа на таблицу символов. Символьная таблица по существу похожа на большой хеш, который сопоставляет идентификаторы с соответствующими семантическими конструкциями в текущей области. То, что вы получили здесь, имеет в себе всевозможные лексические барахлы, такие как запятые и круглые скобки. Это не менее двух уровней перед семантическим анализом. Попытка сделать лексинг/синтаксический анализ/семантический анализ сразу с использованием вложенных списков, поскольку единственная структура данных будет не очень забавной. Я предлагаю вам более четко отделить эти шаги и сначала разработать соответствующие структуры данных. –

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