3

もしも

a+b+c=1
a^2+b^2+c^2=2
a^3+b^3+c^3=3

それから

a^4+b^4+c^4=?

結果が25/6であることは知っていましたが、プロローグで計算する方法は?

私はこれを試しましたが失敗しました:

[1] 5 ?- A+B+C=:=1,A**2+B**2+C**2=:=2,A**3+B**3+C**3=:=3.
ERROR: Unhandled exception: =:=/2: Arguments are not sufficiently instantiated
4

6 に答える 6

5

残念ながら、Prolog を数値ソルバーとして使用することは簡単ではありません。

?- X is 1 + 2*X.

答えは非常に明白に見えますが、まったく同じエラーが発生します。

Prolog は知識ベースを掘り下げて論理的な問題を魔法のように解決することができますが、数字については同じことができません。問題は、最も一般的な数値セットの無限性だけでなく、連続性にもあります (つまり、1.1234567890123456789 の後に来る数値は何ですか?)。

つまり、要するに、Prolog であっても、これを解決するための簡単なプログラムを作成できるとは思えません。

ただし、Prolog にいくつかの数値ソルバーを実装する試みがいくつかあります(右上のキャッシュ バージョンを参照)。

于 2010-01-04T13:51:39.290 に答える
1

Prolog の標準である ISO Prolog には、制約を方程式として表現するために必要な制約ロジック プログラミング述語が含まれていません。ただし、いくつかのプロローグ実装には独自の拡張機能があります。

SWI-Prologには、実数に対する制約ロジック プログラミング用のモジュールが含まれています。これにより、次のような制約を記述できます。

:- use_module(library(clpr)).
run(A, B, C) :- {A+B+C=1, A*A+B*B+C*C=2}.

詳細については、SWI-Prolog ドキュメントのセクション A.8 を参照してください。

SICStus Prologには、CHR (制約処理規則) と呼ばれる制約システムもあります。

GNU Prologには有限領域ソルバーがありますが、整数に対してのみ機能します。

于 2010-01-04T16:32:25.870 に答える
0

あなたの質問で:

a+b+c=1
a^2+b^2+c^2=2
a^3+b^3+c^3=3
a^4+b^4+c^4=?

それは非線形方程式のシステムです。このリンクでは、単純な (非線形) システムを解決する数学的方法について説明しています。

[編集] 1 つまたは 2 つのコマンドだけでこの方程式を Prolog で解くことはできません。これはあなたが考えるほど簡単ではありません...

しかし....あなたはいくつかの数学を行うことができます:

a+b+c=1
a^2+b^2+c^2 = ( a + b + c )^2 - 2ab - 2ac - 2bc = 2
a^3+b^3+c^3 = ( a + b + c )*(a^2 + b^2 + c^2 - ab - ab - bc ) + 3abc = 3
.
.
.

そしてそれを解決してください!!! (このシーケンスを Prolog で実装できますが、これは簡単ではありません ... )

于 2010-01-01T12:27:03.503 に答える
0

正の数のセットと正の有理数のセットを定義するために、いくつかの追加の事実を追加してみることができます。私のプロローグは少しさびていますが、次のようなものです:

number(1).
number(N) :- number(N-1).

rational(X) :- number(A), number(B), X is A/B.

次に、A、B、C に次の制約を追加します。

?- rational(A), rational(B), rational(C), A+B+C=:=1,A**2+B**2+C**2=:=2,A**3+B**3+C**3=:=3.

ただし、有理数のセットを検索する順序は、B の 2 番目の値が試行される前に、A の無限大に達すると思われます。回避策/チート (解決策についてある程度の知識があると仮定) は、より小さい数値のみを定義することです。 (たとえば)検索スペースを制限するために100。

number(1).
number(N) :- N <= 100, number(N-1).

私の構文が少しずれている場合は申し訳ありません。私は長い間 Prolog を使用していません。

于 2010-01-05T05:25:58.397 に答える
0

指数化ではなく、乗算しています。Prolog に累乗演算子が組み込まれているかどうかはわかりませんが、構築するのは次のことを超えるべきではありません。

expt(var,0) :- 1, expt(var, n) :- var*expt(var, n-1)

つまり、プロローグの構文を実際に正しく覚えている場合です (プロローグ コードを最後に書いてから 20 年近くになります)。

于 2010-01-01T10:57:48.627 に答える