0

我有一个 Prolog 函数,它必须接受一个列表(可能包括子列表)并返回一个所有内容都加倍的列表。

例如,

?- doubleAll([1,2,[3,4],5,[6,7,[8],9],10), L).

L = [2,4,[6,8],10,[12,14,[16],18],20).

当列表中没有子列表时,我能够将所有内容加倍,但是当包含子列表时,我遇到了一些问题。到目前为止,这是我的代码:

%L2 是 L1 中所有内容翻倍的结果。

doubleEverything([],[]).
doubleEverything([H|T], [H2|T2]) :-
   atomic(H), H2 is H*2, doubleEverything(T,T2).
doubleEverything([H|T], [H2|T2]) :-
   not(atomic(H)), H2 is H*2, doubleEverything(T,T2), doubleEverything(H,T2).

有谁知道我怎样才能做到这一点?

谢谢!

4

2 回答 2

1

像这样的东西会起作用:

double( [] , [] ) .            % doubling the empty list is...the empty list.
double( [X|Xs] , [XX|XXs] ) :- % if the head of the list is a list,
  is_list(X) ,                 % we double it, then double the tail.
  ! ,
  double(X,XX) ,
  double(Xs,XXs)
  .
double( [X|Xs] , [XX XXs] ) :- % doubling anything else is easy.
  XX is X*2 ,
  double(Xs,XXs)
  .

is_list( X     ) :- var(X) , ! , fail .
is_list( []    ) .
is_list( [_|_] ) .
于 2013-11-12T18:53:11.370 回答
1

not(atomic(H)), H2 is H*2,没有意义。由于 atomic(H) (应该是 number(H),真的)已经被处理,简单地递归:

doubleEverything([H|T], [H2|T2]) :-
   doubleEverything(H,H2), doubleEverything(T,T2).

保持简单,但请记住测试如果既没有输入数字也没有输入列表会发生什么......

于 2013-11-12T18:45:39.793 回答