Prolog分隔列表

时间:2014-02-19 09:26:29

标签: prolog

Hello有没有办法将Prolog中的列表分成另外两个列表,第一个包含元素前的所有内容,第二个元素后面的所有内容。例如

A=[1,2,3,5,7,9,0] and element=5 

两个列表应该是

A1=[1,2,3] and A2=[7,9,0]

我不关心找到下一步该做什么的元素

2 个答案:

答案 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必须匹配头部。