2012-02-09 9 views
1

私は、プロローグ(実装 - eclipseプロローグ)で算術式を解決しようとしています。解決しようとする演算式は次のようである:プロローグで演算式の評価を行う方法は?

A * (C + B * X) + D * X = E 

Xが計算される値であり、そして他のすべて(A、B、C、D、E)は、すべての数字です。例えば

:5 *(3 + 2 * X)+ 2 * X = 39、プロローグに入力される値2

クエリ(目標)とXを割り当てるべき計算にかかります形式:

?- compute(5*(3+2*X)+2*X = 39, Result). 

「結果」と「X」の値は、結びついていなければなりません。 これを行うためにプロローグプログラムを書くにはどうすればいいですか?

ありがとうございます。

答えて

4

fdではなく、icとします。それは物事を少し簡素化します。

さらにその後、次の2つのステップでそれを行うことができ、あなただけの方程式ではなく不平等、そして唯一の変数Xを持っていると仮定し
:-lib(fd). 

compute(L=R, X) :- 
    term_variables(L, [X]), 
    L #= R. 

まず、左側から変数を抽出方程式を計算する制約を投稿します。方程式が有効であれば、変数をインスタンス化します。

icライブラリーで編集

eval(L)#=Rを使用しています。

+0

スニペットありがとう、私はテストし、それが働いた。私はプロローグでは初めてですが、Xがどのように値を計算しているのか理解できませんでした。 #=は遅延制約だと仮定します。ソリューションがどのように計算されているかについて教えてください。ありがとうございました。 – kallakafar

+1

はい、 '#=/2'は整数制約を表します。 icソルバについては、「ECLiPSeのConstraint Library Manual」のセクション3.1を参照してください。内部で起こっていることは、制約が伝播されたときに制約の伝搬アルゴリズムが開始されることです。これは、一貫性を持たせるために、制約に添付されている変数のドメインを更新します。この場合、これで解決策を得るには十分です。 Marriott/Stuckeyの "Programming with Constraints"はApt/Wallaceの "Constraint Logic Programming with Eclipse"と同様に良い教科書です – twinterer

+0

その方向性もありがとう、本当に助かります!ありがとうございました。 – kallakafar