繁体   English   中英

Prolog-总结谓词结果

[英]Prolog - summing up predicate results

假设我有以下谓词:

func1(X,B,R)

我给它提供了一定的X和B,作为回报,它给了我5个不同的R结果。

编辑:X和B没有指定范围。 相反,X指定一个整数(例如120),而B指定所有三次(小于1的整数),其三次方小于X。func1所做的是计算R作为余数。 在这种情况下,X = 120:

B = 1, R = 119 (120-1^3)
B = 2, R = 112 (120-2^3)
B = 3, R = 93 (120-3^3)
B = 4, R = 56 (120-4^3)

由于5 ^ 3 = 125(大于120),因此不会计算B = 5,因此在此处停止。

我如何做这样的谓词:

func2(R,S)

那将接受R给出的所有结果,将它们加总并存储在S中吗?

谢谢!

首先,由于B的值完全可以从X的值派生,所以我不会在func1中将两者都作为参数。 我将介绍谓词func3/2 ,如果第二个参数可以从第一个参数func3/2 ,则该谓词为true( ,如果B可以从X func3(X, B) ,则func3(X, B)为true):

func1(X, R) :-
    func3(X, B),
    ...

如果查询func1(120, R) ,将会得到R一个或多个结果。 然后,您可以使用我在评论中指出的findall/3

func2(X, S) :-
    findall(R, func1(X, R), Rs),
    sumlist(Rs, S).

要定义func3/2 ,最干净的方法是使用CLP(FD):

:- use_module(library(clpfd)).

func3(X, B) :-
    B #>= 0,
    (X - B^3) #>= 0,
    label([B]).

这是func3的示例:

?- func3(120, B).
B = 1 ;
B = 2 ;
B = 3 ;
B = 4.


如果不能使用CLP(FD),那么执行此操作的一种不太理想的方法是在between使用between并将B的上限定义为不超过X的立方根的最大整数:

 func3(X, B) :- Limit is floor(exp(log(X) / 3)), between(1, Limit, B). 

产生与上面相同的结果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM