поместить список в стек как один элемент без скобок - PullRequest
0 голосов
/ 30 октября 2009

У меня есть список элементов в списке, например [1,2,+], и я хочу поместить их как один элемент в стек. Я могу сделать это, поместив их в квадратные скобки, но это приведет к появлению скобок в выводе. Например, я хочу поместить элементы списка [1,2, +] в стек:

stack([1,2,+],S,Y).

Где stack:

stack(T,S,[T|S]).

Проблема в том, что если я добавлю больше выражений в стек, у них будут вложенные скобки. Например, я бы получил [[+,1,2],[*,3,4]], но я хочу [+,1,2,*,3,4]. Как мне это сделать?

Ответы [ 3 ]

2 голосов
/ 30 октября 2009

Я не совсем понимаю ваш вопрос и какова общая цель, но, может быть, вы хотите что-то вроде этого.

stack(el(X, Y, Z), StackTail, [X, Y, Z | StackTail]).

Если все элементы вашего стека являются тройками, не представляйте их как списки из трех элементов. Это не экономно. Скорее представляйте их как термины el/3.

Кроме того, я понимаю, что вы не хотите, чтобы ваш стек представлял собой список сложных терминов, но список атомарных терминов. Вышеупомянутое определение stack/3 распутает el/3 термин при нажатии и будет строить его при нажатии.

2 голосов
/ 30 октября 2009

Вы можете «сгладить» список:

| ?- List = [[+,1,2],[*,3,4]], flatten(List, FlatList).

List = [[+,1,2],[*,3,4]]
FlatList = [+,1,2,*,3,4]

Интерпретаторы Пролога часто включают библиотеку списков, которая будет иметь предикат сглаживания, но вот одна реализация (из библиотеки списков SWI-Prolog):

flatten(List, FlatList) :-
flatten(List, [], FlatList0), !,
FlatList = FlatList0.

flatten(Var, Tl, [Var|Tl]) :-
  var(Var), !.
flatten([], Tl, Tl) :- !.
flatten([Hd|Tl], Tail, List) :- !,
  flatten(Hd, FlatHeadTail, List), 
  flatten(Tl, Tail, FlatHeadTail).
flatten(NonList, Tl, [NonList|Tl]).
1 голос
/ 30 октября 2009

Добавление еще двух правил в стек должно помочь.

Поскольку это очень похоже на домашнюю работу, я не буду давать листинг, но вам понадобится новое правило, в котором первый аргумент является явно списком, элементы которого рекурсивно добавляются в существующий стек.

Если вы написали member/2 и append/2, у вас не должно возникнуть проблем с этим.

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