私はPROLOGを使って解こうとしている方程式をたくさん持っています。しかし、私はマイナーなクロッパーになりました。それらは有用な順序で指定されていません。つまり、多くの変数ではないにしても、定義される前にいくつかの変数が使用されます。これらはすべて同じ述語内で指定されます。PROLOGはランダムな順序で指定されている述語に対処できますか?
1 に答える
絶対... ni (イタリア語で、Yes and Not)
つまり、理想的には、Prolog では、どのように計算するかではなく、何を計算する必要があるかを指定し、解を制御する方程式をかなり一般的な論理形式であるホーン節で書き留める必要があります。
しかし、この理想は実現にはほど遠いものであり、これこそが、プログラマーとしての私たちが役割を果たすポイントです。Prologに算術/アルゴリズムを適用するだけの場合は、式をトポロジー的にソートするようにしてください。
しかし、現時点では、Prolog は他のどの手続き型言語よりも便利ではありません。式を読み取ることができるという意味で(これは完全な Prolog パーサーです!)、変数を簡単に識別して定量化し、項を変換して評価するなど (メタ言語の機能、プロローグ)。
CLP(FD)が使えるようになると状況が変わります。Markus Triskaが SWI-Prolog のために開発した輝かしい実装のドキュメントからの双方向階乗 (クールですね) のほんの一例です。
You can also use CLP(FD) constraints as a more declarative alternative for ordinary integer arithmetic with is/2, >/2 etc. For example:
:- use_module(library(clpfd)).
n_factorial(0, 1).
n_factorial(N, F) :- N #> 0, N1 #= N - 1, F #= N * F1, n_factorial(N1, F1).
This predicate can be used in all directions. For example:
?- n_factorial(47, F).
F = 258623241511168180642964355153611979969197632389120000000000 ;
false.
?- n_factorial(N, 1).
N = 0 ;
N = 1 ;
false.
?- n_factorial(N, 3).
false.
To make the predicate terminate if any argument is instantiated, add the (implied) constraint F #\= 0 before the recursive call. Otherwise, the query n_factorial(N, 0) is the only non-terminating case of this kind.
したがって、方程式を CLP(FD) で書くと、「方程式系」をそのまま解ける可能性が高くなります。SWI-Prolog には、CLP(FD) を解決するために使用される低レベルの詳細のための専用のデバッグ機能があります。
HTH