1

プロローグで述語を作成しようとしています。これは、一連の値の中で最も低い数値に達した場合に当てはまります。

例:
私は現時点でこのようなものを持っています

ベースステップ

lowest(Object, Value) :- \+ lessThan(Object, Value, NewValue).

再帰的ステップ

lowest(Object, Value) :- lessThan(Object, Value, NewValue), lowest(Object, NewValue).

Object は、複数の数値を付加できる抽象的なオブジェクトです。
lessThan は、入力値より小さいオブジェクトの値 (NewValue) を返します。

そして、NewValueは Value の入力よりも低くなるため、再帰的な各ステップで Value が減少すると想定できます。

私は解決しようとしている別の問題からこの問題を抽象化しましたが、基本的に起こっていることは、再帰関数全体から2つの出力しか期待していないということですが、代わりにlessThan(Object, Initial, X)+ 2と同じ数の出力を得ています.

この質問が明確かどうかわかりません。明確にするためにお知らせください。

Value が Object と結合された最小値である場合、Value より小さい値は他にないと仮定しているため、基本ステップは正しいと思います。

再帰をどこで終了するかもわからないため、混乱が増しています。私の推測では、オブジェクトの下位の値がない状態に達すると終了します。

4

1 に答える 1

0

このサンプルは、ドメインに合わせて value/2 の名前を変更することで機能するはずです。

value(a, 10).
value(a, 3).
value(a, 100).

lowest(Object, L) :-
    value(Object, First), !, lowest(Object, First, L).
lowest(Object, LowestSoFar, Lowest) :-
    value(Object, Try), Try < LowestSoFar, !,
    lowest(Object, Try, Lowest).
lowest(_, Lowest, Lowest).

それはもたらす

?- lowest(a,X).
X = 3.

毎回値「peek」を繰り返すため、効率的ではないことに注意してください。考えられる代替手段は、より低い値を保存し、障害駆動ループを実行することです。それ以外の場合、SWI-Prolog (および YAP) にはライブラリ ( aggregate ) があります。

?- aggregate(min(V), value(a,V), M).
M = 3.
于 2013-05-27T15:11:36.813 に答える