【发布时间】:2020-02-29 18:42:23
【问题描述】:
我正在学习 Prolog,但在学习面向对象背景的语言时遇到了困难。
我正在尝试完成以下说明:
实施分阶段队列。这是一个由两个列表组成的结构: 前端和后端,表示为
queue(Front, Back)。这 队列是空的iff 两个列表都是空的。如果元素被添加到 队列它们被添加到后端;如果他们被删除,他们是 从前端移除;如果前端变空(并且 后端不为空)然后后端成为带有[]的新前端 作为新的后端。例如,我们可以从一个队列开始queue([2,5,7], []),加8给我们queue([2,5,7], [8]),去掉2 元素给出queue([7], [8]),添加9 给出queue([7], [9,8]),并且 删除一个元素会得到queue([9,8], [])
我不明白我是如何在.pl 文件中创建并引用队列结构,以使其他谓词可以随后操作和转换
我已经粗略地勾勒出我认为我应该做的事情,既定义了队列结构,也只是一个列表列表。
add_to_q(X, [[H|T]|[H2|T2]], [[H|T]|[X|[H2|T2]]).
queue(X, Y)
add_to_q(A, queue(X,Y), queue(X, [A|Y]). % gives Syntax error: Operator expected
------------------
remove_from_q( [[H | [T|T3]] | [H2|T2]], [[T|T3]] | [H2|T2]]).
queue(X, Y)
remove_from_q( queue(X,[H|T]), queue(H,T).
如何在 Prolog 中定义和使用结构,如何添加 OO 语言中的内容方法,例如 getHead 或 getTail,我已经看到了如何您只使用列表来执行此操作,但我不使用列表列表,而是使用两个单独列表的“队列”?
感觉失落!
【问题讨论】:
-
[9,8]从后到前 没有被反转 的例子似乎并没有使这成为一个队列。 -
@Enigmativity 这就是为什么我称它为
funny queue。 -
从
queue([7], [9,8])中删除一个元素应该给queue([8,9], []),以保留FIFO 属性。他们忘了扭转它。
标签: data-structures prolog queue structure custom-data-type