Реализация стека в Прологе - PullRequest
2 голосов
/ 28 ноября 2011

Мне нужен способ сделать следующее в Прологе.

Я хочу определить список переменных. Например [x, z, k, s, r, v, w]

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

Я не могу придумать способ сделать это, просто передав список в качестве аргумента. Это было бы действительно просто с программированием ОО. Как я мог просто иметь глобальную переменную.

Ответы [ 2 ]

6 голосов
/ 28 ноября 2011

Я не уверен, что полностью понимаю ваш вопрос, но я думаю, что стек довольно прост для реализации.

pop([X|List],X,List). объединит заголовок списка с X, так что вы можете использоватьэто как хочешь.И push(X,List,[X|List]) объединит третий аргумент, новый список с X, помещенным в его голову.

Или, может быть, я совсем не получил вопрос ...

3 голосов
/ 28 ноября 2011

Обратите внимание, что стек реализован без побочных эффектов.Поскольку неявное состояние не используется, все должно быть явным.Обычно программисты Prolog используют списки напрямую или для этой цели используют грамматики (DCG).

empty([]).

pop(E, [E|Es],Es).

push(E, Es, [E|Es]).


| ?- empty(S0), push(1,S0,S1),push(2,S1,S2),pop(T,S2,S3).
S0 = []
S1 = [1]
S2 = [2,1]
T = 2
S3 = [1]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...