list - 如何在 Prolog 中执行列表的长串联?

标签 list prolog concatenation

我有兴趣使用 Prolog 语言执行长列表串联。 目标是定义一个谓词,该谓词获取未知数量的列表,并将它们全部连接到一个列表中(作为谓词的第二个参数给出)。

我知道我应该首先了解 Prolog 如何支持无限大小的参数,但我认为答案是使用列表,例如: [一| [[b、c、d] | [[e、f、g] | [h,i,j,k]]]]。

如果是这样,我考虑将谓词写成这样:

l_conc([ ],[ ]).
l_conc([[ ]|Tail],L):-
      l_conc(Tail,L).
l_conc([[Head|L1]|Tail],[Head|L2]):-
      l_conc([L1|Tail],L2).

但是,它仅将空列表相互连接。 请在这里帮助我(关于参数表示和谓词本身):-) 谢谢!

最佳答案

在回答实际问题之前,我有几点评论。

首先,您给出的术语作为示例[a | [[b、c、d] | [[e、f、g] | [h,i,j,k]]]] 在 Prolog 中可以写得更紧凑。您可以使用 Prolog toplevel 本身来查看该术语实际上是什么:

?- Ls = [a | [[b,c,d] | [[e,f,g] | [h,i,j,k]]]].
Ls = [a, [b, c, d], [e, f, g], h, i, j, k].

由此可见,这只是一个列表。然而,它不是一个列表列表,因为原子ahi不是列表

因此,您的示例与您的问题不符。有很多方法可以“展平”列表,但我只能建议不要展平,因为它不是纯粹的关系。原因是 [X] 被视为“平面”列表,但 X = [a,b,c] 使 [[a,b,c ]] 不平坦,因此如果您使用 flatten/2,将会遇到逻辑不一致的情况。

我推荐的是append/2。最简单的实现方法是使用 DCG ( )。例如考虑:

together([]) --> [].
together([Ls|Lss]) -->
        list(Ls),
        together(Lss).

list([])     --> [].
list([L|Ls]) --> [L], list(Ls).

示例查询:

?- phrase(together([[a],[b,c],[d]]), Ls).
Ls = [a, b, c, d].

在此示例中,恰好一层嵌套已被删除。

关于list - 如何在 Prolog 中执行列表的长串联?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38284686/

相关文章:

Python 将元组值从 unicode 转换为 str

python - 从带有子列表的列表中创建值字典

list - Prolog 列表合并问题?

Mysql - 连接多个 ID 并连接连接列?

MySQL:行串联

python - 从 3 个列表的 zip 中创建字典

python - 遍历 Python 中的整数列表和列表

jquery - Prolog 中的 CORS 不起作用

prolog - 检查对角线是否具有相同的值

python - 从数据框的开头向 Pandas 数据框的结尾添加值