我在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]
。
答案 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
进行组合。这样,你可以吸收空列表 - 如果它们是一个总和为零,并且不再担心空列表是一个极端情况。