我正在尝试:
展平嵌套列表结构。转换列表,可能持有 通过将每个列表替换为“平面”列表,将其列为“平面”列表 元素(递归)。
示例:? - my_flatten([a,[b,[c,d],e]],X)。 X = [a,b,c,d,e] 我的尝试:
unwinder([], APP, APP).
unwinder([E|Es], T, APP) :- is_list(E), unwinder(E, T,APP), unwinder(Es, T,APP).
unwinder([E|Es], T, APP) :- \+ is_list(E), unwinder(Es, K, APP), append( [E], T, APP).
我认为问题是append
,尤其是我仍然存在统一问题:)
请说明统一。
答案 0 :(得分:0)
有一件事,您的参数K
,T
和APP
在您的谓词中有一个混乱。在第二种情况下:
unwinder([E|Es], T, APP) :- \+ is_list(E), unwinder(Es, K, APP), append( [E], T, APP).
你递归地获得K
(我认为),但从不使用它。
我重写(稍微)你的代码:
unwinder([], []).
unwinder([E|ES], APP) :-
is_list(E), !,
unwinder(E, K1),
unwinder(ES, K2),
append(K1, K2, APP).
unwinder([E|ES], [E|K]) :-
unwinder(ES, K).
首先。空案件。
二。如果元素是一个列表,则递归遍历它并递归遍历列表的其余部分(ES
)。然后附加统一列表(K1
& K2
)。
第三。不要检查是列表(您之前是否已执行此操作),cons
(|
)具有统一列表K
的元素(不是列表)。
注意:!
符号不允许在该点之前返回执行(回溯)。因此,如果谓词在第二种情况的某些时候失败,它就不能回去尝试第三种情况。