comp中的嵌套列表

时间:2016-03-28 22:02:01

标签: prolog

我试图将我的列表从[a,(asb),(asbsc),a]修改为[[a],[a,b],[a,b,c],[a]]

我试过了那样的话:

:- op(300, xfy, s).

lol([], List).
lol([X|T], List) :-
    X \=(A s B),
    lol(T, [[X]|List]).
lol([X s P|T], List) :-
    lol([P|T], [[X]|List]). 

但是这样做:

lol([], [[a], [b], [c], [d], [e]|_G4165]

1 个答案:

答案 0 :(得分:4)

您的基本情况不正确,因为它使构造列表的尾部保持未绑定状态。它应该是:

lol([], []).

递归案例也可以修改为:

lol([X| Xs], [[X]| Tail]) :-
    X \= s(_, _),
    lol(Xs, Tail).

lol([X s P| Xs], [[X| Ps]| Tail]) :-
    lol([P| Xs], [Ps| Tail]).

通过这些更改我们得到:

?- lol([a, (a s b), ( a s b s c), a], List).
List = [[a], [a, b], [a, b, c], [a]] .

为避免虚假选择点,您可以在第一个递归情况下添加剪切:

lol([X| Xs], [[X]| Tail]) :-
    X \= s(_, _),
    !,
    lol(Xs, Tail).

或者使用 if-then-else 控件构造(左侧作为练习)组合两个递归案例。