list - 如何阻止空列表附加到 Prolog 中的完整列表?

标签 list prolog

我在创建列表的 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/

相关文章:

list - TCL中这两种声明列表的方式有什么区别?

list - 在不使用列表的情况下确定(在 Haskell 中)一个数字是否是回文

file - Prolog I/O 读取文件并提取信息以供使用

debugging - 测试一个过于笼统的程序

C# 给定所需的顺序需要一个节省空间的列表重新排序或排序

python - 类型错误:int 不可调用

python - 将列表粘贴到 Excel 文件

尝试 3000 多次后 mysql 连接失败

types - Prolog中有哪些数据类型?

prolog - 如何从问题中打印变量值?