PROLOG展开列表 [英] Prolog flatten list
本文介绍了PROLOG展开列表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
flatten([A|B],R):- (islist(A)->(flatten(A,R1),R=R1);(write(A),append([A],R1,R))), flatten(B,R1).
flatten(X,X).
islist([_|_]).
这是我写的代码,但我有奇怪的问题..
我得到
257 ?- flatten([1,[],2,[3],[3,[3,5]]],R).
1[]23335335
R = [1, [], 2, [3], [3, [3, 5]]] .
虽然WRITE中的数字不是列表,但它们被附加为列表:s...
推荐答案
您对Flatten/2的定义中有一些错误:
您的第一个子句将失败,因为如果A是一个列表,它将首先使用R实例化R1,然后尝试再次使用Flatten(B,R1)将其统一。
展平(X,X)。->此子句按原样保留列表,不进行任何展平。检查此其他实现:
flatten(List, Flattened):-
flatten(List, [], Flattened).
flatten([], Flattened, Flattened).
flatten([Item|Tail], L, Flattened):-
flatten(Item, L1, Flattened),
flatten(Tail, L, L1).
flatten(Item, Flattened, [Item|Flattened]):-
+ is_list(Item).
这里我们使用两个谓词:Flat ten/2和Flat ten/3。‘work’将在Flat ten/3中完成,其中第二个参数将保存中间的展平列表。
第一个子句是基本情况:当我们到达空列表时,我们就完成了,所以我们用中间的展平列表实例化第三个参数。
第二个子句处理递归。它将拼合列表中的第一项(无论它是项还是子列表),并继续输入列表的其余部分。
最后一个子句是非列表项的基本情况。它将该项置于中间展平列表的开头,但它只对不是列表的项执行此操作,因为第二个子句中已注意到这种情况。
这篇关于PROLOG展开列表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文