あなたの任務は、あなたにPrologの独特の制御フローについて考えさせることを目的としており、実際、あなたは今や要点に達しています。ソリューションをコーディングし、説明コメントを配置しました。省略記号を入力してコードを完成させます
find_min_size(MinSize) :-
size(Hypothesis),
!, % without this cut the minimum is obtained more times...
find_min_size(Hypothesis, MinSize).
find_min_size(SoFar, MinSize) :-
% when I should keep searching?
...
% the exhaustive search come to end!
find_min_size(MinSize, MinSize).
私は、Prologでは「高次の手順」なしでO(N)のパフォーマンスを得ることができるとは思いません(findallなどを意味しますか?)。上記のコードはO(N ^ 2)で実行されます。size / 1はバインドされていない変数で再起動するため、インデックス作成は役割を果たしません。
興味深いO(N)の代替手段は、失敗駆動型ループと、@ falseがcall_nthを導入するときに非常によく説明した技術を使用することです(また、ここでフォローアップを参照してください)。これらはすべて、Prologの「不純な」領域にありますが...
ここで障害駆動ループを編集します
find_min_size(MinSize) :-
State = (_, _),
( size(V),
arg(1, State, C),
( ( var(C) ; V < C ) -> U = V ; U = C ),
nb_setarg(1, State, U),
fail
; arg(1, State, MinSize)
).