我需要一种在Prolog中执行以下操作的方法。在Prolog中实现堆栈
我想有一个定义的变量列表。例如[x,z,k,s,r,v,w]
然后我希望我的一个函数能够从列表中弹出第一个元素,以某种方式使用它,然后当它需要另一个元素,我希望它弹出列表中的下一个元素。也许当功能完成后,我希望它将列表重置为原始状态。
我不能想到通过简单地将列表作为参数传递的方法。这对于OO编程来说非常简单。因为我可能只有一个全局变量。
我需要一种在Prolog中执行以下操作的方法。在Prolog中实现堆栈
我想有一个定义的变量列表。例如[x,z,k,s,r,v,w]
然后我希望我的一个函数能够从列表中弹出第一个元素,以某种方式使用它,然后当它需要另一个元素,我希望它弹出列表中的下一个元素。也许当功能完成后,我希望它将列表重置为原始状态。
我不能想到通过简单地将列表作为参数传递的方法。这对于OO编程来说非常简单。因为我可能只有一个全局变量。
请注意,堆在一个纯粹的无副作用的方式来实现。由于不使用隐式状态,因此所有内容都必须明确。通常,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]
你到底想干什么,为什么仅仅让列表的头什么(L = [H | T])不会工作?听起来你的想法太过于必要 –
你可以使用_global variables_(在SWI-Prolog,nb_setval/2,nb_getval/2中),并使用_list accessor_模式来模拟'传统'堆栈,但是这种方法通常很难理解(和维护)代码,因为违反了Prolog编程的本质,我们没有_functions_,而_procedures_的参数中有_relations_。然后应该指定更好的要求。 – CapelliC