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 に答える