2011-11-28 139 views
2

我需要一种在Prolog中执行以下操作的方法。在Prolog中实现堆栈

我想有一个定义的变量列表。例如[x,z,k,s,r,v,w]

然后我希望我的一个函数能够从列表中弹出第一个元素,以某种方式使用它,然后当它需要另一个元素,我希望它弹出列表中的下一个元素。也许当功能完成后,我希望它将列表重置为原始状态。

我不能想到通过简单地将列表作为参数传递的方法。这对于OO编程来说非常简单。因为我可能只有一个全局变量。

+0

你到底想干什么,为什么仅仅让列表的头什么(L = [H | T])不会工作?听起来你的想法太过于必要 –

+0

你可以使用_global variables_(在SWI-Prolog,nb_setval/2,nb_getval/2中),并使用_list accessor_模式来模拟'传统'堆栈,但是这种方法通常很难理解(和维护)代码,因为违反了Prolog编程的本质,我们没有_functions_,而_procedures_的参数中有_relations_。然后应该指定更好的要求。 – CapelliC

回答

6

我不确定我完全理解你的问题,但我认为一个堆栈很容易实现。

pop([X|List],X,List).会将列表头与X统一起来,所以您可以随意使用它。并且push(X,List,[X|List])将统一第三个参数一个新的列表,并将X推到它的头部。

或者,也许我完全我以前不得到您的问题...

+1

'pop'需要新的弹出堆栈的更多参数。 – false

+0

你的权利当然。我将编辑。所以现在唯一不同的是参数的概念顺序。 –

+0

状态参数 - 这里是列表 - 通常以旧,新顺序连续编写。 – false

3

请注意,堆在一个纯粹的无副作用的方式来实现。由于不使用隐式状态,因此所有内容都必须明确。通常,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]