Prolog - 如何将元组分开作为我原先列表的一部分?

时间:2017-12-04 02:37:04

标签: prolog

我想尝试以下方法:

[a,b,(c,d)]

并将其转为

[a,b,c,d]

我从不同的findalls中分别获得[a],[b]和[(c,d)]并将它们一起追加以获得[a,b,(c,d)]列表。

1 个答案:

答案 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).