你好,有什么办法可以将Prolog中的列表分成两个其他列表,第一个包括元素前的所有内容和元素后的第二个元素。例如Prolog分隔列表
A=[1,2,3,5,7,9,0] and element=5
两个列表应
A1=[1,2,3] and A2=[7,9,0]
我不关心寻找元素只是下一步该做什么
你好,有什么办法可以将Prolog中的列表分成两个其他列表,第一个包括元素前的所有内容和元素后的第二个元素。例如Prolog分隔列表
A=[1,2,3,5,7,9,0] and element=5
两个列表应
A1=[1,2,3] and A2=[7,9,0]
我不关心寻找元素只是下一步该做什么
很容易,因为
?- Elem = 5, A = [1,2,3,5,7,9,0], append(A1, [Elem|A2], A).
编辑来解释一下...
附加/ 3这是一个关系 3个列表中。
这是一般不足以解决对适当列出任何拼接 - 当不存在圆形参数。
比较这是一个简单的统一,发生在第二个参数。那必须是以Elem开头的名单。 Prolog列表构造函数的语法是[Head|Tail]
。为了统一成功,Elem必须匹配的负责人。
这里的另一种方法,说明如何与清单递归处理:
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所表明的那样,这是一种特殊的扭曲。
@repeat谢谢,是的,我同意。我并不总是使用'dif/2'的原因是因为通常对我的gprolog安装没有'dif/2'。我尝试过一些'dif/2'的实现,它似乎没有做同样的事情。 – lurker
它的工作原理,但你可以给我一个简单的解释如何追加工程?我知道给一个list1和一个list2它将它们连接成一个列表。还有比较如何发生? – JmRag
Thx很多你的时间! – JmRag