PROLOG谓词顺序

时间:2012-05-19 05:37:28

标签: prolog clpfd

我有很多方程式,我试图用PROLOG来解决。但是,我是一个次要的裁剪器,因为它们没有以任何有用的顺序指定 - 也就是说,在定义之前使用一些(如果不是很多变量)变量。这些都在同一谓词中指定。 PROLOG能否应对以随机顺序指定的谓词?

1 个答案:

答案 0 :(得分:4)

绝对...... ni(意大利语,是不是)

也就是说,理想情况下,Prolog要求您指定必须计算的,而不是如何,写下控制解决方案的等式相当一般的逻辑形式,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