我试图将我的列表从[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]
答案 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 控件构造(左侧作为练习)组合两个递归案例。