2016-11-20 9 views
1

リストの長さを計算する関数を作成しました。以下は私のコードです。プロローグ引数が十分に具体化されていない(リスト長を計算する関数)

listLength(LIST) :- solve(LIST, LENGTH), write(LENGTH). 
solve([], _). 
solve([_|T], LENGTH) :- ADD is LENGTH + 1, solve(T, ADD). 

Iが入力

でこのコードを実行する - ?LISTLENGTH([1、2、3、4、5、6、7])。

Iは以下のようなコードの上方に変更したとき、次に、インタプリタは私にエラーメッセージsolve/2 : Arguments are not sufficiently instantiated.

を示しました。

listLength(LIST) :- LENGTH is 0, solve(LIST, LENGTH), write(LENGTH). 
solve([], _). 
solve([_|T], LENGTH) :- ADD is LENGTH + 1, solve(T, ADD). 

私は同じ入力でこのコードを実行すると、その後、必ずが書かれています。

私はLENGTHを計算したいので、listLength関数で変数を使いたいと思います。

私には何が間違っていますか? (私はswi-prologを使用していますのでご了承ください)

答えて

0

最初の間違いはベースケースにあります。 solve([], _).の代わりにsolve([], 0).と書くべきです。なぜなら、空リストの長さがわからない場合、大きなリストの場合はどのように再帰的に見つけるのでしょうか。

別の問題がでもあります:ADDを計算しようとすると、LENGTH + 1の長さがインスタンスに計算されていないときに

solve([_|T], LENGTH) :- ADD is LENGTH + 1, solve(T, ADD). 

。今すぐ問い合わせる

listLength(LIST) :- solve(LIST, LENGTH), write(LENGTH). 
solve([], 0). 
solve([_|T], LENGTH) :- solve(T, ADD), LENGTH is ADD+ 1. 

:あなたが好きな順序を変更する必要が

?- listLength([1, 2, 3, 4, 5, 6, 7]). 
7 
true. 
+0

これはLISTLENGTH 'ようなクエリ(L、10000)のための非常に遅い' – false

+0

はどのように問い合わせることができ、それは一つだけを取るので、そのパラメータリスト?? – coder

+1

あなたは正しいです!私は最後に追加だけを見た。 'solve(L、100000)を読んでみてください。それは起こらないでしょう。 – false

関連する問題