2017-11-13 10 views
1

リスト内のすべての数値をどれだけ深くネスティングしてもカウントするプログラムが必要です。私は別のリストの中にいない場合に数字を数えることができましたが、深くネストされた要素を介して再帰的に働いているわけではありません。私はこれまでのところ、これを持っている:Prologはリスト内の数字を再帰的にカウントします

count([],0). 
count([H|Tail], N) :- 
    count(Tail, N1), 
    ( number(H) 
    ->N is N1 + 1 
    ; is_list(H) 
    -> count(H,N) 
    ; N = N1 
    ). 

私はcount([a,1,[2,b],3],N)を呼び出すことだったのであれば、出力はN=3する必要があります。しかし、私はN=2しか得ていません。誰かが私の2番目のケーステストに追加するのを助けてくれますか?深くネストされた数値要素では、ここで使用可能なすべてのソリューションが機能しません。

ありがとうございました!

+0

あなただけで開始するリストを平らにすることはできません、そのから数字を数えますか? – RoadRunner

+0

いいえ、私はflattenで解決策を試しましたが、ネストされたサブリストに対して再帰を使用することが期待されているので、 "落胆"していました。 –

答えて

3

あなたのコードはis_list(H)ブランチのため正しくありません。その場合にはあなたがN1の値を無視し、正しくない、あなたはNHのカウント数とN1の合計になりたいです。

完全なコード:

:- use_module(library(clpfd)). 

count([], 0). 
count([H|T], N) :- 
    count(T, N1), 
    ( number(H) -> 
     N #= N1 + 1 
    ; is_list(H) -> 
     N #= N1 + N2, 
     count(H, N2) 
    ; N1 = N 
    ). 
+0

ありがとうございます。あなたが言及したモジュールで動作します。しかし、私は外部モジュールなしでこれを行う必要があり、#=演算子を置き換えたいと思っていました。私はclpfdモジュールを調べ、この演算子が_is_演算子に似ていることに気付きました。しかし、_is_演算子を使用しているときに変数をインスタンス化する必要があります。これを回避する方法はありますか? –

+0

@AbhishekRauniyar '#='を 'is'に置き換え、' N#= N1 + N2'行を 'count(H、N2)'行と入れ替えます。 (明らかにモジュールを取り外す) – Fatalize

+0

ありがとう!これは多くの助けになりました! –

関連する問題