、あなたのPrologシステムのCLP(FD) 制約を使用することができます。
正確な詳細は、異なるPrologシステム間でわずかに異なります。詳細はシステムのマニュアルを参照してください。関連する質問はclpfdをご覧ください。あなたのケースでは
、我々は単に制約を掲載することにより起動することができます。
?- 2*X + 3*Y - 5*Z #= 77.
2*X+3*Y#=5*Z+77.
この場合
、およびすべての純粋Prologプログラム用として、システムの答えは、宣言元のクエリに同等です。これはここではあまり役に立ちません。システムは元の制約をわずかに書き直しています。あなたがして、たとえば、このさらにを制約することができます
:要求されたよう
?- 2*X + 3*Y - 5*Z #= 77,
[X,Y,Z] ins 0..sup.
X in 0..sup,
2*X+3*Y#=5*Z+77,
Y in 0..sup,
Z in 0..sup.
、この追加の目標は、負でない整数に変数を制約します。システムの答えはまだ ロットを助けていません。
label/1
を使用して、具体的なのソリューションを検索することができます。しかし、このいわゆるラベルは、すべてのドメインが 有限であることが必要、と私たちは現在、取得ので:
?- 2*X + 3*Y - 5*Z #= 77,
Vs = [X,Y,Z],
Vs ins 0..sup,
label(Vs).
ERROR: Arguments are not sufficiently instantiated
(意味で)良いニュースは、我々がしようとする時間がないということですいずれにしてもすべての可能性があります。だから私たちは、検索スペースの有限の部分に自分自身を制限することもできます。たとえば:
?- 2*X + 3*Y - 5*Z #= 77,
Vs = [X,Y,Z],
Vs ins 0..10 000 000 000 000 000 000,
label(Vs).
このクエリでは、あなたが整数ソリューションとして具体的な取得:あなたはで線形制約を推論しているので
X = 0,
Y = 29,
Z = 2,
Vs = [0, 29, 2] ;
X = 0,
Y = 34,
Z = 5,
Vs = [0, 34, 5] ;
X = 0,
Y = 39,
Z = 8,
Vs = [0, 39, 8] ;
X = 0,
Y = 44,
Z = 11,
Vs = [0, 44, 11] ;
etc.
を、CLP(Q)も価値があるかもしれ 試してみる。
http://docs.sympy.org/latest/modules/solvers/inequalities.html#inequality-docsをご覧ください。私はそれを試したことはありませんが、不等式の線形セットではうまくいくようです。数値的な解法で十分なら、 'scipy.optimize.linprog()'を見てください。 – Dietrich
解決したい方程式の例を投稿してください。 – asmeurer
@Dietrichに感謝します。私はhttp://stackoverflow.com/questions/40441532/how-to-restrict-sympy-finiteset-containing-symbol/40443339#40443339で質問に遭遇するまで、私はそれを読むのを忘れていました。私は不等式のシステム*を解くことが可能であることを理解していませんでした。 –