1

リストの長さを計算する関数を作成しました。以下は私のコードです。

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

このコードを入力で実行すると

?- listLength([1, 2, 3, 4, 5, 6, 7])。

次に、インタープリターがエラーメッセージを表示しました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).

このコードを同じ入力で実行すると、常に0が書き込まれます。

LENGTH を計算したいのですが、変数を listLength 関数で使用したいと考えています。

私がどうかしましたか、まずいことでもありましたか?(私はswi-prologを使用していることに注意してください。)

4

1 に答える 1

0

最初の間違いはベースケースにあります。空のリストの長さがわからない場合、より大きなリストを再帰的に見つける方法があるため、代わりにsolve([], _).書く必要があります。solve([], 0).

には別の問題もあります。

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

ADD を計算しようとすると、LENGTH + 1 の長さがインスタンス化計算されません。次のように順序を変更する必要があります。

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.
于 2016-11-20T15:10:14.490 に答える