仅在序言中平整列表的一个级别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了仅在序言中平整列表的一个级别相关的知识,希望对你有一定的参考价值。

我正在研究一个问题,以便在Prolog中仅将列表的一个层次展平。例如,[[1],[2,3]]将变为[1,2,3],但是[[1,[2]],3]仅会变平为[1,[2],3]。我在网站上遇到了其他一些问题,但是没有一个人彻底回答这个问题,而且我无法让我的代码在我的所有测试用例上都能正常工作。


更新:代码有效!这是我最终来到的answer

my_flatten([], []).
my_flatten([A|B],L) :- is_list(A), my_flatten(B,B1), !, append(A,B1,L).
my_flatten([A|B],[A|B1]) :- my_flatten(B,B1).
答案

您需要3个简单子句,我将仅显示最复杂的子句

flat([H|T],R) :- is_list(H), flat(T,T1), append(H,T1,R).

另外两个子句是基本递归的情况,以及要生成的head的copy as is

您还应该在我显示的子句中插入一个剪切,否则在回溯时,您会得到错误的结果(由于触发了子句copy as is

以上是关于仅在序言中平整列表的一个级别的主要内容,如果未能解决你的问题,请参考以下文章

序言中列表列表中的最小值

通过给出可能的移动,在列表中移动。序言

将序言中的列表拆分为原子和整数

setof创建了许多列表而不是一个列表序言

common_suffix/4 序言

Spring Cloud(Alibaba版)序言