我想尝试以下方法:
[a,b,(c,d)]
并将其转为
[a,b,c,d]
我从不同的findalls中分别获得[a],[b]和[(c,d)]并将它们一起追加以获得[a,b,(c,d)]列表。
答案 0 :(得分:2)
?- write_canonical([1,2,(3,4)]).
[1,2,','(3,4)]
您可以看到括号(包含逗号)具有特殊属性:它们表现为结构。另一个例子
?- arg(2,(x,y),A).
A = y.
对于你的问题,我会写
?- [user].
|: elem((X,_),X).
|: elem((_,T),X):-elem(T,X).
|: elem(X,X) :- atomic(X).
|: ^D% user://1 compiled 0.02 sec, 3 clauses
true.
现在
?- L=[1,2,(3,4)], findall(Y,(member(X,L),elem(X,Y)),F).
L = [1, 2, (3, 4)],
F = [1, 2, 3, 4].
?- L=[1,2,(3,4),(5),(6,7,8)], findall(Y,(member(X,L),elem(X,Y)),F).
L = [1, 2, (3, 4), 5, (6, 7, 8)],
F = [1, 2, 3, 4, 5, 6, 7, 8].
请注意,这仅适用于深度。要启用任意嵌套,应该足以更改elem / 2的第一个子句:
elem((X,_),Y) :- elem(X,Y).