3

Prolog を本格的に使用してから長い時間が経ちましたが、Google で検索したり、持っているテキストでこれに関する参照を見つけることができません。これは用語の失敗かもしれないので、私がそれを虐殺した場合は謝罪します.

複数のソリューションを持つ可能性のあるプログラムがある場合:

likes(mary, joe).
likes(bob, joe).

:- likes(X, joe)

ソルバーが一致する述語をランダムな順序で実行し、したがってランダムな順序で結果を与える (または、同等に、最初のソリューションをランダムにする) 簡単な組み込みの方法はありますか?

明らかに、 randomという単語を使用して、好きなだけ洗練することができます。ソルバーの各ステップで有効な述語のセットから均一なランダム サンプリングを考えています。有効な解に対する一様ランダム サンプリングのような、より複雑なものも問題ありません。問題は一般的なものです。

おそらく、乱数ジェネレーターとメタプログラミングを使用して、これを行うプログラムを作成できます。しかし、単純なものが欠けているかどうかを確認したいと思います。

4

2 に答える 2

2

一致する句の線形選択は、Prolog アルゴリズム (またはより良いSLD 解決)の重要な部分です。そして、各一致は候補解です。Prolog自体が節の順序をランダム化することを期待することはできないと思います。

私はマットの答えについて詳しく説明します:

:- meta_predicate randomize_preds(0).

randomize_preds(C) :-
   findall(C, retract(C), Cs),
   random_permutation(Cs, Rs),
   maplist(assertz, Rs).

:- dynamic likes/2.

likes(alice, joe).
likes(bob, joe).
likes(charlie, joe).
likes(dan, joe).

テスト:

3 ?- randomize_preds(likes(_,_)),findall(X,likes(X,joe),L).
L = [bob, alice, charlie, dan].

4 ?- randomize_preds(likes(_,_)),findall(X,likes(X,joe),L).
L = [alice, bob, dan, charlie].
于 2013-09-14T09:52:57.663 に答える