2014-02-19 85 views
2

你好,有什么办法可以将Prolog中的列表分成两个其他列表,第一个包括元素前的所有内容和元素后的第二个元素。例如Prolog分隔列表

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

两个列表应

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

我不关心寻找元素只是下一步该做什么

回答

1

很容易,因为

?- Elem = 5, A = [1,2,3,5,7,9,0], append(A1, [Elem|A2], A). 

编辑来解释一下...

附加/ 3这是一个关系 3个列表中。

这是一般不足以解决对适当列出任何拼接 - 当不存在圆形参数。

比较这是一个简单的统一,发生在第二个参数。那必须是以Elem开头的名单。 Prolog列表构造函数的语法是[Head|Tail]。为了统一成功,Elem必须匹配的负责人。

+0

它的工作原理,但你可以给我一个简单的解释如何追加工程?我知道给一个list1和一个list2它将它们连接成一个列表。还有比较如何发生? – JmRag

+0

Thx很多你的时间! – JmRag

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所表明的那样,这是一种特殊的扭曲。

+0

@repeat谢谢,是的,我同意。我并不总是使用'​​dif/2'的原因是因为通常对我的gprolog安装没有'dif/2'。我尝试过一些'dif/2'的实现,它似乎没有做同样的事情。 – lurker