1

我有大量的方程,我试图用 PROLOG 来求解。但是,我遇到了一个小问题,因为它们没有以任何有用的顺序指定 - 也就是说,在定义它们之前使用了一些(如果不是很多)变量。这些都在同一个谓词中指定。PROLOG 可以处理以随机顺序指定的谓词吗?

4

1 回答 1

3

绝对... ni(意大利语,是与否

也就是说,理想情况下,Prolog 要求您指定必须计算的内容,而不是如何计算,以相当一般的逻辑形式(Horn 子句)写下控制解的方程

但这个理想还很遥远,而这正是我们作为程序员发挥作用的地步。您应该尝试对公式进行拓扑排序,如果您想要 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) 的低级细节进行了专门的调试。

高温高压

于 2012-05-19T09:02:54.897 回答