2012-05-19 240 views
2

我有很多等式,我正在尝试使用PROLOG来解决。但是,由于它们没有以任何有用的顺序被指定 - 即在定义之前使用了一些变量(如果不是很多变量的话),所以我得到了一个小的收获。这些都在同一个谓词中指定。 PROLOG可以处理以随机顺序指定的谓词吗?PROLOG谓词顺序

+1

这可能是轻微的有用 - http://stackoverflow.com/questions/1425009/how-do-i-need-to-order-these-prolog-rules-so-我可以运行我的程序 – ravi

回答

4

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

也就是说,理想的Prolog需要指定什么必须计算,不如何,写下方程以相当一般的逻辑形式控制解决方案,即Horn clauses

但是这种理想远不能实现,而这正是程序员扮演一个角色的地步。你应该尝试拓扑排序公式,如果你想让Prolog只应用算术/算法。

但是在这一点上,Prolog并没有比任何其他过程语言更有用。从这个意义上说,公式可以是read(这个内建的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

+0

该库不包括我需要的一些运算符 - 主要是二元运算符。 – Puppy

+0

我认为,在SWI-Prolog中,CLP(FD)库具有大部分(如果不是全部的话)算术谓词。但是如果你错过了一个,那么除了在谓词中重新排序变量之外,我看不到任何其他方法。 – CapelliC