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

时间:2015-09-28 20:37:57

标签: 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]

2 个答案:

答案 0 :(得分:3)

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).

答案 1 :(得分:0)

如果可能,我建议您更改谓词,以便始终返回列表列表,并始终使用append/3进行组合。这样,你可以吸收空列表 - 如果它们是一个总和为零,并且不再担心空列表是一个极端情况。

正如mat's answer中提到的那样,DCG可以持续使用列表。