我在创建列表的 Prolog 中遇到了这个问题,有时有助于此列表创建的谓词返回一个空列表,[]
。最后我得到一个看起来像 [[1, 2, 3], []]
的列表,例如,当我希望它是 [[1, 2, 3]]
.
当我将空列表与列表的其余部分放在一起时,如何停止该空列表?我的逻辑编程不是很强大,但在其他语言中我会简单地说,如果不为空:追加,否则什么都不做。
这在 Prolog 中可能吗?
编辑:举个例子,假设我有以下谓词:
put_together(Value1, Value2, Result) :-
Result = [Value1, Value2].
我调用 put_together(1, 2, Result).
并按预期获得 Result = [1, 2]
。但是如果我调用 put_together(1, [], Result).
我会得到 Result = [1, []]
我不想要,我宁愿最后的空列表消失了,它只是[1]
。
最佳答案
DCG 通常是描述 Prolog 中列表的好方法。这使得关于列表的推理变得容易得多。您应该在您的用例中尝试一下。
例如,如您所说,要“放在一起”(请参阅下文了解为什么这不是一个好的观点)两个列表,您可以使用:
lists_together(Ls1, Ls2) -->
list(Ls1),
list(Ls2).
list([]) --> [].
list([L|Ls]) --> [L], list(Ls).
示例案例:
?- phrase(lists_together([a,b,c], [d,e]), Ts).
Ts = [a, b, c, d, e].
?- phrase(lists_together([a,b,c], []), Ts).
Ts = [a, b, c].
这是完全通用的,适用于所有方向。例如,尝试最通用的查询或迭代深化等。因此,我避免使用命令式名称,如 put_...
,这表明它仅在一个方向上起作用。相反,我使用了一个更具说明性的名称,该名称公平地说明了这种关系存在的多个方向。
但是,在您的情况下,您似乎不知何故且不由自主地混合了不同种类的术语。要表示对,请不要使用 [A,B]
(即 .(A, .(B, []))
),而是使用像 这样的术语>A-B
.
因此,要将此类对与其组件相关联,请使用例如:
key_value_pair(键,值,键值)。
关于list - 如何阻止空列表附加到 Prolog 中的完整列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32831392/