制作清单Prolog

时间:2016-05-21 19:32:15

标签: prolog

我正在尝试:

  

展平嵌套列表结构。转换列表,可能持有   通过将每个列表替换为“平面”列表,将其列为“平面”列表   元素(递归)。

     

示例:? - 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,尤其是我仍然存在统一问题:)

请说明统一。

1 个答案:

答案 0 :(得分:0)

有一件事,您的参数KTAPP在您的谓词中有一个混乱。在第二种情况下:

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的元素(不是列表)。

注意:!符号不允许在该点之前返回执行(回溯)。因此,如果谓词在第二种情况的某些时候失败,它就不能回去尝试第三种情况。