PROLOG谓词顺序

PROLOG谓词顺序,prolog,clpfd,Prolog,Clpfd,我有大量的方程,我正试图用PROLOG来解决。然而,我有一个小缺点,因为它们没有以任何有用的顺序指定——也就是说,在定义它们之前使用了一些变量(如果不是很多的话)。这些都在同一谓词中指定。PROLOG能处理以随机顺序指定的谓词吗?绝对。。。我是意大利人,是的,不是 也就是说,理想情况下,Prolog要求您指定必须计算的内容,而不是如何计算,以相当一般的逻辑形式写下控制解决方案的方程 但这一理想还远未实现,而这正是我们作为程序员所扮演的角色所在。您应该尝试对公式进行拓扑排序,如果您想要Prolog

我有大量的方程,我正试图用PROLOG来解决。然而,我有一个小缺点,因为它们没有以任何有用的顺序指定——也就是说,在定义它们之前使用了一些变量(如果不是很多的话)。这些都在同一谓词中指定。PROLOG能处理以随机顺序指定的谓词吗?

绝对。。。我是意大利人,是的,不是

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

但这一理想还远未实现,而这正是我们作为程序员所扮演的角色所在。您应该尝试对公式进行拓扑排序,如果您想要Prolog,只需应用算术/算法即可

但在这一点上,Prolog并不比任何其他过程语言更有用。这样做只是为了简化拓扑排序,因为公式可以这样内置,这是一个完整的Prolog解析器!,易于识别和量化的变量、转换的术语、评估的术语以及类似的元语言功能,这是Prolog的一个优点

如果可以使用,情况会发生变化。只是一个例子,一个双向阶乘很酷,不是吗?来自为SWI Prolog开发的shining实现的文档:

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.
因此,如果你在CLPFD中写下你的方程,你就有更多的机会按原样解出你的“方程系统”。SWI Prolog专门调试用于解决CLPFD的低级细节


绝对。。。我是意大利人,是的,不是

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

但这一理想还远未实现,而这正是我们作为程序员所扮演的角色所在。您应该尝试对公式进行拓扑排序,如果您想要Prolog,只需应用算术/算法即可

但在这一点上,Prolog并不比任何其他过程语言更有用。这样做只是为了简化拓扑排序,因为公式可以这样内置,这是一个完整的Prolog解析器!,易于识别和量化的变量、转换的术语、评估的术语以及类似的元语言功能,这是Prolog的一个优点

如果可以使用,情况会发生变化。只是一个例子,一个双向阶乘很酷,不是吗?来自为SWI Prolog开发的shining实现的文档:

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.
因此,如果你在CLPFD中写下你的方程,你就有更多的机会按原样解出你的“方程系统”。SWI Prolog专门调试用于解决CLPFD的低级细节


HTH

这可能有点有用-这可能有点有用-库中不包括我需要的一些运算符-主要是二进制运算符。我认为在SWI Prolog中,CLPFD库有最多(如果不是全部的话)算术谓词。但是如果你错过了一个,那么除了对谓词中的变量重新排序之外,我看不到任何其他方法。该库不包括我需要的一些运算符——大部分是二进制运算符。我认为在SWI Prolog中,CLPFD库有最多(如果不是全部的话)算术谓词。但是如果你错过了一个,那么除了在谓词中重新排序变量之外,我看不到任何其他方法。