Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Prolog-如何将元组分离为预先存在的列表的一部分?_Prolog - Fatal编程技术网

Prolog-如何将元组分离为预先存在的列表的一部分?

Prolog-如何将元组分离为预先存在的列表的一部分?,prolog,Prolog,我试图采取以下措施: [a,b,(c,d)] 把它转到 [a,b,c,d] 我从不同的findall中分别获得[a]、[b]和[(c,d)],并将它们附加在一起以获得[a,b,(c,d)]列表 您可以看到括号(当包含逗号时)有一个特殊的属性:它们的行为就像一个结构。另一个例子 ?- arg(2,(x,y),A). A = y. 对于你的问题,我会写信给你 ?- [user]. |: elem((X,_),X). |: elem((_,T),X):-elem(T,X). |: elem(X,

我试图采取以下措施:

[a,b,(c,d)]
把它转到

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

您可以看到括号(当包含逗号时)有一个特殊的属性:它们的行为就像一个结构。另一个例子

?- 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).

在将它们全部添加到一起之前,请先将它们分开。请快速提醒,n元组的通用解决方案是非终止的来源(例如,带有
L=[a]
的查询),并且仅在任务需要时才应使用。此外,您可以将原子性条件放宽为a
dif(X,(,))
,以包含类似于
[f(a)]
的列表。感谢您的回复,这很有意义!而且还学会了我可以使用findall中的成员,酷!
elem((X,_),Y) :- elem(X,Y).