【问题标题】:How do I stop an empty list from appending to a complete list in Prolog?如何阻止空列表附加到 Prolog 中的完整列表?
【发布时间】:2015-09-29 05:19:37
【问题描述】:

我在 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]

【问题讨论】:

    标签: list prolog


    【解决方案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(Key, Value, Key-Value).

    【讨论】:

      【解决方案2】:

      如果可能,我建议您更改谓词,以便您始终返回列表列表,并始终使用append/3 组合它们。这样一来,您就可以将空列表当作总和中的零来吸收,而不必担心空列表是极端情况。

      mat's answer 中所述,DCG 是一致使用列表的一种可能方式。

      【讨论】:

        猜你喜欢
        • 2018-04-25
        • 1970-01-01
        • 2012-07-17
        • 2015-02-05
        • 2015-04-23
        • 1970-01-01
        • 2013-02-08
        • 2023-01-25
        • 1970-01-01
        相关资源
        最近更新 更多