从给定列表中创建两个列表

时间:2012-05-12 06:50:41

标签: list prolog

我正在努力探索Prolog列表。

这是我的问题:我需要输入一个列表和两个变量,并将列表A中的奇数元素和列表B中的偶数元素存储起来。

我得到了这个,但它没有给出结果我正在寻找

store(X, [], []).
store([X,Y|Z],[X|_],[Y|_]):-store(Z,X,Y).

结果应该是:

where ?- store ([a,b,c,1,2,3], A, B).
         A = [b,1,3].
         B = [a,c,2].

1 个答案:

答案 0 :(得分:1)

从list参数构建其他列表对它进行递归访问,在适当的位置存储元素。看看您是否可以完成此代码段

odd_even([], [], []).
odd_even([N|Ns], [N|Odds], Evens) :-
   odd(N),
   !, odd_even(Ns, Odds, Evens).
% here another odd_even for evens

odd(N) :-
  ... % use rem/2 to find the integer remainder of N is 1

编辑:将元素从偶数位置移动到列表中,将奇数处的元素移动到另一个(通常称为拆分) ),访问只是将它们放在另外两个参数上:我们还需要一个终止规则,因为现在我们从列表中考虑两个在一起的参数进行拆分。

split([], [], []).
split([X], [], [X]).
split([X,Y|R], [X|Xs], [Y|Ys]) :-
   split(R,Xs,Ys).

有一种情况需要考虑:如果奇数与偶数必须从列表末尾“计算”。 然后我们应该在完成时交换(最终)列表...这将需要在递归访问中再添加2个参数,或者计算num.of.elements以预先决定将它们放在哪里...