【发布时间】:2021-06-06 13:09:03
【问题描述】:
我在this answer 中找到了这个 Prolog 代码,它使用差异列表实现了一个队列:
%% empty_queue(-Queue)
% make an empty queue
empty_queue(queue(0, Q, Q)).
%% queue_head(?Queue, ?Head, ?Queue0)
% Queue, with Head removed, is Queue0
queue_head(queue(s(X), [H|Q], Q0), H, queue(X, Q, Q0)).
%% queue_last(+Queue0, +Last, -Queue)
% Queue0, with Last at its back, is Queue
queue_last(queue(X, Q, [L|Q0]), L, queue(s(X), Q, Q0)).
这样做会按预期工作:
..., empty_queue(Q), queue_last(Q, 999, Q_), writeln(Q_), ....
我明白了
queue(s(0),[999|_3076],_3076)
如果我用这个 sn-p 观察 Q 的值,也很有趣:
empty_queue(Q), writeln(Q), queue_last(Q, 999, Q_), writeln(Q)
我明白了:
queue(0,_3750,_3750)
queue(0,[999|_3758],[999|_3758])
我想应该是这样的,因为差异导致空列表,所以它们有点等价。
问题是,在命令之后
queue_last(Q, 999, Q_)
我不能重用Q 来创建Q__,例如:
empty_queue(Q), queue_last(Q, 999, Q_), queue_last(Q, 888, Q__)
因为queue_last(queue(X, Q, [L|Q0]), L, queue(s(X), Q, Q0)).的绑定失败。
L = 888, L = 999 (tries to be both)
我该如何解决这个问题?有一些解决方法吗? (总是使用差异列表)
【问题讨论】:
-
这是怎么回事?
X可以同时使用任何语言的1和2吗?同一个列表可以同时是L=[1,2]和L=[1,999]吗?它可以同时是L=[1,2|T]和L=[1,2,999|T2]。 (然后T甚至可以是T=T2)。 -
链接复制队列示例的答案:stackoverflow.com/a/31925828/14411997
-
您应该仔细阅读该答案。 :) 我相信它已经讨论了其中的一些内容。