1

我正在努力了解 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].
4

1 回答 1

1

要从列表参数构建其他列表,请对其进行递归访问,并在适当的位置存储元素。看看你能不能完成这个片段

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([], [], []).
split([X], [], [X]).
split([X,Y|R], [X|Xs], [Y|Ys]) :-
   split(R,Xs,Ys).

there is a case to consider: if odd vs even must be 'counted' from the end of list. Then we should swap (eventually) the lists when done...That would require to add 2 more arguments to the recursive visit, or count the num.of.elements to decide beforehand where to aplce them...

于 2012-05-12T07:04:47.953 回答