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

问题描述 投票:2回答:1

我正在研究一个问题,以便在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).
list prolog flatten
1个回答
1
投票

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.