0

プロローグ制約ソルバーを使用して特定の問題を解決しようとしていますが、スタックしています:D問題要件のより一般的なバージョンは次のようになります。

:- lib(ic).:- lib(ic).
solve( [A1*X+B1*Y=C1, A2*X+B2*Y=C2] ):-
X::[0..999],
Y::[0..999],
X #\= 0,
Y #\= 0,

A1*X+B1*Y#=C1, % line1
A2*X+B2*Y#=C2. % line2

そして、これは私が使用するクエリ/目標です:

solve( [2*X+3*Y=5, 3*X+2*Y=5] ).

そして、プログラムはXとYの値を計算します(この場合、X = 1、Y = 1が解です)。私が考えているのは、目標/クエリの引数の数が変わる可能性がある場合はどうなるかということです。この場合、私のプロローグプログラムでは、%line1と%line2でコメントされた行の代わりに動的に中断された目標を設定する必要があります。

質問は、どうすればこれらの表現を遅らせることができますか..?問題にこれらをハードコーディングしたくないので、2つの式だけがゴールを通過すると思います。

質問が明確であることを願っています。ありがとう。

4

1 に答える 1

1

私はあなたが次のようなことを意味すると思います:

:- lib(ic).

solve([]).
solve([Eq | Eqs]) :-
        term_variables(Eq, Vars),
        Vars :: [0..999],
        ( foreach(Var, Vars) do Var #\= 0 ),
        Eq  = (Lhs  = Rhs),
        Eq0 = (Lhs #= Rhs),
        call(Eq0),
        solve(Eqs).

これはECLiPSe-CLP固有のコードであることに注意してください(もちろん、再帰的なヘルパー述語に変換できるforeachループとICライブラリ)。

call(Eq0)また、書くLhs #= Rhsことも同じ効果があるはずだということにも注意してください(afaik)。しかし、の変数Lhs #= Rhsがソルバー変数である場合、そうではないようですが、少なくとも数か月前にを使用してこのような問題に遭遇しましたlib(cplex)

于 2012-02-11T13:41:50.930 に答える