Hello有没有办法将Prolog中的列表分成另外两个列表,第一个包含元素前的所有内容,第二个元素后面的所有内容。例如
A=[1,2,3,5,7,9,0] and element=5
两个列表应该是
A1=[1,2,3] and A2=[7,9,0]
我不关心找到下一步该做什么的元素
答案 0 :(得分:2)
这是另一种方法,说明了如何使用列表递归来处理它:
split([E|T], E, [], T).
split([X|T], E, [X|LL], LR) :-
X \== E,
split(T, E, LL, LR).
或者更好,如果您的Prolog支持dif/2
:
split([E|T], E, [], T).
split([X|T], E, [X|LL], LR) :-
dif(X, E),
split(T, E, LL, LR).
示例:
| ?- split([1,2,3,4,5], 3, L, R).
L = [1,2]
R = [4,5] ? ;
no
| ?- split([1,2,3,4,5], 5, L, R).
L = [1,2,3,4]
R = [] ? ;
(1 ms) no
| ?- split([1,2,3,4,5], 1, L, R).
L = []
R = [2,3,4,5] ? ;
no
| ?-
正如CapelliC所示,这是append/3
的一种特殊扭曲。
答案 1 :(得分:1)
很容易
?- Elem = 5, A = [1,2,3,5,7,9,0], append(A1, [Elem|A2], A).
编辑解释一下......
追加/ 3它是3个列表中的关系。
它足以解决正确的列表上的任何连接 - 当没有循环参数时。
比较它是一个简单的统一,发生在第二个论点上。这一定是从Elem开始的列表。 Prolog列表构造函数语法为[Head|Tail]
。为了使统一成功,Elem必须匹配头部。