Prolog子列表中所有元素的列表

时间:2012-11-23 21:20:33

标签: list recursion prolog

当且仅当L是包含R中不是列表的所有项的列表时,我才需要编写成功的谓词f(L,R)。 例如:

f(L,[1,2,3,[4,5,6],[[7,8,9]],[]]).

应该给:

L = [1,2,3,4,5,6,7,8,9]

我编写了一个谓词,它给出了以下结果:

L = [1,2,3,4,5,6,7,8,9,[]]

结果中不应出现空列表。我的谓词如下:

f([],[]).
f(V,[H|T]):-  H = [_|_] -> append(L,R,V),
              f(L,H),  f(R,T),!;
              V = [H1|T1], H1=H, f(T1,T).

我有两个疑问。首先,结果中不应出现空列表。此外,我不知道为什么它不起作用,如果我不切割(!)。事实上,如果我不切割它会给我上面的结果,但如果我要求另一个结果它会永远循环。我真的不明白为什么这应该循环。

1 个答案:

答案 0 :(得分:1)

要删除空列表,请处理该情况(丢弃它)。

关于循环:我认为原因可能是你正在调用append(L,R,V)并且没有实例化所有参数:在递归调用之后移动追加。

最后,也许你没有正确使用'if then else'结构:我使用通常的SWI-Prolog源格式缩进,使用缩进突出显示'顺序'调用

f([], []).
f(V, [H|T]) :-
    (   H = []      % if H = []
    ->  f(V, T)     %  then discard
    ;   H = [_|_]   % else if H is list
    ->  f(L,H),     %  flat head
        f(R,T),     %  ...
        append(L,R,V)
    ;   V = [H|T1], % else 
        f(T1,T)     %  ...
    ).