【发布时间】:2012-05-19 05:37:27
【问题描述】:
我有大量的方程式,我正在尝试使用 PROLOG 来解决这些方程式。但是,我遇到了一个小问题,因为它们没有以任何有用的顺序指定——也就是说,在定义它们之前使用了一些(如果不是很多)变量。这些都在同一个谓词中指定。 PROLOG 能否处理以随机顺序指定的谓词?
【问题讨论】:
我有大量的方程式,我正在尝试使用 PROLOG 来解决这些方程式。但是,我遇到了一个小问题,因为它们没有以任何有用的顺序指定——也就是说,在定义它们之前使用了一些(如果不是很多)变量。这些都在同一个谓词中指定。 PROLOG 能否处理以随机顺序指定的谓词?
【问题讨论】:
绝对... ni(意大利语,是和不是)
也就是说,理想情况下,Prolog 要求您指定 what 必须被计算,而不是 如何,写下控制解决方案的 方程相当一般的逻辑形式,Horn clauses。
但这个理想还很遥远,而这正是我们作为程序员发挥作用的地步。你应该尝试拓扑排序公式,如果你想要 Prolog 只需应用算术/算法。
但在这一点上,Prolog 并不比任何其他过程语言更有用。它只是更容易进行这种拓扑排序,因为公式可以是read(这是一个完整的 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
【讨论】: