0

リストの最小値を見つける私の実装です:

min(L, M) :- min(L, M, M).
min([], M, M).
min([Head|Tail], Acc, M) :- NewAcc is min(Acc, Head), min(Tail, NewAcc, M). 

min([1,2,3,4,5,6], 1).
true.

min([1,2,3,4,5,6], 2).
false.

min([1,2,3,4,5,6], X).
 is/2: Arguments are not sufficiently instantiated   

なぜこのエラーが発生したのか理解できません。説明していただけますか?

4

1 に答える 1

1

クエリを実行すると、値がない (インスタンス化されていない)場所min([1,2,3,4,5,6], X).にすぐにたどり着きます。式を評価できるように、式内のすべての変数をバインドする必要があります。NewAcc is min(Acc, Head)Accis/2

問題は述語節にあります:

min(L, M) :- min(L, M, M).

Mはクエリ内の変数で、の最初の句にmin([1,2,3,4,5,6], X).なります。この実装は、最小値の最初の候補を提供するという追加の引数で実際に行う必要があることにも一致しません。Accmin/3

これを行う古典的な方法の 1 つは、リストの最初の要素を最小候補として使用することです。

min([H|T], Min) :-
    min(T, H, Min).

これは失敗することも意味min([], _)しますが、空のリストには最小値がないため問題ありません。

于 2016-05-14T13:45:58.120 に答える