2

我试图编写一个函数getNumbers(List,Result),它List是一个列表,他的元素可以是整数或列表列表,例如 -

List = [1,[1,2,[3],[4]],2,[4,5]]
List = [1,[1,1,[1],[1]],1,[1,1,[[[[[1]]]]]]]
List = [[4,[[]],2],[[1],[],[1]]]
etc..

并且输出应该是存储在其中的所有数字List,例如 -

?- getNumbers([1,[1,2,[3],[4]],2,[4,5]],R).
R = [1,2,3,4,5].
?- getNumbers([1,[1,1,[1],[1]],1,[1,1,[[[[[1]]]]]]],R).
R = [1].
?- getNumbers([],R).
R = [].
?- getNumbers([[4,[[]],2],[[1],[],[1]]],R).
R = [1,2,4].

到目前为止,我尝试了以下代码 -

getNumbers([],Result) :- Result=[],!.
getNumbers([H|Rest],Result) :- getNumbers(Rest,NewResultRest),
    ( atomic(H) ->  
      Result = [H|NewResultRest]    
    ; getNumbers(H,NewResultHead),Result = [NewResultHead|NewResultRest]    ).

但它给出了错误的结果,比如 -

 getNumbers([[2],5,7,[3,6,5]],Result).
Result = [[2], 5, 7, [3, 6, 5]].

似乎该函数不排除2[2]任何其他存储在嵌套列表中的数字。

我该如何修复我的实现?

4

1 回答 1

1

您需要附加嵌套列表:

getNumbers([],Result) :- Result=[],!.
getNumbers([H|Rest],Result) :-
    getNumbers(Rest,NewResultRest),
    (  atomic(H)
    -> Result = [H|NewResultRest]
    ;  getNumbers(H,NewResultHead),
       append(NewResultHead, NewResultRest, Result) % only this change
    ).

注意这[]是原子的:因此

?- getNumbers([[4,[[]],2],[[1],[],[1]]],R).
R = [4, [], 2, 1, [], 1].

根据您的描述,您应该使用 number/1 来测试元素的类型。改变后

?- getNumbers([[4,[[]],2],[[1],[],[1]]],R).
R = [4, 2, 1, 1].
于 2013-01-18T00:10:05.830 回答