2

有限領域上の変数Lのリストがあります。例えば:

:- use_module(library(clpfd)).

example :-
    L = [_,_,_],
    L ins 1..10,
    ...

さらに、私は述語を持っています

pred(L,C)

Lをドメインの値に割り当てると、コストCが得られます。

問題は、CLPFD のラベル付け機能を使用して、C を最小化する L の割り当てを見つける方法です。

example :-
    L = [_,_,_],
    L ins 1..10,
    pred(L,C),
    labeling([min(C)],L),
    write(L).

うまくいきません。最初の割り当て (つまり[1,1,1] ) を選択するだけです。

4

1 に答える 1

4

ほとんどの場合、この例で呼び出されCた時点で既にインスタンス化されています。labeling/2目標は次のようになります。

labeling([min(1)], Ls)

Cそしてもちろん、ここでを実際に最小化する余地はありませんlabeling/2

これを機能させるには、制約を介して変数に決定論的に関連するpred/2ものを定式化する必要があります。例えば:CVs

sum(Vs, #=, C), labeling([min(C)], Vs)

コスト関数が有限ドメイン変数の合計である場合、意図したとおりに機能しますVs

あなたの例を次のように書き直して、私のさらなる提案を示します。

example(Ls) :-
    Ls = [_,_,_],
    Ls ins 1..10,
    pred(Ls, C),
    labeling([min(C)], Ls).

特に注意してください:

  1. write/1クエリを実行すると、Prolog トップレベルが解決策を表示するので、使用する必要はありません?- example(Ls)
  2. 英語の複数形を構築するのと同じように、リストを表す変数の名前をsで終わらせます。
于 2014-01-12T12:47:30.743 に答える